1、Label基本概念

一个Label是一个key=value的键值对,其中key与value由用户自己指定。Label可以附加到各种资源上,例如Node Pod Service RC等。 一个资源对象可以定义任意数量的Label,同一个Label也可以被添加到任意数量的资源对象上去,Label通常在资源对象定义时确认,也可以在对象创建后动态添加或者删除。

可以通过给指定的资源对象捆绑一个或多个不同的Label来实现多维度的资源分组管理功能,以便于灵活、方便地进行资源分配、调度、配置、部署等管理工作。

2、Label常见标签

例如:部署不同版本的应用到不同的环境中;或者监控和分析应用(日志记录、监控、告警)

常用的Label实例如下:

  • 版本标签:“release” : “stable” , “release” :“canary”
  • 环境标签:“environment”:“dev”, “environment”:“qa”, “environment”:“production”
  • 架构标签:“tier”:“frontend”, “tier”:“backend”, “tier”:“middleware”
  • 分区标签:“partition”:“customerA”, “partition”:“customerB”
  • 质量管控标签:“track”:“daily”, “track”:“weekly”

3、Label定义、添加、查看、删除

3.1 Label定义

Label通常定义在metadata中

  1. apiVersion: v1
  2. kind: Pod
  3. metadata:
  4. name: nginx
  5. labels:
  6. app: new_nginx
  7. release: alpha
  8. env: dev
  9. role: frontend
  10. spec:
  11. containers:
  12. - image: nginx:1.17.1
  13. name: pod
  14. ports:
  15. - name: nginx-port
  16. containerPort: 80
  17. protocol: TCP

3.2 Label添加

# 标签命令
kubectl label [--overwrite] (-f FILENAME | TYPE NAME) KEY_1=VAL_1 ... KEY_N=VAL_N [--resource-version=version]
# 为节点添加Label
[root@k8s-master ~]# kubectl label nodes k8s-node02 env=prod

# 节点Label更新
[root@k8s-master ~]# kubectl label --overwrite nodes k8s-node02 env=prod02

# 把namespace中所有节点node添加label
[root@k8s-master ~]# kubectl label nodes --all usr=devusr

3.3 Label查看

# 查看:kubectl get nodes --show-labels
[root@k8s-master ~]# kubectl get nodes --show-labels

# 获取符合条件的:kubectl get nodes -l 标签key=标签values
[root@k8s-master ~]# kubectl get nodes -l env=test

# 结果增加标签显示:kubectl get nodes -L 标签key
[root@k8s-master ~]# kubectl get nodes -L env

3.4 Label删除

# 删除命令 kubectl label nodes 节点名称 标签key-
[root@k8s-master ~]# kubectl label nodes k8s-node01 env-

4、Label Selector

4.1 基础介绍

Label 表达式 && Label Selector Label 相当于我们熟悉的标签,给某个资源对象定义一个Label,就相当于给它打了一个标签,随后可以通过Label Selector 标签选择器 查询和筛选有某些Label的资源对象。Kubernetes通过这种方式实现了类似SQL的简单又通用的对象查询机制。

4.2 两种表达式

  1. 基于等式的(Equality-based):name = redis-slave: 匹配所有具有标签name=redis-slave的资源对象 ;env != production: 匹配所有不具有标签env=production的资源对象,比如env=test就是满足此条件的标签之一。
# 定义
apiVersion: v1
kind: Pod
metadata:
  name: nginx
  labels:
    env: dev

# Label Selector
apiVersion: v1
kind: Service
metadata:
  name: myweb
spec:
  selector:
    app: myweb
  1. 基于集合的(Set-based):name in (redis-master,redis-slave):匹配所有具有name=redis-master或者name=redis-slave的资源对象;name not in (php-fronted):匹配所有不具有标签name=php-fronted的资源对象。
# Label Selector
apiVersion: v1
kind: Service
metadata:
  name: myweb
spec:
  selector:
    matchLabels:
      app: myweb
    matchExpressions:
      - {key: tier, operator: In, Values: [frontend]}
      - {key: enviroment, operator: NotIn, Values: [dev]}

matchLabels用于定义一组Label,与直接写在Selector中作用相同;matchExpressions用于定义一组基于集合的筛选条件,可用的条件运算符包括:In、NotIn、Exists和DoesNotExists;如同时设置了matchLabels和matchExpressions,则两组条件为AND关系

5、使用场景

  • kube-controller进程通过资源对象RC上定义的Label Selector来筛选要监控的Pod副本的数量,从而实现Pod 副本的数量始终符合设定的全自动控制流程。
  • kube-proxy 进程通过Service的Label Selector 来选择对应的Pod,自动建立起每个Service到对应的Pod的请求转发路由表,从而实现Service的智能均衡特性。
  • 通过对某些Node定义特定的Label,并且在Pod定义文件中使用NodeSelector,这种标签调度策略,kube-scheduler进程可以实现Pod“定向调度”的特性。