讲解
Label(标签)是贴在资源上的键值对元数据(如 app: web、tier: frontend、env: prod),它不改变资源本身的任何行为,唯一使命是「被选择」。回头看你已经见过的联动:Service 靠 selector 找后端 Pod,Deployment 靠 selector 认领它的 Pod——标签与选择器就是 Kubernetes 里资源之间建立关系的通用胶水。设计良好的标签体系(谁负责、什么应用、哪个版本、什么环境)是大集群保持可管理的前提。
选择器有两种写法。等值型:key: value 精确匹配,kubectl 里是 -l app=web、-l app!=web;集合型:matchExpressions 里的 In/NotIn/Exists 运算符,kubectl 里是 -l 'app in (web,api)'、-l 'env'(存在这个键即可)。多个条件之间是「与」关系。除了标签选择器,还有字段选择器(--field-selector)按资源的固有字段过滤,常用的是 status.phase=Running 和 spec.nodeName=xxx——它俩过滤的东西不同:标签是你贴的元数据,字段是对象的内在属性。
标签是运行时可变的:kubectl label 随时给资源加、改(--overwrite)、删(键名加负号)标签,选择器匹配关系随之实时变化——给一个 Pod 摘掉 Service 匹配的标签,它就立刻退出负载均衡,这是「无痛摘流调试」的技巧基础。节点的标签(如 kubernetes.io/hostname、可用区标签)配合 Pod 的 nodeSelector/nodeAffinity 还能控制调度位置。给资源打标签零成本,值得在一开始就建立规范并坚持执行。
示例
两个带标签的 Pod:一个前端(nginx)、一个后端(busybox),标签包含应用、层级、环境三个维度:
# wait: pod/ohmydocs-verify-frontend
# wait: pod/ohmydocs-verify-backend
apiVersion: v1
kind: Pod
metadata:
name: ohmydocs-verify-frontend
labels:
app: ohmydocs-verify-shop
tier: frontend
version: v1
spec:
containers:
- name: nginx
image: nginx:1.27-alpine
---
apiVersion: v1
kind: Pod
metadata:
name: ohmydocs-verify-backend
labels:
app: ohmydocs-verify-shop
tier: backend
version: v2
spec:
containers:
- name: busybox
image: busybox:1.36
command: ["sleep", "3600"]
等值与集合选择器各试一遍,--show-labels 看全貌:
kubectl get pods --show-labels -l app=ohmydocs-verify-shop
kubectl get pods -l app=ohmydocs-verify-shop,tier=frontend --no-headers
kubectl get pods -l 'version in (v2)' --no-headers
运行时改标签:给前端 Pod 打上 env=staging,按新标签过滤能立刻命中;再删掉标签。字段选择器按状态过滤:
kubectl label pod ohmydocs-verify-frontend env=staging
kubectl get pods -l env=staging --no-headers
kubectl label pod ohmydocs-verify-frontend env-
kubectl get pods --field-selector status.phase=Running --no-headers | head -4
常见坑
- 标签值不合法:标签值有字符集和长度限制(63 字符,字母数字加 -_.),中文或特殊符号会被拒。
- 改 Deployment 的 selector:创建后不可变,改了报错;能改的是模板和 Pod 身上的标签。
- 标签体系各写各的:team A 用 app、team B 用 application,查询和策略全废——标签规范要先于规模出现。
- 混淆标签和注解:注解(annotation)也是键值对但不能被选择器匹配,它用来挂工具配置(如 prometheus 抓取开关);「要被筛选的」用标签,「给人和工具看的」用注解。
小结
标签是资源间建立关系的胶水,Service/Deployment 全靠选择器认领 Pod;等值与集合两种选择器,-l 随时过滤;标签运行时可改,关系实时变化。下一章回到容器本身:CPU/内存的请求与限制。