Labels是附到对象(如pods)上的键值对。Labels目的在于明确标识对象的属性,这些属性与用户相关并富有意义,但Labels对于核心系统来说并不具备语义。Labels可以用来组织和选择对象的子集。Labels可以在对象创建时附上,也可以在任意时间添加和修改。每个对象有一系列的键值对标签定义。给定一个对象,它的每个键(Key)都必须是唯一的。
"metadata": {
"labels": {
"key1" : "value1",
"key2" : "value2"
}
}
Labels允许高效的查询和观察,并且对用户有理想的UIs和CLIs。非识别的信息需要使用注解(annotations)记录
动机(Motivation)
Labels让用户用松散结合的方式映射他们的组织架构到系统对象上,而不需要使用者存储这些映射。
service(服务)的deployments(部署)和批处理管道经常是多维实体(如:多个分区或部署、多个发布轨道、多个层次、每个层次多个微服务)。管理经常需要跨领域操作,这会破坏严格封层表现形式的封装,特别是由基础设施而不是用户决定的严格层次结构。
labels的例子:
"release" : "stable"
,"release" : "canary"
"environment" : "dev"
,"environment" : "qa"
,"environment" : "production"
"tier" : "frontend"
,"tier" : "backend"
,"tier" : "cache"
"partition" : "customerA"
,"partition" : "customerB"
"track" : "daily"
,"track" : "weekly"
这只是常用标签的例子;你可以自由开发自己的协定。请牢记在一个给定对象里的标签的键(Key)必须是唯一的。
语法(Syntax)和字符集(character set)
Labels 是键值对。合法的建由两个部分组成:可选前缀和名称,由斜杠 (/) 分隔。名称部分是必须的,由少于63个字符组成,开头和结尾为数字或字母 ([a-z0-9A-Z]
),中间包含横杠(-)、下划线(_)、点(.)和数字或字母。前缀是可选的。如果有规定,前缀必须是一个DNS的子域:一个系列的DNS labels由点(.)分隔,不长于253个字符,后跟一个斜杠(/)。
如果前缀被忽略,label的键被假定是用户私有的。向终端用户对象添加标签的自动化系统组件(components)(如kube-scheduler
, kube-controller-manager
, kube-apiserver
, kubectl
或其他第三方自动化
)必须指定一个标签。
kubernetes.io/ 和 k8s.io/ 前缀为Kubernetes核心组件预留。
合法的label值必须由少于63个字符组成,且必须是空的或者开头和结尾为数字或字母 ([a-z0-9A-Z]
),中间包含横杠(-)、下划线(_)、点(.)和数字或字母。
Label 选择器(selectors)
与名称和UID(names and UIDs)不同,label不需要是唯一的。通常,我们期望许多对象携带相同的label(s)。
通过label选择器,客户/用户可以指定一系列的对象。label选择器是Kubernetes核心分组原语。
API目前提供两种选择器:基于相等(equality-based) 和基于分组(set-based)。一个label选择器可以由多个由逗号分隔的要求组成。在多要求的情况下,所有要求都必须满足,逗号更像是逻辑与(&&)操作符。
空选择器或非指定选择器的语义取决于环境,使用选择器的API类型需要记录它们的有效性和含义。
注意:在一些API类型中,如ReplicaSets,两个实例的label选择器不能在一个名称空间中有重叠,否则控制器(controller)会将其视为冲突的指令并且不能确定应该运行多少副本。
基于相等要求
基于相等或不相等的要求允许通过label的键和值过滤。匹配的对象必须符合所有的指定标签限制,它们可以拥有额外的标签。支持三种操作符(=)、
(==)、
(!=)。前两个代表
相等(且是同义的),后者代表不相等。例如:
environment = production
tier != frontend
上式选择了键为environment 且值为production的所有资源。下式选择了键为tier 且值不为frontend的所有资源,和没有键tier的所有资源。
相等标签要求的一种使用场景是为Pod指定node选择 标准。例如,下例Pod通过标签“accelerator=nvidia-tesla-p100”选择node。
apiVersion: v1
kind: Pod
metadata:
name: cuda-test
spec:
containers:
- name: cuda-test
image: "k8s.gcr.io/cuda-vector-add:v0.1"
resources:
limits:
nvidia.com/gpu: 1
nodeSelector:
accelerator: nvidia-tesla-p100
基于集合要求
基于集合要求允许通过一个集合的值来过滤键。支持三种操作符(in)、
(notin)、
(exists)。例如:
environment in (production, qa)
tier notin (frontend, backend)
partition
!partition
第一个例子选择键为 environment 且值为 production 或 qa 的所有资源。第一个例子选择键为 tier 且值不为 frontend 和 backend 的所有资源,还有不包含键为 tier 的label的资源。第三个例子选择包含键为 partition 的label的所有资源,不做值检查。第四个例子选择不包含键为 partition 的label的所有资源,不做值检查。类似的,逗号作为与(&&)操作符。所以过滤包含键 partition (不做值检查)且 environment 值不为 qa 的资源可以使用 partition,environment notin (qa) 实现。基于集合的选择器和基于相等的选择器是通用的,就像 environment=production 和 environment in (production) 等同,!=
和 notin 类似。
基于集合的选择器和基于相等的选择器可以混用。如:partition in (customerA, customerB),environment!=qa
API
LIST 和 WATCH 过滤
LIST 和 WATCH 操作可以使用问号参数指定标签选择器过滤出一系列的对象返回。两种选择器都是支持的(表现在这里的语句会在URL中出现):
- 基于相等要求:?labelSelector=environment%3Dproduction,tier%3Dfrontend
- 基于集合要求:?labelSelector=environment+in+%28production%2Cqa%29%2Ctier+in+%28frontend%29
两种标签选择器都可以通过REST客户端用来列举和查看资源.例如目标 apiserver 包含 kubectl 且使用相等要求可以这么写:
kubectl get pods -l environment=production,tier=frontend
或使用基于集合要求:
kubectl get pods -l 'environment in (production),tier in (frontend)'
如上所述,基于集合要求更有表现力。例如,可以通过值来实现or操作符:
kubectl get pods -l 'environment in (production, qa)'
或通过exists 操作符实现否定匹配:
kubectl get pods -l 'environment,environment notin (frontend)'
在API对象中设置引用
一些Kubernetes对象,比如 services
和 replicationcontrollers
, 也可以通过label选择器来指定一些其他资源,比如 pods.
Service 和 ReplicationController
service指定的pods集合是通过一个label选择器来定义的。类似的,ReplicationController中管理的pods集合也是通过一个label选择器来定义的。这两种对象的label选择器在 json
或 yaml 文件中使用map定义,并且只支持相等要求。
"selector": {
"component" : "redis",
}
或
selector:
component: redis
这两个选择器(使用 json 或 yaml 格式)和 component=redis
或 component in (redis) 含义相同
支持基于集合要求的资源
更新的资源,比如Job
, Deployment
, Replica Set
, 和 Daemon Set,
也支持
基于集合要求。
selector:
matchLabels:
component: redis
matchExpressions:
- {key: tier, operator: In, values: [cache]}
- {key: environment, operator: NotIn, values: [dev]}
matchLabels是一个键值对({key,value})map。 在matchLabels map中的一个键值对和matchExpressions中的一个元素等价,该matchExpressions的key字段是键,operator是'In', values数组只包含值。matchExpressions是一份pod选择器要求。合法的操作符有 In, NotIn, Exists, 和 DoesNotExis。In 和 NotIn的值集合必须非空。matchLabels和matchExpressions的所有要求是与条件----它们必须全部被满足以匹配。
选择nodes集合
存疑:使用label选择的一个用例,是限制一个pod可以被安排进入的node集合。查看node选择(node selection)来获取更多信息。