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

1334

被折叠的 条评论
为什么被折叠?



