コンテンツにスキップ

Kubernetes マニフェストファイルにおけるアノテーションの役割

原文

Kubernetes に関する質問 Kubernetes のマニフェストファイルにおいて、アノテーションの役割は何ですか?

要約

K8sマニフェスト内のannotationsフィールドの目的と、labelsとの違いを問う面接質問。

回答

アノテーションは メタデータを付与する仕組み で、Kubernetesの内部動作には影響しないが、外部ツールやコントローラーが情報を読み取るために使う。ラベルとは「選択(セレクタ)に使えるかどうか」が決定的に異なる。

解説

Labels vs Annotations の違い

項目 Labels Annotations
目的 オブジェクトの識別・選択 補足情報の付与
セレクタで使える はい いいえ
値の制約 63文字以内、英数字のみ 制約なし(大きなデータも可)
主な用途 グルーピング、フィルタリング ツール連携、設定情報
apiVersion: v1
kind: Pod
metadata:
  name: my-app
  labels:
    # ← セレクタで選択可能。Serviceのルーティングなどに使う
    app: web-server
    environment: production
  annotations:
    # ← 補足情報。K8sは内部では使わないが、外部ツールが読む
    prometheus.io/scrape: "true"
    prometheus.io/port: "9090"
    kubernetes.io/change-cause: "Update image to v2.1"

アノテーションの代表的なユースケース

1. 外部ツール連携

annotations:
  # Prometheusにメトリクスを収集させる
  prometheus.io/scrape: "true"
  prometheus.io/port: "9090"

  # Nginx Ingress Controllerの設定
  nginx.ingress.kubernetes.io/rewrite-target: /
  nginx.ingress.kubernetes.io/ssl-redirect: "true"

  # cert-managerでTLS証明書を自動取得
  cert-manager.io/cluster-issuer: "letsencrypt-prod"

2. デプロイ情報の記録

annotations:
  # ロールバック時に変更理由を確認できる
  kubernetes.io/change-cause: "Deploy v2.1: fix login bug"

  # デプロイ時のメタ情報
  deploy.company.com/deployed-by: "ci-pipeline"
  deploy.company.com/git-commit: "abc123def"

3. Ingress / ロードバランサー設定

# AWS ALBの設定をアノテーションで行う例
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  annotations:
    alb.ingress.kubernetes.io/scheme: internet-facing
    alb.ingress.kubernetes.io/target-type: ip
    alb.ingress.kubernetes.io/certificate-arn: arn:aws:acm:...

→ AWS Load Balancer ControllerがこのアノテーションをALBの設定に使う

なぜLabelsではダメなのか

  • Labelsは 63文字以内の単純な値 しか持てない
  • アノテーションは 任意長の複雑な値(JSON文字列、URL等)を持てる
  • Labelsはセレクタのマッチングに毎回使われるため、軽量である必要がある
  • アノテーションは必要な時だけ読まれるため、重いデータでもOK

面接で差がつくポイント

  1. 「Labels = 識別・選択用、Annotations = 補足情報用」の明確な区別
  2. 具体的なアノテーションの例(Prometheus、Ingress、cert-manager等)を挙げられる
  3. 値の制約の違い(Labelsは軽量、Annotationsは制約なし)を説明できる

リンク