labels 与 Label Selector ¶
Label (标签) ¶
Note
使用Label可以给对象创建一组或多组标签,Service,ReplicationController ReplicaSet,Deployment等组件则通过Label Selector来定位需要管理的对象,Label和Label Selector共同构成了Kubernetes系统中最核心的应用模型,使得对象能够精细分组,同时实现了集群的高可用性。
metadata:
labels:
key1: value1
release: "stable" # 版本标签
release: "canary" # 版本标签
environment: "dev" # 环境标签
environment: "production" # 环境标签
tier: "frontend" # 架构标签
tier: "backend" # 架构标签
-
附加到 Kubernetes 对象(比如 Pod)上的键值对。是一组绑定到K8s资源对象上的key/value对。同一个对象的labels属性的key必须唯一。label可以附加到各种资源对象上,如Node,Pod,Service,RC等。
-
通过给指定的资源对象捆绑一个或多个不用的label来实现多维度的资源分组管理功能,以便于灵活,方便地进行资源分配,调度,配置,部署等管理工作。
为什么要使用标签? ¶
使用标签,用户可以按照自己期望的形式组织 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 上面只是一些使用比较普遍的标签,您可以根据您自己的情况建立合适的使用标签的约定。
Label Selector (标签选择器) ¶
带有Label的对象创建好之后,我们就可以通过Label Selector来引用这些对象。
API目前支持两种选择器: ¶
基于等式的Selector。 ¶
Equality- 或者 inequality-based 选择器可以使用标签的名和值来执行过滤选择。只有匹配所有条件的对象才被选中(被选中的对象可以包含未指定的标签)。可以使用三种操作符 =、==、!=。前两个操作符含义是一样的,都代表相等,后一个操作符代表不相等。例如:
# 选择了标签名为 `environment` 且 标签值为 `production` 的Kubernetes对象
environment = production
# 选择了标签名为 `tier` 且标签值不等于 `frontend` 的对象,以及不包含标签 `tier` 的对象
tier != frontend
也可以使用逗号分隔的两个等式 environment=production,tier!=frontend,此时将选中所有 environment 为 production 且 tier 不为 frontend 的对象。
以 Pod 的节点选择器 为例,下面的 Pod 可以被调度到包含标签 accelerator=node1 的节点上:
apiVersion: v1
kind: Pod
metadata:
name: test
spec:
containers:
- name: test
image: "nginx"
nodeSelector:
accelerator: node1
基于集合的Selector。 ¶
Set-based 标签选择器可以根据标签名的一组值进行筛选。支持的操作符有三种:in、notin、exists。例如:
# 选择所有的包含 `environment` 标签且值为 `production` 或 `qa` 的对象
environment in (production, qa)
# 选择所有的 `tier` 标签不为 `frontend` 和 `backend`的对象,或不含 `tier` 标签的对象
tier notin (frontend, backend)
# 选择所有包含 `partition` 标签的对象
partition
# 选择所有不包含 `partition` 标签的对象
!partition
# 选择包含 `partition` 标签(不检查标签值)且 `environment` 不是 `qa` 的对象
partition,environment notin (qa)
标签操作
kubectl get pods --show-labels
kubectl get node --show-labels
kubectl label pod <pod-name> <label-key>=<label-value>
kubectl get pods -l app=backend
kubectl label pod <pod-name> <label-key>-
kubectl get pods -l app=backend,environment=production