Kubernetes支持两种形式的标签选择器,基于等式的和基于集合的。标签选择器可以包含多个条件,并使用逗号分隔,此时只有满足所有条件的Kubernetes对象才会被选中。
基于等式的选择方式
可以使用两种操作符==
,!=
(=
不讨论了,增加记忆成本),例如:
environment = production
tier != fronted
# 或者用如下的写法
environment = production, tier != fronted
案例(如下案例被调度到包含标签accelerator = nvidia-tesla-p100
等节点):
|
|
基于集合的选择方式
可以使用的操作符包括:in
,notin
,exists
,例如:
# 包含environment标签,且environment的取值在productin、qa
environment in (production, qa)
tier notin (frontend, backend)
# 选择包含partition标签的对象(第一次听说)
partition
# 选择不包含partition标签的对象(第一次听说)
!partition
可以组合多个选择器,用逗号分隔,相当于AND操作符,例如:
partition,environment notin (qa)
在API中使用标签选择器
两种方式在kubectl和watch命令中使用:
kubectl get pods -l environment=production,tier=frontend
# 我比较喜欢这种
kubectl get pods -l 'environment in (production),tier in (frontend)'
在Kubernetes对象中使用标签选择器
- service通过
spec.selector
字段来选择一组Pod,并将服务请求转发到选中的Pod上。 - Job、Deployment、ReplicaSet、DaemonSet同时支持基于等式的选择方式和基于集合的选择方式
|
|
matchLabels是一个{key,value}组成的map。map中的一个 {key,value} 条目相当于matchExpressions中的一个元素,其key为map的key,operator为In,values数组则只包含value一个元素。
matchExpression等价于基于集合的选择方式,支持的operator有In、NotIn、Exists和DoesNotExist。当 operator为In或NotIn时,values数组不能为空。所有的选择条件都以AND的形式合并计算,即所有的条件都满足才可以算是匹配。
(这么说对象使用标签选择器的时候,其实是不支持基于等式的标签选择器的)