标签

标签(Label)是附加在Kubernetes对象上的一组名值对,其意图是按照对用户有意义的方式来标识Kubernetes对象,同时,又不对Kubernetes的核心逻辑产生影响。标签可以用来组织和选择一组Kubernetes对象。您可以在创建Kubernetes对象时为其添加标签,也可以在创建以后再为其添加标签。每个Kubernetes对象可以有多个标签,同一个对象的标签的 Key 必须唯一,例如:

metadata: 
labels:
key1: value1
key2: value2

为什么要使用标签

使用标签,用户可以按照自己期望的形式组织 Kubernetes 对象之间的结构,而无需对 Kubernetes 有任何修改。
应用程序的部署或者批处理程序的部署通常都是多维度的(例如,多个高可用分区、多个程序版本、多个微服务分层)。管理这些对象时,很多时候要针对某一个维度的条件做整体操作,例如,将某个版本的程序整体删除,这种情况下,如果用户能够事先规划好标签的使用,再通过标签进行选择,就会非常地便捷。
标签的例子有:

  • release: stable、release: canary
  • environment: dev、environment: qa、environment: production
  • tier: frontend、tier: backend、tier: cache
  • partition: customerA、partition: customerB
  • track: daily、track: weekly

标签选择器

与 name 和 UID 不同,标签不一定是唯一的。通常来讲,会有多个Kubernetes对象包含相同的标签。通过使用标签选择器,用户/客户端可以选择一组对象。标签选择器是 Kubernetes 中最主要的分类和筛选手段。
Kubernetes api server支持两种形式的标签选择器,基于等式的(equality-based)和基于集合的(set-based)。标签选择器可以包含多个条件,并使用逗号分隔,此时只有满足所有条件的 Kubernetes 对象才会被选中。
如果使用空的标签选择器或者不指定选择器,其含义由具体的 API 接口决定.

查询条件引用

LIST 和 WATCH 操作时,可指定标签选择器作为查询条件,以筛选指定的对象集合。两种选择方式都可以使用,但是要符合 URL 编码,例如:

  • 基于等式的选择方式:
     ?labelSelector=environment%3Dproduction,tier%3Dfrontend
  • 基于集合的选择方式:
     ?labelSelector=environment+in+%28production%2Cqa%29%2Ctier+in+%28frontend%29

两种选择方式都可以在 kubectl 的 list 和 watch 命令中使用,例如:
使用基于等式的选择方式

kubectl get pods -l environment=production,tier=frontend

使用基于集合的选择方式

kubectl get pods -l 'environment in (production),tier in (frontend)'

Kubernetes对象引用

Service 中通过 spec.selector 字段来选择一组 Pod,并将服务请求转发到选中的 Pod 上。
在 yaml 或 json 文件中,标签选择器用一个 map 来定义,且支持基于等式的选择方式,例如:

selector: 
component: redis

上面的例子中定义的标签选择器等价于 component=redis 或 component in (redis)

Job、Deployment、ReplicaSet 和 DaemonSet 同时支持基于等式的选择方式和基于集合的选择方式。例如:

selector:
matchLabels:
component: redis
matchExpressions:
- {key: tier, operator: In, values: [cache]}
- {key: environment, operator: NotIn, values: [dev]}

matchLabels 是一个 {key,value} 组成的 map。map 中的一个 {key,value} 条目相当于 matchExpressions 中的一个元素,其 key 为 map 的 key,operator 为 In, values 数组则只包含 value 一个元素。matchExpression 等价于基于集合的选择方式,支持的 operator 有 In、NotIn、Exists 和 DoesNotExist。当 operator 为 In 或 NotIn 时,values 数组不能为空。所有的选择条件都以 AND 的形式合并计算,即所有的条件都满足才可以算是匹配。

注解(annotation)

注解(annotation)可以用来向 Kubernetes 对象的 metadata.annotations 字段添加任意的信息。Kubernetes 的客户端或者自动化工具可以存取这些信息以实现其自定义的逻辑。

类似于下面的信息可以记录在注解中:

  • 声明式配置层用到的状态信息。
  • Build、release、image信息,例如 timestamp、release ID、git branch、PR number、image hash、registry address
  • 日志、监控、分析、审计系统的参数
  • 第三方工具所需要的信息,例如 name、version、build information、URL
  • 轻量级的发布工具用到的信息,例如,config、checkpoint
  • 负责人的联系方式,例如,电话号码、网址、电子信箱
  • 用户用来记录备忘信息的说明,例如,对标准镜像做了什么样的修改、维护过程中有什么特殊信息需要记住
metadata:
annotations:
deployment.kubernetes.io/revision: 7 # 由Deployment控制器添加,用于记录当前发布的修改次数
k8s.eip.work/displayName: busybox # Kuboard添加,Deployment显示在Kuboard界面上的名字
k8s.eip.work/ingress: false # Kuboard添加,根据此参数显示Deployment是否配置了Ingress
k8s.eip.work/service: none # Kuboard添加,根据此参数显示Deployment是否配置了Service

字段选择器

字段选择器(Field Selector)可以用来基于的一个或多个字段的取值来选取一组Kubernetes对象。下面有一些示例性的字段选择器:

  • metadata.name=my-service
  • metadata.namespace!=default
  • status.phase=Pending

下面的 kubectl 命令选择了所有字段 status.phase 的取值为 Running 的 Pod:

kubectl get pods --field-selector status.phase=Running

多选择器

可以指定多个字段选择器,用逗号 , 分隔。下面的 kubectl 命令查询所有的 status.phase 不等于 Running 且 spec.restartPolicy 等于 Always 的 Pod:

kubectl get pods --field-selector=status.phase!=Running,spec.restartPolicy=Always

多种对象类型

字段选择器可以跨资源类型使用。下面的 kubectl 命令查询所有的不在 default 名称空间的 StatefulSet 和 Service:

kubectl get statefulsets,services --all-namespaces --field-selector metadata.namespace!=default