K8s 标签

一、核心:标签的本质是「键值对」

标签(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),中间可以用-_.和字母数字
    • 例子:appversionname
  • 前缀(可选) :斜杠之前的部分,用来避免命名冲突
    • 规则:必须是 DNS 子域格式(用.分隔,比如app.kubernetes.io),总长度≤253 个字符,结尾必须跟/
    • 特殊限制:kubernetes.io/k8s.io/是 K8s 核心组件保留前缀,用户不能自定义使用
    • 例子:app.kubernetes.io/name → 前缀是app.kubernetes.io,名称是name

2. 两种常见的键

类型 格式 例子 用途
私有键(无前缀) 直接写名称 env: devapp: nginx 用户自定义的私有标签,不会和官方冲突
共享键(带前缀) 前缀 + 名称 app.kubernetes.io/name: mysql 官方推荐的标准化标签,用于统一规范,避免不同团队命名冲突

三、详细拆解:值(冒号后)的规则

标签的值(冒号后)规则更宽松,核心要求:

  • 最多 63 个字符,可以为空
  • 如果不为空:开头 / 结尾必须是字母 / 数字,中间可以用-_.和字母数字
  • 例子:prdv1.1.0stablemysql-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=nginxenv=prd的资源(生产环境的 Nginx Pod)
  • 实际场景:Pod 的nodeSelector,让 Pod 只能运行在带accelerator: nvidia-tesla-p100标签的节点上,实现 GPU 调度

2. 基于集合的选择符

用「一组值」筛选,支持 3 个操作符:innotinexists

操作符 格式 含义 例子
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的资源

七、总结

  1. 标签是key: value的键值对,冒号前是「分类的维度(键)」,冒号后是「分类的具体值(值)」
  2. 键分「可选前缀 + 必须名称」,值规则宽松,核心作用是给资源打标记、方便筛选和批量管理;
  3. 标签选择符是筛选资源的工具,支持等值和集合两种方式,逗号分隔是逻辑与,必须同时满足。

八、补充:实际 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。

相关推荐
H_老邪2 小时前
Docker 学习之路-从入门到放弃:7
学习·docker·容器
m0_677904842 小时前
K8s学习
java·学习·kubernetes
walkerLing3 小时前
Docker_Day1
运维·docker·容器
老毛肚4 小时前
KubeSphere 云原生k8s
云原生·容器·kubernetes
学不完的4 小时前
Kubernetes控制器
docker·容器·kubernetes
w6100104664 小时前
CKA-2026-resources
运维·docker·容器·cka
小二·4 小时前
2026年4月技术热点深度解析:AI智能体攻防、量子安全与云原生新纪元
人工智能·安全·云原生
程序员老邢4 小时前
【技术底稿 11】内网私有 Docker 镜像仓库 Registry2 全流程部署(多机共享,告别离线拷贝)
运维·docker·容器·架构·devops
merlin-mm4 小时前
GPU通信速率对比
网络·kubernetes