Kubernetes的基本概念和术语-lable
一个Label是一个key=value的键值对,其中key与value由用户自己指定。Label可以被附加到各种资源对象上,例如Node、Pod、Service、RC等,一个资源对象可以定义任意数量的Label,同一个Label也可以被添加到任意数量的资源对象上。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"。
lable可以通过Label Selector(标签选择器)查询和筛选拥有某些Label的资源对象。
Label Selector可以被类比为SQL语句中的where查询条件,例如,name=redis-slave这个Label Selector作用于Pod时,可以被类比为select * from pod where pod’s name =‘redis-slave’这样的语句。当前有两种Label Selector表达式:基于等式的(Equality-based)和基于集合的(Set-based),前者采用等式类表达式匹配标签,下面是一些具体的例子。
- name=redis-slave:匹配所有具有标签name=redis-slave的资源对象。
- env!=production:匹配所有不具有标签env=production的资源对象,比如env=test就是满足此条件的标签之一。
后者则使用集合操作类表达式匹配标签,下面是一些具体的例子。
- name in(redis-master, redis-slave):匹配所有具有标签name=redis-master或者name=redis-slave的资源对象。
- name not in(php-frontend):匹配所有不具有标签name=php-frontend的资源对象。
可以通过多个Label Selector表达式的组合实现复杂的条件选择,多个表达式之间用“,”进行分隔即可,几个条件之间是“AND”的关系,即同时满足多个条件,比如下面的例子:
- name=redis-slave,env!=production
- name notin (php-frontend ),env!=production
apiVersion: v1
kind: Pod
matadata:
name: myweb
app: myweb
以myweb Pod为例,lable被定义在matadata中。
管理对象RC和Service则通过Selector字段设置需要关联Pod的Label:
apiVersion: v1 kind: ReplicationController metadata: name: myweb spec: replicas: 1 selector: app: myweb template ................ apiVersion: v1 kind: service metadata: name: myweb spec: selector: app: myweb ports: - port: 8080
其他管理对象如Deployment、ReplicaSet、DaemonSet和Job则可以在Selector中使用基于集合的筛选条件定义,例如:
selector: matchLables: app: myweb matchExpressions: - {key: tier, operator: In, values [frontend]} - {key: environment, operator: NotIn, values [dev]}
matchLabels用于定义一组Label,与直接写在Selector中的作用相同;matchExpressions用于定义一组基于集合的筛选条件,可用的条件运算符包括In、NotIn、Exists和DoesNotExist。
如果同时设置了matchLabels和matchExpressions,则两组条件为AND关系,即需要同时满足所有条件才能完成Selector的筛选。
Label Selector在Kubernetes中的重要使用场景如下。
- kube-controller进程通过在资源对象RC上定义的Label Selector来筛选要监控的Pod副本数量,使Pod副本数量始终符合预期设定的全自动控制流程。
- kube-proxy进程通过Service的Label Selector来选择对应的Pod,自动建立每个Service到对应Pod的请求转发路由表,从而实现Service的智能负载均衡机制。
- 通过对某些Node定义特定的Label,并且在Pod定义文件中使用NodeSelector这种标签调度策略,kube-scheduler进程可以实现Pod定向调度的特性。



浙公网安备 33010602011771号