标签和标签选择器、label selector

本文详细介绍了Kubernetes中标签和标签选择器的概念及其使用方法。标签用于管理和筛选资源对象,而标签选择器则允许选择具有特定标签的Pod。通过创建带有标签的Pod,查看和修改标签,以及使用标签选择器筛选和操作资源,展示了标签在资源管理和自动化操作中的重要作用。此外,还通过ReplicationController展示了标签和标签选择器在控制器中的应用,强调了它们在保持Pod数量一致性和资源关联性上的关键作用。

前言

环境:centos7.9 docker-ce-20.10.9 kubernetes-version v1.22.6
本篇讲解在k8s中,什么是标签和标签选择器,以及如何使用它们。

什么是标签、什么是标签选择器

标签,标签是键值对类型,它可以附加到任何资源对象上,主要用于管理对象,查询和筛选。标签常被用于标签选择器的匹配度检查,从而完成资源筛选;一个资源可以用于一个或多个标签。
标签选择器,标签要与标签选择器结合在一起,标签选择器允许我们选择标记有特定标签的pod子集,并对这些pod执行操作。

通俗易懂的说,标签和标签选择器就好比,一个班的学生考了英语考试,成绩有不及格,良好,优秀,现在筛选出优秀的同学颁发奖状。(以上学生就类似于pod,标签类似于不及格、良好、优秀,筛选优秀同学就相当于标签选择器)

创建资源并定义标签

使用yaml文件创建一个pod资源,并添加标签,如下所示:

cat > my-nginx.yaml <<'EOF'
apiVersion: v1
kind: Pod
metadata:
  name: my-nginx
  namespace: default
  labels:			#在这里定义标签,可以定义多个标签,现在这里就定义了1个app=nginx的标签
    app: nginx
spec:
  containers:
  - image: nginx:1.7.9
    name: nginx-container
EOF

查看资源对象拥有的标签

使用kubectl get命令时,默认不会列出标签,需要加上 --show-labels 选项列出标签,如下所示:

[root@master ~]# kubectl  get pod my-nginx -n default --show-labels 	#加上--show-labels选项列出全部标签
NAME       READY   STATUS    RESTARTS   AGE     LABELS
my-nginx   1/1     Running   0          7m37s   app=nginx

# 如果你只想显示某个标签而不是全部,可以使用 -L 参数接标签的键来将标签显示在列中,如下:
[root@master ~]# kubectl get pod my-nginx -n default -L app,status		# -L + 标签键1,标签键2...,将标签显示在列中
NAME       READY   STATUS    RESTARTS   AGE   APP     STATUS
my-nginx   1/1     Running   0          26m   nginx   true
[root@master ~]# 

为资源对象添加标签

可以直接在命令行为已存在的资源添加标签(当然也可以修改yaml文件来添加标签)如下所示:

# kubectl label 命令为资源添加标签

#为my-nginx pod 添加一个status=true标签
[root@master ~]# kubectl label pods my-nginx status=true
#查看标签,标签已经添加成功
kubectl get pod my-nginx -n default --show-labels

#标签可以附加在k8s任何资源对象上,所以下面为节点定义标签

#为节点添加标签
kubectl label nodes node1 name=node1
#查看节点的标签,已经添加成功
kubectl get nodes node1 --show-labels

修改标签值

#这里说的所谓修改标签值,指的是修改已存在的标签的值,如果想要修改标签的键,何不直接删除标签再重新创建呢
#修改资源的标签很简单,直接在命令行修改,使用--overwrite参数覆盖掉标签值即可(或者在yaml修改也可以)
#修改已存在的标签,需要使用--overwrite参数表示覆盖
kubectl label pods my-nginx status=false --overwrite

删除标签

删除标签的语法,其实就是在标签键后面加-号,就表示删除标签,如下:

#在标签键后面加-号
kubectl label pods my-nginx status-		
#查看status=false标签,已经被删除了
kubectl get pod my-nginx --show-labels

使用标签选择器筛选资源

在资源上附加标签,其最终的目的就是为了筛选资源,下面使用标签选择器筛选资源:

#先查看pod具有的标签
kubectl  get pods --show-labels
#使用标签选择器筛选具有标签app=nginx的资源
kubectl  get pods -l app=nginx
#查找标签的键是app的标签(标签值是app的不会匹配)
kubectl  get pods -l app
#查找非app开头的标签的资源,需要冒号引起了
kubectl  get pods -l '!app'
#查找同时具有app=nginx,status=true标签的资源
kubectl  get pods -l app=nginx,status=true
#查找标签键为app,其值不等于nginx的资源
kubectl  get pods -l app!=nginx

使用标签选择器来筛选资源并删除资源

#漂亮吧,这就是标签和标签选择器的强大之处
kubectl delete pod -l app=nginx-old

标签选择器还有一个非常强大的功能在于,定义pod控制器时,控制器是如何得知要管理哪些pod的呢,根本原理就是通过标签和标签选择器来进行关联。
下面来显示创建一个简单控制器演示标签和标签选择器

创建rc控制器

创建一个ReplicationController来演示是如何定义标签和标签选择器的:

