Posted at

yamlのアンカー機能でDeploymentのラベル付を少し楽にする


目的


  • 運用管理のためにリソースにlabel付を強制したい

  • Deploymentではdeployment.metadata.labelだけでなくdeployment.spec.template.metadata.labelにもラベルを付けたい


    • Deploymentが作成するReplicaSetやPodなどにもラベルをつけるためにdeployment.spec.template.metadata.labelのラベル付が必要

    • 絶対忘れるのでdeployment.metadata.labelを設定するだけで良いようにしたい




対策


  • label付強制の方法は別途検討(OPAなどのvalidationを利用)


  • deployment.spec.template.metadata.labelにラベルつけ忘れる問題に対しては、yamlのアンカー機能を利用する


yamlのアンカー機能とは


やってみる



  • 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のラベル付を簡易化しました。付け忘れ防止にもつながると考えています。