目的
- 運用管理のためにリソースにlabel付を強制したい
- Deploymentでは
deployment.metadata.label
だけでなくdeployment.spec.template.metadata.label
にもラベルを付けたい- Deploymentが作成するReplicaSetやPodなどにもラベルをつけるために
deployment.spec.template.metadata.label
のラベル付が必要 - 絶対忘れるので
deployment.metadata.label
を設定するだけで良いようにしたい
- Deploymentが作成するReplicaSetやPodなどにもラベルをつけるために
対策
- label付強制の方法は別途検討(OPAなどのvalidationを利用)
-
deployment.spec.template.metadata.label
にラベルつけ忘れる問題に対しては、yamlのアンカー機能を利用する
yamlのアンカー機能とは
- YAML では、データに「&name」で印をつけ、「*name」で参照することができる
- 前者をアンカー (Anchor)、後者をエイリアス (Alias) という
- 参照の方法にはいくつか種類があり、以下ではExtend(
<<
)を利用する
- 詳しくは「 YamlのAnchor&、Extend<<、Extended Inline<< &について - Kekeの日記」を参照
やってみる
-
deployment.metadata.label
のラベルをdeployment.spec.template.metadata.label
で参照するようにする
apiVersion: apps/v1
kind: Deployment
metadata:
labels: &top_labels
name: paper2
version: v1.0
app: nginx
name: nginx
spec:
replicas: 1
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
<<: *top_labels
spec:
containers:
- image: nginx
name: nginx
これをKubernetesに適用すると以下のような結果になります。
⇒ kubectl get all --show-labels
NAME READY STATUS RESTARTS AGE LABELS
pod/nginx-dfcb86c9c-twzks 1/1 Running 0 19m app=nginx,name=paper2,pod-template-hash=dfcb86c9c,version=v1.0
...
NAME READY UP-TO-DATE AVAILABLE AGE LABELS
deployment.apps/nginx 1/1 1 1 19m app=nginx,name=paper2,version=v1.0
NAME DESIRED CURRENT READY AGE LABELS
replicaset.apps/nginx-dfcb86c9c 1 1 1 19m app=nginx,name=paper2,pod-template-hash=dfcb86c9c,version=v1.0
deployment.spec.template.metadata.label
にlabelを付けているのでpodやreplicasetにもラベルが付きました。
この設定により、ラベルを指定したpodの選択ができたりします。ツールによってはpodのラベルを指定するようなツールもあるので利用できます。
⇒ kubectl get po -l app=nginx
NAME READY STATUS RESTARTS AGE
nginx-5c7588df-8f8fz 1/1 Running 0 2m6s
まとめ
アンカー機能を用いてDeploymentのラベル付を簡易化しました。付け忘れ防止にもつながると考えています。