はじめに
kubernetesでは、各リソースを分類するタグみたいなもの(メタデータ)を付けることができます。
そのタグには「アノテーション」と「ラベル」の二種類があるので、違いやユースケースをまとめます。
アノテーション
アノテーションは「metadata.annotations」に設定できるが、ユーザーが設定するというよりは、システムが自動で付与するもの。
※ユーザーが設定することもできる。
ユーザーが設定する
以下のようにyamlファイルに書いて設定できる。特に意味を持たないメモ書き的に利用することが多い。
apiVersion: v1
kind: Pod
metadata:
name: sample-web1
annotations:
ann1: value1
ann2: value2
spec:
containers:
- name: nginx
image: nginx:latest
システムが自動で設定する
上記のyamlファイルでデプロイしたPodを確認すると、自動で設定されたアノテーションが確認できる。
$ kubectl get pod sample-web1 -o yaml
apiVersion: v1
kind: Pod
metadata:
annotations:
ann1: value1 <- ユーザが設定
ann2: value2 <- ユーザが設定
cni.projectcalico.org/podIP: 192.168.69.238/32 <- システムが設定
cni.projectcalico.org/podIPs: 192.168.69.238/32 <- システムが設定
kubectl.kubernetes.io/last-applied-configuration: <- システムが設定|
{"apiVersion":"v1","kind":"Pod","metadata":{"annotations":{"ann1":"value1","ann2":"value2"},"name":"sample-web1","namespace":"default"},"spec":{"containers":[{"image":"nginx:latest","name":"nginx"}]}}
creationTimestamp: "2020-03-06T12:50:14Z"
name: sample-web1
・・・
この特性を活かして、AWSはGCPなどのマネージドKubernetesサービスで利用されているらしい。(未確認)
Kubernetesは「Build once, run anywhere」(だっけ?)が求められるので、例えばAWSでビルドされたイメージはAWS以外でもデプロイできないといけないので、環境依存がある設定にアノテーションが使われている。
なので、ユーザー自身が何かしら環境依存のあるシステムで使わない限りは意識する必要がない(と理解した)。
ラベル
ラベルはその名の通り、各リソースにラベルを付けることができる。「metadata.labels」で設定する。
apiVersion: v1
kind: Pod
metadata:
name: sample-web2
labels:
label1: sysA
label2: prd
spec:
containers:
- name: nginx
image: nginx:latest
$ kubectl get pod -L label1,label2
NAME READY STATUS RESTARTS AGE LABEL1 LABEL2
sample-web1 1/1 Running 0 25m
sample-web2 1/1 Running 0 52s sysA prd
ユースケースとしては、システムごと(sysA, sysB, sysCなど)、環境ごと(prd, stg, devなど)なんかが考えられる。
ラベルを基にReplicasetを作成したり、LBが転送したりするようなので、これらを試すときに意識しておこう。