20·Pod 基础入门

Pod 注解

kubernetespodannotations

Pod 注解

学习目标

  1. 理解注解的作用和使用场景
  2. 掌握注解的增删改查操作
  3. 理解注解与标签的区别

核心概念

什么是注解

注解(Annotations)是附加到 Kubernetes 对象上的键值对。

与标签的区别:
- 标签:用于选择和过滤,有长度限制
- 注解:用于附加信息,无长度限制

用途:
- 存储非标识性信息
- 工具和库的配置
- 构建、发布、镜像信息
- 网络策略、监控配置

注解语法

metadata:
  annotations:
    # 简单形式
    description: "My web application"

    # 带前缀
    example.com/owner: "team-a"
    example.com/contact: "[email protected]"

    # 多行值
    example.com/notes: |
      This is a multi-line
      annotation value

    # JSON 值
    example.com/config: '{"key": "value"}'
部分规则示例
可选前缀/名称description, example.com/key
任意字符串短字符串、多行、JSON
长度键值对总计不超过 256KB通常远小于此限制

标签 vs 注解

方面标签注解
用途选择和过滤附加信息
长度限制键和值各 63 字符总计 256KB
选择器支持不支持
典型内容app、env、version描述、配置、元数据

创建时添加注解

apiVersion: v1
kind: Pod
metadata:
  name: web
  annotations:
    description: "Web server for frontend"
    owner: "team-frontend"
    contact: "[email protected]"
    version: "1.0.0"
    changelog: "Initial deployment"
spec:
  containers:
  - name: nginx
    image: nginx

查看注解

# 查看 Pod 注解
kubectl get pod web -o jsonpath='{.metadata.annotations}'

# 格式化输出
kubectl get pod web -o jsonpath='{.metadata.annotations}' | jq .

# 查看特定注解
kubectl get pod web -o jsonpath='{.metadata.annotations.description}'

动态管理注解

# 添加注解
kubectl annotate pod web owner=team-a

# 修改注解(需要 --overwrite)
kubectl annotate pod web owner=team-b --overwrite

# 删除注解
kubectl annotate pod web owner-

常用注解场景

场景 1: 构建信息

annotations:
  build/version: "1.0.0"
  build/commit: "abc123"
  build/branch: "main"
  build/timestamp: "2026-07-01T10:00:00Z"
  build/builder: "ci-pipeline"

场景 2: 运维信息

annotations:
  owner: "team-backend"
  contact: "[email protected]"
  oncall: "+1-555-0123"
  cost-center: "engineering"
  environment: "production"

场景 3: 网络配置

annotations:
  # Ingress 配置
  nginx.ingress.kubernetes.io/rewrite-target: /
  nginx.ingress.kubernetes.io/ssl-redirect: "true"

  # Service 配置
  service.beta.kubernetes.io/aws-load-balancer-type: "nlb"

场景 4: 监控配置

annotations:
  prometheus.io/scrape: "true"
  prometheus.io/port: "9090"
  prometheus.io/path: "/metrics"

常见注解前缀

# Kubernetes 官方
kubectl.kubernetes.io/
node.kubernetes.io/
apps.kubernetes.io/

# Ingress 控制器
nginx.ingress.kubernetes.io/
traefik.ingress.kubernetes.io/

# 云提供商
service.beta.kubernetes.io/
volume.beta.kubernetes.io/

# 工具
helm.sh/
argocd.argoproj.io/

注解的限制

1. 大小限制
   键值对总计不超过 256KB

2. 不可选择
   不能用标签选择器过滤注解

3. 不影响调度
   注解不影响 Pod 调度决策

4. 可选性
   注解是可选的,不影响核心功能

注解与自动化

# CI/CD 工具使用注解存储信息
annotations:
  # Jenkins
  jenkins.io/build-url: "https://jenkins.example.com/job/123"

  # GitHub Actions
  github.com/workflow-run: "abc123"

  # ArgoCD
  argocd.argoproj.io/sync-status: "Synced"

注解最佳实践

1. 使用前缀
   避免键名冲突

2. 有意义的键名
   使用层次结构:category/subcategory

3. 适当的值
   短文本、JSON、URL 都可以

4. 文档化
   记录使用的注解及其含义

实践练习

练习 1: 创建带注解的 Pod

创建 Pod 并添加注解:

apiVersion: v1
kind: Pod
metadata:
  name: web
  annotations:
    description: "Web application"
    owner: "team-frontend"
    version: "1.0.0"
spec:
  containers:
  - name: nginx
    image: nginx
kubectl apply -f pod.yaml
kubectl get pod web -o jsonpath='{.metadata.annotations}' | jq .

练习 2: 动态管理注解

练习增删改注解:

# 添加注解
kubectl annotate pod web [email protected]
kubectl get pod web -o jsonpath='{.metadata.annotations.contact}'

# 修改注解
kubectl annotate pod web [email protected] --overwrite
kubectl get pod web -o jsonpath='{.metadata.annotations.contact}'

# 删除注解
kubectl annotate pod web contact-

练习 3: 理解注解 vs 标签

创建 Pod 同时使用标签和注解:

apiVersion: v1
kind: Pod
metadata:
  name: demo
  labels:
    app: web
    env: production
  annotations:
    description: "Demo application"
    owner: "team-a"
spec:
  containers:
  - name: nginx
    image: nginx
# 标签可以用于选择
kubectl get pods -l app=web

# 注解不能用于选择
kubectl get pods -l description=web  # 不会工作

练习 4: 使用注解存储构建信息

模拟 CI/CD 注入注解:

kubectl annotate pod web \
  build/commit=$(git rev-parse HEAD) \
  build/branch=$(git branch --show-current) \
  build/timestamp=$(date -u +"%Y-%m-%dT%H:%M:%SZ")

常见误解

1. 注解不是标签

错误:注解和标签可以互换使用
正确:
- 标签:用于选择,有长度限制
- 注解:用于附加信息,几乎无长度限制

选择正确的工具完成正确的任务

2. 注解不影响功能

错误:删除注解会影响 Pod 运行
正确:注解是可选的附加信息

除非工具明确依赖某个注解,否则删除不影响功能

3. 注解值可以是任意字符串

错误:注解值必须是简单字符串
正确:注解值可以是:
- 短文本
- 多行文本
- JSON
- URL
- 任意字符串

小结

要点说明
注解定义附加到资源的键值对
与标签区别不用于选择,无长度限制
添加方式YAML 或 kubectl annotate
查看方式jsonpath 输出
典型用途构建信息、运维信息、工具配置
最佳实践使用前缀、有意义的键名

练习编辑器

bash
Loading...

继续学习

完成本课后,建议继续学习下一课「Deployment 是什么」 以巩固所学知识。