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中
apiVersion: v1
kind: Pod
metadata:
name: nginx
labels:
app: new_nginx
release: alpha
env: dev
role: frontend
spec:
containers:
- image: nginx:1.17.1
name: pod
ports:
- name: nginx-port
containerPort: 80
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 两种表达式
- 基于等式的(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
- 基于集合的(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“定向调度”的特性。