跳转至

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
可以组合多个选择器,用 , 分隔,, 相当于 AND 操作符。例如:
# 选择包含 `partition` 标签(不检查标签值)且 `environment` 不是 `qa` 的对象
partition,environment notin (qa)
基于集合的选择方式是一个更宽泛的基于等式的选择方式,例如,environment=production 等价于 environment in (production);environment!=production 等价于 environment notin (production)。 基于集合的选择方式可以和基于等式的选择方式可以混合使用,例如: partition in (customerA, customerB),environment!=qa

标签操作

查看 pod 的所有标签
kubectl get pods --show-labels
查看 node 的所有标签
kubectl get node --show-labels
为指定的Pod添加或更新指定的标签
kubectl label pod <pod-name> <label-key>=<label-value>
查看标签为 app=backend 的 pod
kubectl get pods -l app=backend
为指定的Pod删除指定的标签
kubectl label pod <pod-name> <label-key>-
查询具有app=backend和environment=production标签的Pod
kubectl get pods -l app=backend,environment=production