2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

ConfigMap で設定した環境変数を Secret で上書きする

2
Posted at

背景

ある Helm チャートが Secret のみで Pod の環境変数を管理していました。しかしキー数が増えると Secret の管理が煩雑になるため、機密情報以外は ConfigMap で管理したいという要件が生まれました。

ただし、同じ Helm チャートを既に利用しているユーザーへの後方互換性を壊したくありません。具体的には「Secret だけで全環境変数を設定できる状態」を維持しつつ、新たに ConfigMap も併用できる構成にする必要があります。

envFrom の優先順位

Kubernetes の公式ドキュメントには、次のような記述があります。

Pod - Environment Variables

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_AKEY_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 チャートの段階的な移行にも有効です。

2
1
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
2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?