Kubernetes の Annotation って何用? と思って確認してみた

概要

kubenetes を使い始めたのですが annotation っていつ使うんだろーと思って
放置していたのでちゃんと調べてみました。

ただし実行環境はOpenShiftを使っています。
中身はk8sなのであんまり違いはないかなと。

詳細

まず適当なPodを作成してみます。

$ cat pod_sample.yml 
apiVersion: v1
kind: Pod
metadata:
  name: nginx
  labels:
    app: test
spec:
  containers:
  - name: nginx
    image: bitnami/nginx:latest
    ports:
    - containerPort: 8080
$ oc apply -f pod_sample.yml 
pod/nginx created

次にPodの情報を表示します。

$ oc get po nginx -o yaml
apiVersion: v1
kind: Pod
metadata:
  annotations:
    kubectl.kubernetes.io/last-applied-configuration: |
      {"apiVersion":"v1","kind":"Pod","metadata":{"annotations":{},"labels":{"app":"test"},"name":"nginx","namespace":"default"},"spec":{"containers":[{"image":"bitnami/nginx:latest","name":"nginx","ports":[{"containerPort":8080}]}]}}
    openshift.io/scc: anyuid
  creationTimestamp: 2019-02-21T07:01:20Z
  labels:
    app: test
  name: nginx
  namespace: default

特に指示していないのに勝手にannotationが付与されています。

公式のドキュメントにはこう書いてあります。

Attaching metadata to objects You can use either labels or annotations to attach metadata to Kubernetes objects. Labels can be used to select objects and to find collections of objects that satisfy certain conditions. In contrast, annotations are not used to identify and select objects. The metadata in an annotation can be small or large, structured or unstructured, and can include characters not permitted by labels.

つまり、annotationを使ってk8sのリソースオブジェクトに対してメタデータを付与するんだよ、ってことですね。 そこはサラッと知っていたんですが、誰のために どんな情報を ってところを確認したいと思います。

すでにこことか ここ のブログにLabelとAnnotationの違いと使う方が記載されています。

  • オブジェクトの変更理由の記録
  • 特別なスケジューラへの、特別なスケジュールポリシーの伝達
  • リソースを更新したツールと、それがどのように更新したかの情報の付加
  • 他のツールからの更新検知などのため
  • Deployment オブジェクトによるロールアウトのための、ReplicaSet の追跡情報の保存など。(入門 Kubernetes P.77)

実際に運用していないから経験値が不足しまくっているけどひねり出してみると
「運用者が担当範囲のnamespaceをみると知らないPodが稼働してたけど
annotationを見るとk8s管理者が作成したものらしいから静観でいっか」みたいな感じかな。

とりあえず機能の位置づけと、Labelとは全く異なるものだと理解できたので良かったです。