Help us understand the problem. What is going on with this article?

FieldRef.labels['KEY'] を知らなかった

Kustomize を使っていて、label の値を取れたらいいのに・・・って思っていました。
結論は Kustomize は関係ないのですが、metadata.labels['KEY'] で取得できます。

困ってたこと

KustomizecommmonLabelsnamePrefix, 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

まとめ

簡単なことですがググってもダイレクトに書いてあるリソースが見つからなかったので、書いてみました。

sourjp
Goタノシイ。Qiitaに書くほどでないことはblogに更新してます。
https://sourjp.github.io
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした