一、核心:标签的本质是「键值对」
标签(Labels)是附加在 Pod、Node、Service 等 K8s 资源上的键值对(key: value),冒号是「分隔符」,作用是把「键」和「值」分开:
- 冒号前 = 键(Key):标签的「名字 / 类别 / 字段名」,用来定义这个标签是「什么维度」
- 冒号后 = 值(Value):标签的「具体内容 / 属性值」,用来定义这个维度下的「具体是什么」
举个最直观的例子
labels:
env: prd # 键:env(环境维度),值:prd(生产环境)
app: nginx # 键:app(应用维度),值:nginx(应用名)
version: v1.14.2 # 键:version(版本维度),值:v1.14.2(版本号)
你可以把它理解成「给资源打分类标签」:
- 键是「分类的标题」(比如「环境」「应用」「版本」)
- 值是「分类的具体选项」(比如「生产」「Nginx」「v1.14.2」)
二、详细拆解:键(冒号前)的规则和结构
标签的键(冒号前)有严格的格式要求,分为 **「可选前缀 + 必须的名称」** 两部分,用斜杠/分隔:
1. 结构说明
- 名称段(必须) :冒号前「斜杠之后」的部分(如果没有前缀,就是冒号前的全部内容)
- 规则:最多 63 个字符,开头 / 结尾必须是字母 / 数字(a-z、A-Z、0-9),中间可以用
-、_、.和字母数字 - 例子:
app、version、name
- 规则:最多 63 个字符,开头 / 结尾必须是字母 / 数字(a-z、A-Z、0-9),中间可以用
- 前缀(可选) :斜杠之前的部分,用来避免命名冲突
- 规则:必须是 DNS 子域格式(用
.分隔,比如app.kubernetes.io),总长度≤253 个字符,结尾必须跟/ - 特殊限制:
kubernetes.io/和k8s.io/是 K8s 核心组件保留前缀,用户不能自定义使用 - 例子:
app.kubernetes.io/name→ 前缀是app.kubernetes.io,名称是name
- 规则:必须是 DNS 子域格式(用
2. 两种常见的键
| 类型 | 格式 | 例子 | 用途 |
|---|---|---|---|
| 私有键(无前缀) | 直接写名称 | env: dev、app: nginx |
用户自定义的私有标签,不会和官方冲突 |
| 共享键(带前缀) | 前缀 + 名称 | app.kubernetes.io/name: mysql |
官方推荐的标准化标签,用于统一规范,避免不同团队命名冲突 |
三、详细拆解:值(冒号后)的规则
标签的值(冒号后)规则更宽松,核心要求:
- 最多 63 个字符,可以为空
- 如果不为空:开头 / 结尾必须是字母 / 数字,中间可以用
-、_、.和字母数字 - 例子:
prd、v1.1.0、stable、mysql-abcxyz都是合法值
四、标签到底有什么用?(3 大核心作用)
标签不会影响资源的功能,核心作用是「给资源打标记,方便管理和筛选」:
1. 选择器:用标签筛选一组资源
这是最核心的用途:Service 用标签选择器,找到匹配的 Pod,把流量路由过去。
- 比如 Service 的标签选择器是
app: nginx,就会把流量转发给所有带app: nginx标签的 Pod
2. 组织和分类:给资源分层分类
用标签区分不同环境、不同业务的资源,方便管理。
- 比如
env: dev(开发环境)、env: prd(生产环境),一眼就能区分资源归属
3. 批量操作:简化运维
用标签批量操作资源,不用一个个指定。
- 比如删除所有
version: v1.1.0的 Pod,或者给所有app: mysql的 Pod 扩容
五、常用标签示例
1. 常用私有标签(用户自定义)
| 完整标签 | 键(冒号前) | 值(冒号后) | 用途 |
|---|---|---|---|
version: v1.1.0 |
version |
v1.1.0 |
标记应用版本 |
release: stable |
release |
stable |
标记版本状态(正式版 / 测试版) |
env: dev |
env |
dev |
标记运行环境(开发 / 生产) |
app: nginx |
app |
nginx |
标记应用名称 |
2. 官方推荐的共享标签(带app.kubernetes.io/前缀)
| 完整标签 | 键(冒号前) | 值(冒号后) | 用途 |
|---|---|---|---|
app.kubernetes.io/name: mysql |
app.kubernetes.io/name |
mysql |
标记应用名称 |
app.kubernetes.io/instance: mysql-abcxyz |
app.kubernetes.io/instance |
mysql-abcxyz |
标记应用实例的唯一名称 |
app.kubernetes.io/version: 5.7.21 |
app.kubernetes.io/version |
5.7.21 |
标记应用版本 |
app.kubernetes.io/component: database |
app.kubernetes.io/component |
database |
标记架构中的组件(数据库 / 前端 / 后端) |
六、标签选择符:怎么用标签筛选资源?
标签选择符是 K8s 的核心分组功能,用来「根据标签筛选一组资源」,支持两种类型,逗号分隔的多个条件是逻辑与(&&),必须同时满足。
1. 基于等值的选择符(最常用)
根据「键是否等于某个值」筛选,核心格式:键=值、键!=值
- 例子 1:
env=prd→ 筛选所有env键的值为prd的资源(生产环境的所有 Pod) - 例子 2:
app=nginx,env=prd→ 筛选同时满足app=nginx和env=prd的资源(生产环境的 Nginx Pod) - 实际场景:Pod 的
nodeSelector,让 Pod 只能运行在带accelerator: nvidia-tesla-p100标签的节点上,实现 GPU 调度
2. 基于集合的选择符
用「一组值」筛选,支持 3 个操作符:in、notin、exists
| 操作符 | 格式 | 含义 | 例子 |
|---|---|---|---|
in |
键 in (值1, 值2) |
键的值等于其中任意一个,就匹配 | environment in (production, qa) → 筛选环境是生产或测试的资源 |
notin |
键 notin (值1, 值2) |
键的值不等于这两个,就匹配 | tier notin (frontend, backend) → 筛选不是前端 / 后端的资源 |
exists |
键 |
只要有这个键,不管值是什么,就匹配 | partition → 筛选所有带partition标签的资源 |
!exists |
!键 |
没有这个键,就匹配 | !partition → 筛选所有不带partition标签的资源 |
3. 混合使用
两种选择符可以组合,逗号分隔是逻辑与,必须同时满足:
- 例子:
partition in (customerA, customerB), environment != qa→ 筛选同时满足:partition是 A/B,且environment不是qa的资源
七、总结
- 标签是
key: value的键值对,冒号前是「分类的维度(键)」,冒号后是「分类的具体值(值)」; - 键分「可选前缀 + 必须名称」,值规则宽松,核心作用是给资源打标记、方便筛选和批量管理;
- 标签选择符是筛选资源的工具,支持等值和集合两种方式,逗号分隔是逻辑与,必须同时满足。
八、补充:实际 YAML 示例
apiVersion: v1
kind: Pod
metadata:
name: label-demo
labels:
# 冒号前是键,冒号后是值
environment: production # 键:environment,值:production
app: nginx # 键:app,值:nginx
version: v1.14.2 # 键:version,值:v1.14.2
spec:
containers:
- name: nginx
image: nginx:1.14.2
ports:
- containerPort: 80
这个 Pod 带了 3 个标签,你可以用app=nginx筛选出它,用environment=production筛选出所有生产环境的 Pod。