标签和选择器(Label和 Selector)

介绍

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

标签(Labels):

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

选择器(Selectors):

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

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

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

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

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

yaml 复制代码
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。

具体应用

添加标签

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

查看刚刚添加的标签

bash 复制代码
kubectl get nodes node02 --show-labels 
bash 复制代码
[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

删除标签

bash 复制代码
kubectl label node node02 disk-

修改标签

bash 复制代码
kubectl label node node02 disk=name --overwrite

根据标签匹配Pod

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

yaml 复制代码
environment = production
tier != frontend

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

bash 复制代码
[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

bash 复制代码
[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

bash 复制代码
[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

bash 复制代码
[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

bash 复制代码
[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 的键 ,不管值是多少

bash 复制代码
[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 的键 ,不管值是多少

bash 复制代码
[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"

bash 复制代码
[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
相关推荐
鱼听禅7 分钟前
Ubuntu安装YOLOv8进行菌落识别训练
linux·python·yolo·ubuntu
deli0078 分钟前
Redis 缓存穿透、击穿、雪崩:9 组流量实测数据库怎么被打穿
前端
江华森13 分钟前
5Mbps 小水管也能扛:K3s 上 k6 压测 + HPA 弹性伸缩实测
前端
测试界的小码农14 分钟前
【Linux 命令实战(04):文件内容查看,掌握 cat、less、head、tail】
linux·服务器·less
shuangyueliao21 分钟前
103 个小游戏的商店素材,我一张图都没手动做:截图 / 封面 / 打包 / 提审全自动
前端
ZhengEnCi22 分钟前
前端项目为什么需要一份统一的 theme.css:用 CSS 变量管住全局样式与主题切换
前端·css·前端工程化
wordbaby30 分钟前
一次微信小程序 `web-view` 跳转原生页回跳后 H5 白屏的排查与修复(Hash 路由污染)
前端
用户7218804383531 分钟前
密码骰子:结合AIUI在眼镜上生成一串16位密码
前端
江华森1 小时前
全链路可观测落地记:kube-prometheus-stack 在 K3s 上的 8 个坑与一整套修复脚本
前端
deli0071 小时前
27 寸 4K 开 125% 为什么发虚?PPI 和缩放一次算清
前端