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
面接で差がつくポイント¶
- 「Labels = 識別・選択用、Annotations = 補足情報用」の明確な区別
- 具体的なアノテーションの例(Prometheus、Ingress、cert-manager等)を挙げられる
- 値の制約の違い(Labelsは軽量、Annotationsは制約なし)を説明できる