文档:https://kubernetes.io/zh/docs/concepts/overview/working-with-objects/labels/
1. Label
- Label是一个键值对,可以附加在任何对象上,比如Node,Pod,Service,RC等。Label和资源对象是多对多的关系,即一个Label可以被添加到多个对象上,一个对象也可以定义多个Label。
- Label的作用主要用来实现精细的、多维度的资源分组管理,以便进行资源分配,调度,配置,部署等工作。
- Label通俗理解就是“标签”,通过标签来过滤筛选指定的对象,进行具体的操作。k8s通过Label Selector(标签选择器)来筛选指定Label的资源对象,类似SQL语句中的条件查询(WHERE语句)。
- Label Selector有基于等式和基于集合的两种表达方式,可以多个条件进行组合使用。
- 基于等式:name=redis-slave(匹配name=redis-slave的资源对象);env!=product(匹配所有不具有标签env=product的资源对象)
- 基于集合:name in (redis-slave,redis-master);name not in (php-frontend)(匹配所有不具有标签name=php-frontend的资源对象)
使用场景
- kube-controller进程通过资源对象RC上定义的Label Selector来筛选要监控的Pod副本数,从而实现副本数始终保持预期数目。
- kube-proxy进程通过Service的Label Selector来选择对应Pod,自动建立每个Service到对应Pod的请求转发路由表,从而实现Service的智能负载均衡机制。
- kube-scheduler实现Pod定向调度:对Node定义特定的Label,并且在Pod定义文件中使用NodeSelector标签调度策略。
1.1 表达式
标签选择器使用:release==alpha
,表示过滤有release=alpha
这个标签的资源,才符合条件。
KEY in (VALUE1,VALUE2,…)
:指定的键名的值存在于给定的列表中即满足条件;KEY notin (VALUE1,VALUE2,…)
:指定的键名的值不存在于给定列表中即满足条件;KEY
:所有存在此键名标签的资源;!KEY
:所有不存在此键名标签的资源。
1.2 标签命名规范
1.2.1 标签名
- 标签名部分是必须的。
- 不能多余 63 个字符。
- 必须由字母、数字开始和结尾。
- 可以包含字母、数字、减号(-)、下划线(_)、小数点(.)
1.2.2 标签的value
- 不能多于 63 个字符。
- 可以为空字符串。
- 如果不为空,则必须由字母、数字开始和结尾。
- 如果不为空,可以包含字母、数字、减号(-)、下划线(_)、小数点(.)
yaml
apiVersion: v1
kind: Pod
metadata:
name: label-demo
labels: #标签
environment: production
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.14.2
ports:
- containerPort: 80
apiVersion: v1
kind: Pod
metadata:
name: label-demo
labels: #标签
environment: production
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.14.2
ports:
- containerPort: 80
2. Label添加删除
https://kubernetes.io/docs/tasks/configure-pod-container/assign-pods-nodes/
2.1 node
添加
bash
#语法
kubectl label nodes node-name label_name=label_value
#案例
[root@kube-master yaml]# kubectl label nodes kube-node03 test=hello
node/kube-node03 labeled
#语法
kubectl label nodes node-name label_name=label_value
#案例
[root@kube-master yaml]# kubectl label nodes kube-node03 test=hello
node/kube-node03 labeled
查看
bash
# 查看所有标签
kubectl get nodes --show-labels
# 查看所有标签
kubectl get nodes --show-labels
删除
bash
#删除一个label,只需在命令行最后指定label的key名并与一个减号相连即可:
[root@kube-master yaml]# kubectl label nodes kube-node03 test-
node/kube-node03 labeled
#删除一个label,只需在命令行最后指定label的key名并与一个减号相连即可:
[root@kube-master yaml]# kubectl label nodes kube-node03 test-
node/kube-node03 labeled
修改
bash
#修改一个label的值,需要加上--overwrite参数
[root@kube-master yaml]# kubectl label nodes kube-node03 test=world --overwrite
node/kube-node03 labeled
#修改一个label的值,需要加上--overwrite参数
[root@kube-master yaml]# kubectl label nodes kube-node03 test=world --overwrite
node/kube-node03 labeled
2.2 pod
bash
# Update pod 'foo' with the label 'unhealthy' and the value 'true'.
kubectl label pods foo unhealthy=true
# Update pod 'foo' with the label 'status' and the value 'unhealthy', overwriting any existing value.
kubectl label --overwrite pods foo status=unhealthy
# Update all pods in the namespace
kubectl label pods --all status=unhealthy
# Update a pod identified by the type and name in "pod.json"
kubectl label -f pod.json status=unhealthy
# Update pod 'foo' only if the resource is unchanged from version 1.
kubectl label pods foo status=unhealthy --resource-version=1
# Update pod 'foo' by removing a label named 'bar' if it exists.
# Does not require the --overwrite flag.
kubectl label pods foo bar-
# Update pod 'foo' with the label 'unhealthy' and the value 'true'.
kubectl label pods foo unhealthy=true
# Update pod 'foo' with the label 'status' and the value 'unhealthy', overwriting any existing value.
kubectl label --overwrite pods foo status=unhealthy
# Update all pods in the namespace
kubectl label pods --all status=unhealthy
# Update a pod identified by the type and name in "pod.json"
kubectl label -f pod.json status=unhealthy
# Update pod 'foo' only if the resource is unchanged from version 1.
kubectl label pods foo status=unhealthy --resource-version=1
# Update pod 'foo' by removing a label named 'bar' if it exists.
# Does not require the --overwrite flag.
kubectl label pods foo bar-
查看当前pod
kubectl get pods --show-labels
kubectl get pods --show-labels
过滤app=demoapp
bash
kubectl get pods -l app=demoapp --show-labels
kubectl get pods -l app=demoapp --show-labels
或者使用不等来过滤pod
kubectl get pods -l app!=demoapp --show-labels
#注意此处使用不等于时,没有LABEL的pod也会被选中
kubectl get pods -l app!=demoapp --show-labels
#注意此处使用不等于时,没有LABEL的pod也会被选中
没有app标签的pod
bash
kubectl get pods -l '!app' --show-labels # 需要注意此处需要使用单引号,否则将作为shell命令执行。
kubectl get pods -l '!app' --show-labels # 需要注意此处需要使用单引号,否则将作为shell命令执行。
对app键的值做判断
kubectl get pods -l 'app in (mypod,demoapp)' --show-labels
kubectl get pods -l 'app in (mypod,demoapp)' --show-labels
对app键做不存在判断
bash
kubectl get pods -l 'app notin (mypod,demoapp)' --show-labels
kubectl get pods -l 'app notin (mypod,demoapp)' --show-labels
对多个键值过滤
bash
kubectl get pods -l 'app=demoapp,release=canary' --show-labels #app和release之间为与逻辑必须要同时满足
kubectl get pods -l 'app=demoapp,release=canary' --show-labels #app和release之间为与逻辑必须要同时满足