1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

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

Posted at

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

まとめ

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

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?