概念
Label
Label(标签)是 Kubernetes 系统中另外一个核心概念。一个 Label 是一个 key=value 的键值对,其中 key 与 value 由用户自己指定。
Label 可以被附加到各种资源对象上,例如Node、Pod、Service、RC 等,一个资源对象可以定义任意数量的 Label,同一个 Label 也可以被添加到任意数量的资源对象上。Label 通常在资源对象定义时确定,也可以在对象创建后动态添加或者删除。
Annotation
Annotation(注解)与 Label 类似,也使用 key/value 键值对的形式进行定义。
不同的是 Label 具有严格的命名规则,它定义的是 Kubernetes 对象的元数据(Metadata),并且用于Label Selector。Annotation则是用户任意定义的附加信息,以便于外部工具查找。在很多时候,Kubernetes 的模块自身会通过 Annotation 标记资源对象的一些特殊信息。
Label Selector
通过 label selector,客户端/用户可以指定一个对象集合,通过 label selector 对对象的集合进行操作;
Label selector 有两种类型:
- equality-based:可以使用=、==、!=操作符,可以使用逗号分隔多个表达式
- set-based :可以使用 in、notin、! 操作符,另外还可以没有操作符,直接写出某个 label的 key,表示过滤有某个 key 的object 而不管该 key 的 value 是何值,!表示没有该 label 的object。
展示
查看 master node 的 Label 和 Annotation
$ kubectl describe node master
Name: master
Roles: control-plane,master
Labels: beta.kubernetes.io/arch=amd64
beta.kubernetes.io/os=linux
kubernetes.io/arch=amd64
kubernetes.io/hostname=master
kubernetes.io/os=linux
node-role.kubernetes.io/control-plane=
node-role.kubernetes.io/master=
node.kubernetes.io/exclude-from-external-load-balancers=
Annotations: flannel.alpha.coreos.com/backend-data: {"VNI":1,"VtepMAC":"a2:35:ae:6c:e7:8d"}
flannel.alpha.coreos.com/backend-type: vxlan
flannel.alpha.coreos.com/kube-subnet-manager: true
flannel.alpha.coreos.com/public-ip: 1.2.3.215
kubeadm.alpha.kubernetes.io/cri-socket: /var/run/dockershim.sock
node.alpha.kubernetes.io/ttl: 0
volumes.kubernetes.io/controller-managed-attach-detach: true
例如 Label 信息显示 hostname,平台,node 角色;
Annotations 信息显示 flannel 的 backend-data,backend-type 和 public-ip,使用的 cri-socket。
通过 label 过滤
查看角色为 master 且系统为 linux 的节点。
$ kubectl get node -l node-role.kubernetes.io/master=,kubernetes.io/os=linux
NAME STATUS ROLES AGE VERSION
master Ready control-plane,master 8d v1.22.3
应用
kube-controller 进程通过在资源对象 RC上定义的 Label Selector 来筛选要监控的 Pod 副本数量,使 Pod 副本数量始终符合预期。
kube-proxy 进程通过 Service 的 Label Selector 来选择对应的
Pod,自动建立每个 Service 到对应 Pod 的请求转发路由表,从而实现 Service 的智能负载均衡机制。
通过对某些 Node 定义特定的 Label,并且在 Pod 定义文件中使用 NodeSelector 这种标签调度策略,kube-scheduler 进程可以实现 Pod 定向调度的特性。