要約
kubectl get deployment 'your deployment name' -o jsonpath='{.spec.template.spec.containers[*].env[?(@.name=="YOUR_TARGET_ENV_NAME")].valueFrom.configMapKeyRef.name}'
対象読者
- kustomizeのConfigMapGeneratorを使ってる方
はじめに
kustomize便利ですね。複数の環境のk8s manifestをまとめられますし。ただConfigMapGeneratorを使うと少し面倒になることがありますよね。
環境変数を変更してrollout restartしたいとき、 kubectl edit configmap
などを使って環境変数を変更すると思います。ConfigMapGeneratorを使っているとこのConfigMapの名前を取るのが面倒になります。ConfigMapだと設定した名前をそのまま使えますが、ConfigMapGeneratorだとそうはいきません。ConfigMapGeneratorは毎回名前を生成するためです。名前の末尾に接尾辞がはいるためです。
名前をさがすとなると kubectl get pods -o yaml
や kubctl get deployment -o yaml
などでmanifestを目視しなければいけなくなります。毎回やるにはなかなか面倒です。
そこで -o jsonpath
オプションです。このオプションは取得したい要素を jsonPath で指定できます。 less
などを使って調べるよりより手早く対象を見つけられます。
もうすこし細かい説明
要約のjsonPath部分を抽出すると以下になります。
.spec.template.containers[*].env[?(@.name=="YOUR_TARGET_ENV_NAME")].valueFrom.configMapKeyRef.name
大体の部分はなんとなくわかるかなおもいます。以下の部分が少し分りづらいかなと思うので追加で説明します。
.env[?(@.name=="YOUR_TARGET_ENV_NAME")]
こちらはfilterという機能になります ?()
で囲まれた部分がフィルタです。 @
で自分の要素を指定し、その子要素の name
が ==
で指定された名前の要素のみを取り出します。
まとめ
DeploymentからConfigMapの名前を取る方法を記載しました。
基本、概要部分をコピペして適切に修正して使っていただければと思います。