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。