介绍

在 K8S 中,标签(Labels)和选择器(Selectors)是两个不同但相关的概念,它们用于管理和操作资源,但具有不同的功能和作用。

标签(Labels):

  • 标签是键值对,附加到 Kubernetes 资源(如 Pod、Service、Deployment 等)的元数据。
    标签提供了一种灵活的方式来对资源进行分类、分组和识别,例如,您可以使用标签来指定资源所属的环境、应用程序、版本号等。
    标签是资源的一部分,它们可以随时添加、修改或删除,而不影响资源的运行状态。

选择器(Selectors):

  • 选择器是一种用于根据标签选择资源的机制。
    选择器定义了一组标签匹配规则,它们指定了资源的哪些标签必须匹配才能被选中。
    选择器可以根据标签的相等性、不相等性、存在性等进行匹配。
    选择器通常用于创建服务发现规则、路由流量、设置自动缩放策略等,以便根据特定标签的资源进行操作。

因此,区别在于标签是资源的元数据,而选择器是用于根据标签选择资源的规则。标签提供了一种灵活的方式来对资源进行分类和标识,而选择器允许根据这些标签对资源进行过滤和选择,以执行特定的操作。

例如,以下是一个标签选择器的示例,它选择了具有指定标签的所有 Pod:

apiVersion: v1
kind: Pod
metadata:
  name: nginx-pod
  labels: # 定义的下面两个标签 
    app: nginx
    environment: production
spec:
  containers:
  - name: nginx
    image: nginx:latest

选择器用于匹配这样的标签,例如:

apiVersion: v1
kind: Service
metadata:
  name: nginx-service
spec:
  selector: #  Service 回选择这两个标签的pod
    app: nginx
    environment: production
  ports:
    - port: 80
      targetPort: 80

Service 选择了所有具有标签 app: nginx 和 environment: production 的 Pod。

具体应用

添加标签

# 可以给所有的资源对象添加标签 更换资源对象即可
kubectl label node node02 disk=ssd

查看刚刚添加的标签

kubectl get nodes node02 --show-labels 
[root@master01 ~]# kubectl get nodes node02 --show-labels 
NAME     STATUS   ROLES   AGE   VERSION    LABELS
node02   Ready    node    23d   v1.26.14   beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=node02,kubernetes.io/os=linux,kubernetes.io/role=node,node.kubernetes.io/node=,disk=ssd

删除标签

kubectl label node node02 disk-

修改标签

kubectl label node node02 disk=name --overwrite

根据标签匹配Pod

基于等值或基于不等值的需求允许按标签键和值进行过滤。 匹配对象必须满足所有指定的标签约束,尽管它们也可能具有其他标签。 可接受的运算符有 =、== 和 != 三种。 前两个表示相等(并且是同义词),而后者表示不相等。例如:

environment = production
tier != frontend

举例:
按照下面查询出来的举例

[root@master01 ~]# kubectl get po -n kube-system --show-labels 
NAME                                       READY   STATUS    RESTARTS   AGE   LABELS
calico-kube-controllers-54cbfb689f-stf9f   1/1     Running   0          19d   k8s-app=calico-kube-controllers,pod-template-hash=54cbfb689f
calico-node-2v2pk                          1/1     Running   0          19d   controller-revision-hash=66bb6bf796,k8s-app=calico-node,pod-template-generation=2
calico-node-djvsw                          1/1     Running   0          19d   controller-revision-hash=66bb6bf796,k8s-app=calico-node,pod-template-generation=2
calico-node-gfjw9                          1/1     Running   0          19d   controller-revision-hash=66bb6bf796,k8s-app=calico-node,pod-template-generation=2
calico-node-hhsnx                          1/1     Running   0          19d   controller-revision-hash=66bb6bf796,k8s-app=calico-node,pod-template-generation=2
calico-node-z9mrv                          1/1     Running   0          19d   controller-revision-hash=66bb6bf796,k8s-app=calico-node,pod-template-generation=2
coredns-65599ffb58-jx78h                   1/1     Running   0          19d   k8s-app=kube-dns,pod-template-hash=65599ffb58
metrics-server-6b7745d9f-dfk7f             1/1     Running   0          19d   k8s-app=metrics-server,pod-template-hash=6b7745d9f