cat >> rc_nginx.yaml <<'EOF'
apiVersion: v1
kind: ReplicationController		#创建一个ReplicationController控制器
metadata:
  name: rc-nginx				#控制器名称
  namespace: default			#命名空间
spec:
  replicas: 3					#表示pod副本数
  selector:						#定义标签选择器,用于说明rc控制管理的是带有哪些标签的pod
     app: nginx					#标签app=nginx
  template:						#定义pod模板,pod模板就是用来创建pod
     metadata:
       labels:					#pod标签,注意:pod标签必须与上面标签选择器定义的标签相同,否者rc就不知道如何关联pod
         app: nginx
     spec:
         containers:
         - image: nginx:1.7.9
           name: nginx-container
           ports:
           - containerPort: 80
EOF

查看rc和pod

[root@master ~]# kubectl  get rc,pod -n default  --show-labels 
NAME                             DESIRED   CURRENT   READY   AGE     LABELS
replicationcontroller/rc-nginx   3         3         3       7m33s   app=nginx

NAME                 READY   STATUS    RESTARTS   AGE     LABELS
pod/rc-nginx-4drqr   1/1     Running   0          7m33s   app=nginx
pod/rc-nginx-cn8wv   1/1     Running   0          7m33s   app=nginx
pod/rc-nginx-qwk9j   1/1     Running   0          7m33s   app=nginx

#做个小实验
[root@master ~]# kubectl  label pod rc-nginx-qwk9j app=nginx-old --overwrite 	#修改其中一个pod的标签
pod/rc-nginx-qwk9j labeled
[root@master ~]# kubectl  get rc,pod -n default  --show-labels 					#这是我们发现rc又重启启动了一个pod
NAME                             DESIRED   CURRENT   READY   AGE     LABELS
replicationcontroller/rc-nginx   3         3         3       9m24s   app=nginx

NAME                 READY   STATUS    RESTARTS   AGE     LABELS
pod/rc-nginx-4drqr   1/1     Running   0          9m24s   app=nginx
pod/rc-nginx-cn8wv   1/1     Running   0          9m24s   app=nginx
pod/rc-nginx-qwk9j   1/1     Running   0          9m24s   app=nginx-old
pod/rc-nginx-zkb4l   1/1     Running   0          3s      app=nginx				#这就是rc重新创建的pod
[root@master ~]# 

#以上说明,rc是通过标签和标签选择器来与pod进行关联的,如果改变了某个pod的标签,那么该pod将会脱离rc的控制,然后rc发现与自己关联的pod个数少了,就会立即重新创建一个pod来补充,这也说明rc会实时保证pod个数与你定义的副本数相同。

总结

1、标签是键值对,标签可以附加在任何资源对象上,一个资源可以有一个或多个标签,用以完成不同维度的筛选;
2、标签一般与标签选择器两者配合使用完成资源的刷选,查询;
3、使用yaml文件创建资源时定义标签:
metadata:
  name: my-nginx
  namespace: default
  labels:				#在这里定义标签,可以定义多个标签,现在这里就定义了1个app=nginx的标签
    app: nginx
spec:

4、查看资源拥有的标签
#加上--show-labels选项列出全部标签
kubectl  get pod my-nginx -n default --show-labels 

5、如果你只想显示某个标签而不是全部,可以使用 -L 参数接标签的键来将标签显示在列中,如下:
# -L + 标签键1,标签键2...,将标签显示在列中
kubectl get pod my-nginx -n default -L app,status

6、命令行为资源添加标签(当然,你也可以通过修改yaml文件添加标签)
#为my-nginx pod 添加一个status=true标签
kubectl label pods my-nginx status=true

7、修改已存在标签值,使用--overwrite参数表覆盖
kubectl label pods my-nginx status=false --overwrite

8、删除标签,在标签键后面加-号,就表示删除标签
kubectl label pods my-nginx status-

9、pod控制器中使用标签和标签选择器
cat >> rc_nginx.yaml <<'EOF'
apiVersion: v1
kind: ReplicationController			#创建一个ReplicationController控制器
metadata:
  name: rc-nginx					#控制器名称
  namespace: default				#命名空间
spec:
  replicas: 3						#表示pod副本数
  selector:							#定义标签选择器,用于说明rc控制管理的是带有哪些标签的pod
     app: nginx						#标签app=nginx
  template:							#定义pod模板,pod模板就是用来创建pod
     metadata:
       labels:						#pod标签,注意:pod标签必须与上面标签选择器定义的标签相同,否者rc就不知道如何关联pod
         app: nginx
     spec:
         containers:
         - image: nginx:1.7.9
           name: nginx-container
           ports:
           - containerPort: 80
EOF

ps:Label通常在资源对象定义,即编写yaml文件时定义标签,当然也可以在对象创建后,动态添加或者删除,但这样动态的添加或删除并不会影响yaml文件,所以还是建议直接编辑yaml文件之后再应用yaml文件比较好,即使使用kubectl edit 来编辑资源对象成功之后,也并不会影响yaml文件,yaml文件是静态的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值