1.Label的作用
Label不是kubernets中的一种资源对象,它是用于附加到各种资源对象上的标签,这些资源对象可以是:Node,Pod,Service,RC等。可以通过给指定的资源对象捆绑一个或多个不同的Label来实现多维度的资源分组管理功能,以便灵活、方便地进行资源分配、调度、配置、部署等管理工作
2. Label的定义
一个Label是一个key=value的键值对,key与value由用户自己指定。一个资源对象可以定义任意数量的Label,同一个Label也可以被添加到任意数量的资源对象上。Label通常在资源对象定义时确定,也可以在对象创建后动态添加或者删除。
3. 如何使用Label
给某个资源对象定义一个Label,就相当于给它打了一个标签,随后可以通过**Label Selector(标签选择器)**查询和筛选拥有某些Label的资源对象。
3.1 LabelSelector在kubernets中的使用场景
- kube-controller进程通过在资源对象RC上定义的Label Selector来筛选要监控的Pod副本数量,使Pod副本数量始终符合预期设定的全自动控制流程
- kube-proxy进程通过Service的Label Selector来选择对应的Pod,自动建立每个Service到对应Pod的请求转发路由表,从而实现Service的智能负载均衡机制。
- 通过对某些Node定义特定的Label,并且在Pod定义文件中使用NodeSelector这种标签调度策略,kube-scheduler进程可以实现Pod定向调度的特性
3.2 LabelSelector表达式
Label Selector可以被类比为SQL语句中的where查询条件,例如,name=nginx,这个Label Selector作用于Pod时,可以被类比为select * from pod where pod’s name =‘nginx’这样的语句。当前有两种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”的关系,即同时满足多个条件。
4. Label使用实例
- 对于Pod对象,Label被定义在其metadata中:
apiVersion: v1
kind: Pod
metadata:
name: myweb
labels:
app: myweb
- 其他管理对象如Deployment、StatefulSet、DaemonSet和Job则可以在Selector中定义标签,在template中关联pod:
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: mysql
spec:
replicas: 1
serviceName: mysql
selector:
matchLabels:
app: mysql #符合目标的Pod拥有此标签
template: #此模板创建pod的副本
metadata:
labels:
app: mysql #pod副本拥有的标签,对应selector
- 管理Deployment、StatefulSet、DaemonSet和Service则通过Selector字段设置需要关联Pod的Label:
apiVersion: v1
kind: Service
metadata:
name: mysql
spec:
selector:
app: mysql
ports:
......
- matchLabels用于定义一组Label,与直接写在Selector中的作用相同;matchExpressions用于定义一组基于集合的筛选条件,可用的条件运算符包括In、NotIn、Exists和DoesNotExist。如果同时设置了matchLabels和matchExpressions,则两组条件为AND关系,即需要同时满足所有条件才能完成Selector的筛选。
selector:
matchLabels:
app: myweb
matchExpressions:
- {key: tier,operation: In,values:{frontend}}
- {key: environment,operation: NotIn,values:{dev}}