标签 Label 与选择器
标签(Label)是挂在资源上的一对键值,例如 app=nginx、env=prod。它本身不改变行为,但选择器(Selector)靠它把资源关联起来——Service 选 Pod、Deployment 选副本、kubectl 过滤,全都基于标签。
标签的用途
- 选择目标:Service 通过选择器把流量转发给带某标签的一组 Pod。
- 分组视角:用 env、team、app 等维度把资源归组,一眼看出归属。
- 资源关联:控制器靠 selector 认领自己管理的 Pod,互不抢。
- 调度辅助:节点也可打标签,Pod 用 nodeSelector 指定去哪些节点。
标签键的写法有约束:最多 63 字符,可用字母、数字、-、_、.,且以字母数字开头;还可带前缀如 app.kubernetes.io/name,不带前缀的属于用户自定义。
kubectl 操作标签
kubectl label pod web-0 tier=frontend # 打标签
kubectl label pod web-0 tier=backend --overwrite # 已存在则需 --overwrite
kubectl label pod web-0 tier- # 减号删除标签
kubectl get pods -l tier=frontend # 按标签过滤查看
kubectl get pods --show-labels # 显示全部标签
kubectl get pods -l 'tier in (frontend,backend),env=prod' # 组合条件
YAML 中的 labels 与 selector
资源自己用 metadata.labels 声明身份,控制器再用 spec.selector 按同一组键值去"认领"它。两者必须能匹配上,Deployment 才能管住自己创建的 Pod:
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx
spec:
replicas: 3
selector: # 控制器用这套条件认领 Pod
matchLabels:
app: nginx
template:
metadata:
labels: # Pod 模板必须带 app: nginx
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.27
相等选择器与集合选择器
- 相等选择器:key=value、key!=value,适合单个条件。
- 集合选择器:in、notin、存在性判断,适合多值条件。
selector:
matchLabels: # 相等选择:都要满足
app: nginx
matchExpressions: # 集合选择:与 matchLabels 是"且"关系
- key: tier
operator: In # 取值在列表内
values: ["frontend", "edge"]
- key: env
operator: NotIn # 取值不在列表内
values: ["prod"]
- key: disktype
operator: Exists # 只要带这个键即可
- key: beta
operator: DoesNotExist
需要注意:Deployment、ReplicaSet、StatefulSet 等的 spec.selector 一旦创建就不可修改,只能删除重建,因此创建前要把标签想清楚。
标签与注解 annotation 的区别
注解(Annotation)也是键值元数据,但定位完全不同:
| 对比 | Label 标签 | Annotation 注解 |
|---|---|---|
| 用途 | 被选择器查询、用于分组调度 | 记录描述性信息 |
| 格式约束 | 键值都有严格字符限制 | 键约束宽松,值任意字符串 |
| 能否被选择 | 能,是选择器依据 | 不能,选择器只认标签 |
| 典型内容 | env=prod、app=nginx | 版本说明、维护者、联系方式 |
kubectl annotate pod web-0 description="支付网关核心实例"
kubectl annotate pod web-0 description- # 删除注解
小结:标签是"给资源贴的、可被查询的身份证",选择器靠它把控制器、Service 与 Pod 关联起来;注解只是给人看的备注。设计标签时尽量用 app、env 这类稳定维度,并牢记控制器 selector 创建后不可改。