Kubernetes: Object: Label and Selector

 8th March 2021 at 8:20pm

k8s 的 label 用来给资源打标签,selector 用来筛选资源,比如 ReplicaSet:

apiVersion: apps/v1
kind: ReplicaSet
metadata:
  name: frontend
  labels:
    app: guestbook
    tier: frontend
spec:
  replicas: 3
  selector:
    matchLabels:                 # ReplicaSet 管理有这种标签的 pod
      tier: frontend
  template:
    metadata:
      labels:                    # 生成的 pod 带有这些标签
        tier: frontend
    spec:
      containers:
      - name: php-redis
        image: gcr.io/google_samples/gb-frontend:v3

Label 是一些 (string, string) 键值对。Selector 有两类:

  • Equality-based:
    • 操作符:=,==,!=
    • 例子:environment=production,tier!=frontend
  • Set-based:
    • 操作符:in, notin, exists,以及可以表示某一 label key 存在(无视其值)或不存在
    • 例子:environment in (production, qa),tier in (frontend)env 表示筛选 label 中有 env 的,不管值是个进程能;!env 表示筛选 label 中没有 env

上面例子的格式主要是用在 kubectl 中:

kubectl get pods -l 'environment in (production),tier in (frontend)'

逗号分隔表示逻辑与(&&)。Selector 不支持逻辑或(||)。

在 YAML 中的写法:

# Equality-based
selector:
    component: redis
    tier: midware

# Set-based
selector:
  matchLabels:             # key-value 形式
    component: redis
  matchExpressions:        # 带操作符
    - {key: tier, operator: In, values: [cache]}   # YAML map 的紧缩写法
    - key: environment                             # YAML map 的另一种写法
      operator: NotIn
      values:
      - dev

Service 和 ReplicationController 用的是 equality-based;比较后面出现的资源类型,如 Job、Deployment、ReplicaSet、DaemonSet 等,均用的 set-based。

参考