比如查询 lable 是这个的 “k8s-app=kube-dns” pod

[root@master01 ~]# kubectl get po -n kube-system -l k8s-app=kube-dns
NAME                       READY   STATUS    RESTARTS   AGE
coredns-65599ffb58-jx78h   1/1     Running   0          19d

查询 lable 不是”k8s-app=kube-dns“ 这个的pod

[root@master01 ~]# kubectl get po -n kube-system -l k8s-app!=kube-dns
NAME                                       READY   STATUS    RESTARTS   AGE
calico-kube-controllers-54cbfb689f-stf9f   1/1     Running   0          19d
calico-node-2v2pk                          1/1     Running   0          19d
calico-node-djvsw                          1/1     Running   0          19d
calico-node-gfjw9                          1/1     Running   0          19d
calico-node-hhsnx                          1/1     Running   0          19d
calico-node-z9mrv                          1/1     Running   0          19d
metrics-server-6b7745d9f-dfk7f             1/1     Running   0          19d

多个查询条件

查询 lable 中包含 k8s-app 等于 kube-dns 或者 metrics-server 的所有Pod

[root@master01 ~]# kubectl get po -n kube-system --show-labels -l 'k8s-app in (kube-dns,metrics-server)'
NAME                             READY   STATUS    RESTARTS   AGE   LABELS
coredns-65599ffb58-jx78h         1/1     Running   0          19d   k8s-app=kube-dns,pod-template-hash=65599ffb58
metrics-server-6b7745d9f-dfk7f   1/1     Running   0          19d   k8s-app=metrics-server,pod-template-hash=6b7745d9f

查询 lable 中不包含 k8s-app 等于 kube-dns 或者 metrics-server 的所有Pod

[root@master01 ~]# kubectl get po -n kube-system -l 'k8s-app notin (kube-dns,metrics-server)'
NAME                                       READY   STATUS    RESTARTS   AGE   LABELS
calico-kube-controllers-54cbfb689f-stf9f   1/1     Running   0          19d   k8s-app=calico-kube-controllers,pod-template-hash=54cbfb689f
calico-node-2v2pk                          1/1     Running   0          19d   controller-revision-hash=66bb6bf796,k8s-app=calico-node,pod-template-generation=2
calico-node-djvsw                          1/1     Running   0          19d   controller-revision-hash=66bb6bf796,k8s-app=calico-node,pod-template-generation=2
calico-node-gfjw9                          1/1     Running   0          19d   controller-revision-hash=66bb6bf796,k8s-app=calico-node,pod-template-generation=2
calico-node-hhsnx                          1/1     Running   0          19d   controller-revision-hash=66bb6bf796,k8s-app=calico-node,pod-template-generation=2
calico-node-z9mrv                          1/1     Running   0          19d   controller-revision-hash=66bb6bf796,k8s-app=calico-node,pod-template-generation=2

查询所有包含 controller-revision-hash 的键 ,不管值是多少

[root@master01 ~]# kubectl get po -n kube-system -l controller-revision-hash
NAME                READY   STATUS    RESTARTS   AGE
calico-node-2v2pk   1/1     Running   0          19d
calico-node-djvsw   1/1     Running   0          19d
calico-node-gfjw9   1/1     Running   0          19d
calico-node-hhsnx   1/1     Running   0          19d
calico-node-z9mrv   1/1     Running   0          19d

查询所有不包含 controller-revision-hash 的键 ,不管值是多少

[root@master01 ~]# kubectl get po -n kube-system -l '!controller-revision-hash'
NAME                                       READY   STATUS    RESTARTS   AGE
calico-kube-controllers-54cbfb689f-stf9f   1/1     Running   0          19d
coredns-65599ffb58-jx78h                   1/1     Running   0          19d
metrics-server-6b7745d9f-dfk7f             1/1     Running   0          19d

同时满足 lable “k8s-app=metrics-server,pod-template-hash=6b7745d9f”

[root@master01 ~]# kubectl get pods -n kube-system -l k8s-app=metrics-server,pod-template-hash=6b7745d9f
NAME                             READY   STATUS    RESTARTS   AGE
metrics-server-6b7745d9f-dfk7f   1/1     Running   0          19d
Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