背景
ある Helm チャートが Secret のみで Pod の環境変数を管理していました。しかしキー数が増えると Secret の管理が煩雑になるため、機密情報以外は ConfigMap で管理したいという要件が生まれました。
ただし、同じ Helm チャートを既に利用しているユーザーへの後方互換性を壊したくありません。具体的には「Secret だけで全環境変数を設定できる状態」を維持しつつ、新たに ConfigMap も併用できる構成にする必要があります。
envFrom の優先順位
Kubernetes の公式ドキュメントには、次のような記述があります。
envFrom ([]EnvFromSource)
... When a key exists in multiple sources, the value associated with the last source will take precedence. Values defined by an Env with a duplicate key will take precedence.
つまり envFrom は後勝ちです。同じキーが複数のソースに存在する場合、リストの後ろに書いたソースの値が採用されます。
今回のケースでは次のように記述すれば意図通りの動作になります。
envFrom:
- configMapRef:
name: my-configmap # 先に書く(デフォルト値)
- secretRef:
name: my-secret # 後に書く(上書き値・後勝ち)
動作確認
マニフェストの準備
以下のマニフェストで確認します。
-
ConfigMap:
KEY_AとKEY_Bを定義 -
Secret:
KEY_Cを定義 -
Deployment:
envFromで ConfigMap → Secret の順に参照
# test.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: test-configmap
data:
KEY_A: aaa
KEY_B: bbb
---
apiVersion: v1
kind: Secret
metadata:
name: test-secret
stringData:
KEY_C: ccc
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: test
spec:
replicas: 1
selector:
matchLabels:
app: test
template:
metadata:
labels:
app: test
spec:
containers:
- name: busybox
image: busybox
command:
- sleep
- "3600"
envFrom:
- configMapRef:
name: test-configmap
- secretRef:
name: test-secret
kubectl apply -f test.yaml
① キーが重複しない場合
Pod の環境変数を確認します。
$ kubectl exec deploy/test -- env
...
KEY_A=aaa
KEY_B=bbb
KEY_C=ccc
ConfigMap と Secret でキーが異なるため、すべての値がそのまま展開されています。
② キーが重複する場合(Secret で上書き)
次に KEY_B を Secret にも追加します。
# secret.yaml
apiVersion: v1
kind: Secret
metadata:
name: test-secret
stringData:
KEY_B: xxx # ConfigMap の KEY_B=bbb を上書きする
KEY_C: ccc
Secret を更新して Deployment を再起動します。
$ kubectl apply -f secret.yaml
$ kubectl rollout restart deploy/test
deployment.apps/test restarted
$ kubectl exec deploy/test -- env
...
KEY_A=aaa
KEY_B=xxx # Secret の値で上書きされた
KEY_C=ccc
想定通り、重複した KEY_B は Secret の値 xxx で上書きされました。
まとめ
| 優先度 | ソース | 説明 |
|---|---|---|
| 低 | ConfigMap(先に記述) | デフォルト値・非機密設定 |
| 高 | Secret(後に記述) | 機密値・個別上書き設定 |
envFrom のリスト順を活用することで、ConfigMap をデフォルト値として使いつつ、必要なキーだけ Secret で上書きする構成が実現できます。既存の「Secret のみ」の運用とも互換性を保てるため、Helm チャートの段階的な移行にも有効です。