标签 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 创建后不可改。

笔记加载中…