07.理解标签选择器

Kubernetes支持两种形式的标签选择器,基于等式的和基于集合的。标签选择器可以包含多个条件,并使用逗号分隔,此时只有满足所有条件的Kubernetes对象才会被选中。

基于等式的选择方式

可以使用两种操作符==,!==不讨论了,增加记忆成本),例如:


environment = production
tier != fronted

# 或者用如下的写法
environment = production, tier != fronted

案例(如下案例被调度到包含标签accelerator = nvidia-tesla-p100等节点):

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17

apiVersion: v1
kind: Pod

metadata:
  name: cuda-test

spec:
  containers:
    - name: cuda-test
      image: "k8s.gcr.io/cuda-vector-add:v0.1"
      resources:
        limits:
          nvidia.com/gpu: 1
  nodeSelector:
    accelerator: nvidia-tesla-p100

基于集合的选择方式

可以使用的操作符包括:innotinexists,例如:


# 包含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对象中使用标签选择器

  1. service通过spec.selector字段来选择一组Pod,并将服务请求转发到选中的Pod上。
  2. Job、Deployment、ReplicaSet、DaemonSet同时支持基于等式的选择方式和基于集合的选择方式
1
2
3
4
5
6
7
8

selector:
    matchLabels:
        component: redis
    matchExpressions:
        - {key: tier, operator: In, values: [cache]}
        - {key: environment, operator: NotIn, values: [dev]}

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的形式合并计算,即所有的条件都满足才可以算是匹配。

(这么说对象使用标签选择器的时候,其实是不支持基于等式的标签选择器的)