kubernetes-handbook/concepts/label.md

105 lines
3.7 KiB
Markdown
Raw Normal View History

2017-07-03 20:16:25 +08:00
# Label
2021-12-25 21:42:34 +08:00
Label 是附着到 object 上(例如 Pod的键值对。可以在创建 object 的时候指定,也可以在 object 创建后随时指定。Labels 的值对系统本身并没有什么含义,只是对用户才有意义。
2017-07-03 20:16:25 +08:00
```json
"labels": {
"key1" : "value1",
"key2" : "value2"
}
```
2021-12-25 21:42:34 +08:00
Kubernetes 最终将对 labels 最终索引和反向索引用来优化查询和 watch在 UI 和命令行中会对它们排序。不要在 label 中使用大型、非标识的结构化数据,记录这样的数据应该用 annotation。
2017-07-03 20:16:25 +08:00
## 动机
2021-12-25 21:42:34 +08:00
Label 能够将组织架构映射到系统架构上(就像是康威定律),这样能够更便于微服务的管理,你可以给 object 打上如下类型的 label
2017-07-03 20:16:25 +08:00
- `"release" : "stable"`, `"release" : "canary"`
- `"environment" : "dev"`, `"environment" : "qa"`, `"environment" : "production"`
- `"tier" : "frontend"`, `"tier" : "backend"`, `"tier" : "cache"`
- `"partition" : "customerA"`, `"partition" : "customerB"`
- `"track" : "daily"`, `"track" : "weekly"`
- `"team" : "teamA"`,`"team:" : "teamB"`
## 语法和字符集
2021-12-25 21:42:34 +08:00
Label key 的组成:
2017-07-03 20:16:25 +08:00
2021-12-25 21:42:34 +08:00
- 不得超过 63 个字符
- 可以使用前缀,使用 / 分隔,前缀必须是 DNS 子域,不得超过 253 个字符,系统中的自动化组件创建的 label 必须指定前缀,`kubernetes.io/` 由 kubernetes 保留
2017-07-03 20:16:25 +08:00
- 起始必须是字母(大小写都可以)或数字,中间可以有连字符、下划线和点
2021-12-25 21:42:34 +08:00
Label value 的组成:
2017-07-03 20:16:25 +08:00
2021-12-25 21:42:34 +08:00
- 不得超过 63 个字符
2017-07-03 20:16:25 +08:00
- 起始必须是字母(大小写都可以)或数字,中间可以有连字符、下划线和点
## Label selector
2021-12-25 21:42:34 +08:00
Label 不是唯一的,很多 object 可能有相同的 label。
2017-07-03 20:16:25 +08:00
2021-12-25 21:42:34 +08:00
通过 label selector客户端用户可以指定一个 object 集合,通过 label selector 对 object 的集合进行操作。
2017-07-03 20:16:25 +08:00
2021-12-25 21:42:34 +08:00
Label selector 有两种类型:
2017-07-03 20:16:25 +08:00
2021-12-25 21:42:34 +08:00
- *equality-based* :可以使用 `=`、`==`、`!=` 操作符,可以使用逗号分隔多个表达式
- *set-based* :可以使用 `in`、`notin`、`!` 操作符,另外还可以没有操作符,直接写出某个 label 的 key表示过滤有某个 key 的 object 而不管该 key 的 value 是何值,`!` 表示没有该 label 的 object
2017-07-03 20:16:25 +08:00
## 示例
```bash
$ kubectl get pods -l environment=production,tier=frontend
$ kubectl get pods -l 'environment in (production),tier in (frontend)'
$ kubectl get pods -l 'environment in (production, qa)'
$ kubectl get pods -l 'environment,environment notin (frontend)'
```
2021-12-25 21:42:34 +08:00
## 在 API object 中设置 label selector
2017-07-03 20:16:25 +08:00
2021-12-25 21:42:34 +08:00
`service`、`replicationcontroller` 等 object 中有对 pod 的 label selector使用方法只能使用等于操作例如
2017-07-03 20:16:25 +08:00
```yaml
selector:
component: redis
```
2021-12-25 21:42:34 +08:00
`Job`、`Deployment`、`ReplicaSet` 和 `DaemonSet` 这些 object 中,支持 *set-based* 的过滤,例如:
2017-07-03 20:16:25 +08:00
2018-02-27 17:04:18 +08:00
```yaml
2017-07-03 20:16:25 +08:00
selector:
matchLabels:
component: redis
matchExpressions:
- {key: tier, operator: In, values: [cache]}
- {key: environment, operator: NotIn, values: [dev]}
```
2021-12-25 21:42:34 +08:00
如 Service 通过 label selector 将同一类型的 pod 作为一个服务 expose 出来。
2017-07-03 20:16:25 +08:00
![label示意图](../images/labels.png)
2021-12-25 21:42:34 +08:00
另外在 node affinity 和 pod affinity 中的 label selector 的语法又有些许不同,示例如下:
2017-07-03 20:16:25 +08:00
2018-02-27 17:04:18 +08:00
```yaml
2017-07-03 20:16:25 +08:00
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: kubernetes.io/e2e-az-name
operator: In
values:
- e2e-az1
- e2e-az2
preferredDuringSchedulingIgnoredDuringExecution:
- weight: 1
preference:
matchExpressions:
- key: another-node-label-key
operator: In
values:
- another-node-label-value
```