Skip to content

文档:https://kubernetes.io/zh/docs/concepts/overview/working-with-objects/labels/

1. Label

  1. Label是一个键值对,可以附加在任何对象上,比如Node,Pod,Service,RC等。Label和资源对象是多对多的关系,即一个Label可以被添加到多个对象上,一个对象也可以定义多个Label。
  2. Label的作用主要用来实现精细的、多维度的资源分组管理,以便进行资源分配,调度,配置,部署等工作。
  3. Label通俗理解就是“标签”,通过标签来过滤筛选指定的对象,进行具体的操作。k8s通过Label Selector(标签选择器)来筛选指定Label的资源对象,类似SQL语句中的条件查询(WHERE语句)。
  4. 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的资源对象)

使用场景

  1. kube-controller进程通过资源对象RC上定义的Label Selector来筛选要监控的Pod副本数,从而实现副本数始终保持预期数目。
  2. kube-proxy进程通过Service的Label Selector来选择对应Pod,自动建立每个Service到对应Pod的请求转发路由表,从而实现Service的智能负载均衡机制。
  3. 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之间为与逻辑必须要同时满足