标签和选择算符
标签(Labels) 是附加到 Kubernetes 对象(比如 Pod)上的键值对,旨在指定对用户有意义且相关的对象标识属性,但不直接对核心系统有语义含义。标签可以用来组织和选择对象的子集。标签可以在创建时附加到对象,随后可以随时添加和修改。每个对象都可以定义一组 键/值标签,每个键对于给定对象必须是唯一的。
"metadata": {
"labels": {
"key1" : "value1",
"key2" : "value2"
}
}
标签能够支持高效的查询和监听(watch)操作,对于用户界面和命令行是很理想的。应使用注解记录非识别信息。
官方文档参考
| 文档 | 链接 |
|---|---|
| 标签和选择算符(中文) | https://kubernetes.io/zh-cn/docs/concepts/overview/working-with-objects/labels/ |
| Labels and Selectors(英文,内容补充参考) | https://kubernetes.io/docs/concepts/overview/working-with-objects/labels/ |
动机
标签使用户能够以松散耦合的方式将他们自己的组织结构映射到系统对象,而无需客户端存储这些映射。
服务部署和批处理流水线通常是多维实体(例如多个分区或部署、多个发行序列、多个层,每层多个微服务)。管理通常需要交叉操作,这打破了严格的层次表示的封装,特别是由基础设施而不是用户确定的严格层次结构。
常见示例标签:
| 维度 | 示例 |
|---|---|
| 发布轨道 | "release" : "stable"、"release" : "canary" |
| 环境 | "environment" : "dev"、"environment" : "qa"、"environment" : "production" |
| 层级 | "tier" : "frontend"、"tier" : "backend"、"tier" : "cache" |
| 分区 | "partition" : "customerA"、"partition" : "customerB" |
| 跟踪 | "track" : "daily"、"track" : "weekly" |
这些只是常用标签的例子,你可以任意制定自己的约定。但请记住,标签的 Key 对于给定对象必须是唯一的。
语法和字符集
标签是键值对。有效的标签键有两个段:可选的前缀和名称,用斜杠(/)分隔。
| 组成部分 | 规则 |
|---|---|
| 名称段(必需) | 小于等于 63 个字符,以字母数字([a-z0-9A-Z])开头和结尾,中间可包含破折号(-)、下划线(_)、点(.)和字母数字 |
| 前缀(可选) | 必须是 DNS 子域:由点(.)分隔的一系列 DNS 标签,总长不超过 253 个字符,后跟斜杠(/) |
| 有效标签值 | 63 个字符或更少(可以为空);除非为空,必须以字母数字开头和结尾;可包含 -、_、. 和字母数字 |
如果省略前缀,则假定标签键对用户是私有的。向最终用户对象添加标签的自动系统组件(例如 kube-scheduler、kube-controller-manager、kube-apiserver、kubectl 或其他第三方自动化工具)必须指定前缀。
kubernetes.io/ 和 k8s.io/ 前缀是为 Kubernetes 核心组件保留的,业务自定义标签绝对不要使用这两个前缀。
例如,下面是一个具有 environment: production 和 app: nginx 两个标签的 Pod 的清单:
apiVersion: v1
kind: Pod
metadata:
name: metadata-demo
labels:
environment: production # 环境标签
app: nginx # 应用名标签
spec:
containers:
- name: nginx
image: nginx:1.14.2
ports:
- containerPort: 80
标签选择算符
与名称和 UID 不同,标签不支持唯一性——通常我们希望许多对象携带相同的标签。通过标签选择算符(Label Selector),客户端/用户可以识别一组对象。标签选择算符是 Kubernetes 中的核心分组原语。
API 目前支持两种类型的选择算符:基于等值的和基于集合的