在 Kubernetes 的 YAML 配置文件中,metadata(元数据)是用来标识和组织资源对象的。如果把一个 K8s 资源比作一份档案,那么 spec 是档案的内容,而 metadata 就是档案封面上贴的标签、编号和分类信息。

metadata 主要由三个核心部分组成:Name(名字)Namespace(命名空间)Labels/Annotations(标签与注解)


1. 唯一标识:Name & Namespace

这是资源在集群中的“身份证号”。

  • name: 资源的名称。在同一个命名空间内,同类型的资源名字必须唯一。
  • namespace: 资源所属的逻辑隔离区。如果不写,默认是 default

示例:

metadata:
  name: ai-fe-deployment  # 它的名字
  namespace: ai-dev       # 它住在 ai-dev 房间里

2. 核心纽带:Labels(标签)

这是 metadata最重要的功能。标签是键值对(Key-Value),用于对资源进行分组和关联。

为什么需要 Labels?

K8s 的组件之间不是通过“名字”硬编码连接的,而是通过 “标签选择器 (Selector)” 动态寻找的。

看你之前的 ai-fe 配置中的链路:

  1. Pod 上贴标签

    # Deployment 的模板部分
    template:
      metadata:
        labels:
          app: ai-fe  # 给生成的 Pod 贴上“我是 ai-fe”的标签
    
  2. Service 找标签

    # Service 部分
    spec:
      selector:
        app: ai-fe  # Service 说:凡是带“app: ai-fe”标签的 Pod,流量都归我管
    
  3. Deployment 管理标签

    # Deployment 自己的选择器
    spec:
      selector:
        matchLabels:
          app: ai-fe  # Deployment 说:我要监控所有带这个标签的 Pod,少了就补,多了就删
    

比喻:这就好比在一群人中,Service 喊一句:“穿红色衣服的(Label)站出来受命”,它不需要知道每个人的具体名字。


3. 辅助信息:Annotations(注解)

注解也是键值对,但它与 Labels 有本质区别:

  • Labels 是给 K8s 筛选用的(具有搜索功能)。
  • Annotations 是给人或第三方工具看的(不具备搜索功能)。

常见用途:

  • 记录版本发布信息:build_ver: "1.0.5"
  • 记录负责人:owner: "sunwenquan@tengits.com"
  • 给 Ingress 控制器传参数:例如 kubernetes.io/ingress.class: "nginx"

4. 系统生成的 Metadata(你通常不需要写)

当你执行 kubectl get pod <name> -o yaml 查看一个已经在运行的 Pod 时,你会发现 metadata 里多了很多东西:

  • uid: K8s 自动生成的唯一 ID(防止删了重名后的混淆)。
  • resourceVersion: 资源版本号,用于并发控制。
  • creationTimestamp: 创建时间。
  • selfLink: 资源在 API 中的路径。

总结:如何正确使用 Metadata?

字段是否必填作用提示
name唯一名称只能包含小写字母、数字和中划线 -
namespace环境隔离建议明确指定,避免全堆在 default
labels强烈建议关联与分组必须与 Service 的 selector 对应上
annotations存储辅助信息适合放日志记录、描述、联系人信息

避坑指南:
如果你修改了 Deployment 的 metadata.labels 却忘了改 spec.selector.matchLabels,K8s 会报错,因为它无法匹配到自己管理的“下属”。这两处的标签必须严丝合缝地对上。