Kubernetes Label 和 Annotation

1. Label(标签)

1.1 介绍

Label 是一组 键值对(Key-Value),用于标识、选择和组织 Kubernetes 资源对象。它们被广泛用于 查询、筛选、分组和调度 资源。

1.2 作用

  • 资源分组:可以通过 Label 对 Pod、Service、Deployment 进行分组管理。
  • 负载均衡:Service 通过 Label 选择器(Selector)匹配 Pod,并均衡流量。
  • 调度决策:Node Selector、Affinity 规则可以基于 Label 进行 Pod 调度。
  • 版本管理:可以使用 Label 标识应用的不同版本,如 app=v1.0

1.3 示例

(1) 给 Pod 添加 Label

apiVersion: v1
kind: Pod
metadata:
  name: my-app
  labels:
    app: my-app
    env: production
spec:
  containers:
    - name: my-app-container
      image: my-app:latest

(2) 使用 Label 选择器查询资源

  • 获取所有 app=my-app 的 Pod:
    kubectl get pods -l app=my-app
    
  • 获取所有 env=productionapp=my-app 的 Pod:
    kubectl get pods -l env=production,app=my-app
    

(3) Service 通过 Label 选择 Pod

apiVersion: v1
kind: Service
metadata:
  name: my-app-service
spec:
  selector:
    app: my-app
  ports:
    - protocol: TCP
      port: 80
      targetPort: 8080

2. Annotation(注解)

2.1 介绍

Annotation 也是一组 键值对(Key-Value),主要用于存储 Kubernetes 资源的 附加信息,不影响对象的标识或调度。

2.2 作用

  • 存储额外的元数据(如作者、构建信息、外部工具信息)。
  • 提供非结构化信息,如监控系统、日志系统或 CI/CD 工具使用的元数据。
  • Kubernetes 内部机制,如 kubectl.kubernetes.io/last-applied-configuration 记录 kubectl apply 之前的状态。

2.3 示例

(1) 给 Pod 添加 Annotation

apiVersion: v1
kind: Pod
metadata:
  name: my-app
  annotations:
    creator: "admin"
    buildTimestamp: "2024-02-25T12:00:00Z"
    monitoring: "prometheus"
spec:
  containers:
    - name: my-app-container
      image: my-app:latest

(2) Kubernetes 内部 Annotation 示例

metadata:
  annotations:
    kubectl.kubernetes.io/last-applied-configuration: |
      {"apiVersion":"v1","kind":"Pod","metadata":{"name":"my-app"},"spec":{"containers":[{"name":"my-app-container","image":"my-app:latest"}]}}

3. Label 和 Annotation 的区别

特性 Label Annotation
用途 资源标识、选择和筛选 存储额外的元数据
是否可用于查询 ✅ 支持 kubectl get -l ❌ 不支持
影响 Kubernetes 机制 ✅ 可用于 Service、调度、自动伸缩等 ❌ 仅用于信息存储
数据结构 简单的 Key-Value 允许复杂的 Key-Value 及大数据量

4. 何时使用 Label vs Annotation

使用 Label 的情况

  • 需要筛选、分组或查询资源,例如:
    • 按环境(env=production
    • 按应用(app=nginx
    • 按版本(version=v2

使用 Annotation 的情况

  • 需要存储额外信息,但不会影响资源分组和调度,例如:
    • 记录应用构建时间(buildTimestamp
    • 记录监控系统信息(monitoring=prometheus
    • 记录 CI/CD 相关信息(ci-tool=Jenkins

5. 结论

  • Label 用于筛选和组织资源,影响 Kubernetes 的调度、负载均衡等。
  • Annotation 仅存储额外信息,不影响 Kubernetes 机制。
  • Label 是结构化的,Annotation 是非结构化的,可以存储更复杂的数据。
  • 合理使用 Label 和 Annotation 可以提高 Kubernetes 资源管理的灵活性和可维护性。
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容