Kustomize
を使っていて、label
の値を取れたらいいのに・・・って思っていました。
結論は Kustomize
は関係ないのですが、metadata.labels['KEY']
で取得できます。
困ってたこと
Kustomize
の commmonLabels
や namePrefix
, nameSuffix
は便利ですし、各種リソースも命名を追従してくれるのですが、args:
や commands:
などで svc
を直打ちしたい時は流石にKustomize
では追従できず不便(baseにまとめずらい)でした。
調べると fieldRef:
で取得できそうなのですが、環境変数によりコンテナにPod情報を共有するなどをみても labels:
に触れておらず、ダメもとでfieldPath: metadata.labels
としてもエラー文のサポートに含まれていませんでした。。
$ kubectl kustomize .
apiVersion: v1
kind: Pod
metadata:
labels:
app: sample
env: stg
name: sample-stg
spec:
containers:
- command:
- sleep
- "1000"
env:
- name: MY_LABEL
valueFrom:
fieldRef:
fieldPath: metadata.labels
image: busybox:1.28
name: sample
$ kubectl kustomize . | kubectl aapply -f -
The Pod "sample-stg" is invalid: spec.containers[0].env[0].valueFrom.fieldRef.fieldPath: Unsupported value: "metadata.labels": supported values: "metadata.name", "metadata.namespace", "metadata.uid", "spec.nodeName", "spec.serviceAccountName", "status.hostIP", "status.podIP"
そんな折に、Expose Pod Information to Containers Through Filesにヒントが書いてありました。
Information available via fieldRef:
metadata.name - the pod’s name
metadata.namespace - the pod’s namespace
metadata.uid - the pod’s UID, available since v1.8.0-alpha.2
metadata.labels[''] - the value of the pod’s label (for example, metadata.labels['mylabel']); available in Kubernetes 1.9+
metadata.annotations[''] - the value of the pod’s annotation (for example, metadata.annotations['myannotation']); available in Kubernetes 1.9+
Keyで指定すればいいのか!と思っていたらラベル(Labels)とセレクター(Selectors)にちゃんと書いてありました。
ラベル(Labels) はPodなどのオブジェクトに割り当てられたキーとバリューのペアです。
ドキュメントはちゃんと読まないとダメですね。。
動作確認
次のように metadata.labels['KEY']
を与えることで取得できます。
kustomization.yaml
nameSuffix: -stg
commonLabels:
env: stg
resources:
- pod.yaml
pod.yaml
apiVersion: v1
kind: Pod
metadata:
labels:
app: sample
name: sample
spec:
containers:
- command:
- sleep
- "1000"
image: busybox:1.28
name: sample
env:
- name: MY_LABEL
valueFrom:
fieldRef:
fieldPath: metadata.labels['env'] # <--- 追加
buildした結果を確認
$ kubectl kustomize .
apiVersion: v1
kind: Pod
metadata:
labels:
app: sample
env: stg # <--- これを読み取ってくる
name: sample-stg
spec:
containers:
- command:
- sleep
- "1000"
env:
- name: MY_LABEL
valueFrom:
fieldRef:
fieldPath: metadata.labels['env']
image: busybox:1.28
name: sample
envに登録されていることを確認
$ kubectl exec -it sample-stg -- /bin/sh
/ # env | grep LABEL
MY_LABEL=stg
/ # echo $MY_LABEL
stg
/ # exit
まとめ
簡単なことですがググってもダイレクトに書いてあるリソースが見つからなかったので、書いてみました。