🎓 レベル:標準 | 重要度:A(必須)
📎 前提:Pod・Deployment・ReplicaSet | 関連:Service・Ingress・IaCとは・宣言的構成
要点(BLUF)
- 設定はコードから分離する(12-Factor の思想)。環境ごとに変わる値は ConfigMap、秘密情報は Secret に入れ、Podに環境変数やファイルとして注入する。
- Secret は機密値を扱う専用リソース。ただし既定では Base64 エンコードなだけで暗号化ではない——保管時暗号化や外部シークレットストアの併用が要る(要最新確認)。
- Pod は使い捨て。残すデータは PersistentVolume(PV) を PersistentVolumeClaim(PVC) で要求してマウントする。
概念 ── 設定・秘密・状態を本体から外に出す
同じイメージを開発・本番で使い回すには、環境差(接続先・フラグ)をイメージに焼かず、外から注入する必要があります。秘密情報も同様に、コードやイメージに埋めない(Dockerイメージとレイヤ の落とし穴)。データも、Podが消えても残るよう外に置く。設定・秘密・状態を本体から分離するのが本トピックの主題です。
flowchart LR
cm["ConfigMap(非機密の設定)"] -->|"環境変数 / ファイル"| pod["Pod"]
sec["Secret(機密:パスワード・トークン)"] -->|"環境変数 / ファイル"| pod
pvc["PVC(永続ボリューム要求)"] -->|"マウント"| pod
pv["PersistentVolume(実体ストレージ)"] --- pvc
仕組み ── ConfigMap と Secret
ConfigMap=非機密の設定(ログレベル・接続先ホスト・機能フラグ)。Secret=機密(DBパスワード・APIトークン・TLS鍵)。どちらもPodに環境変数かファイルとして渡せます。
apiVersion: v1
kind: ConfigMap
metadata:
name: app-config
data:
LOG_LEVEL: "info"
DB_HOST: "db.internal"
---
apiVersion: v1
kind: Secret
metadata:
name: app-secret
type: Opaque
stringData: # stringData なら平文で書ける(保存時にBase64化される)
DB_PASSWORD: "s3cr3t"
# Pod 側で注入する(Deployment の containers 内)
envFrom:
- configMapRef: { name: app-config } # ConfigMap を丸ごと環境変数に
env:
- name: DB_PASSWORD
valueFrom:
secretKeyRef: { name: app-secret, key: DB_PASSWORD }
⚠️ Secret は既定では Base64 = 暗号化ではない。クラスタの etcd 保管時暗号化を有効にし、機密性が高い用途は外部シークレットストア(クラウドのシークレットマネージャ等・要最新確認)と連携する。クラウド/コンテナの秘密管理の深掘りは サイバーセキュリティ へ。
仕組み ── PersistentVolume と PVC
ストレージは「提供(PV)」と「要求(PVC)」を分離します。アプリは「10GiBのストレージが欲しい」と PVC で要求するだけで、実体(クラウドのディスク等)は PV が用意します。コンテナのボリューム(コンテナのネットワークとボリューム)のクラスタ版です。
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: data
spec:
accessModes: ["ReadWriteOnce"]
resources:
requests:
storage: 10Gi
# StorageClass を使えば PV はオンデマンドで自動払い出し(動的プロビジョニング)
なぜ分離するのか
- 同じイメージを再利用するため:設定を外に出せば、開発・検証・本番で同一イメージを流用でき、ビルドが1回で済む(再現性)。
- 秘密をコードから守るため:イメージやgitに秘密を埋めない。漏洩経路を断つ(パッケージとユーザー・SSH の鍵管理と同じ発想)。
- 状態を残すため:Podが消えてもPVのデータは残る。ステートフルなDB等を載せられる。
⚠️ よくある誤解・落とし穴
- 「Secret は暗号化されている」→ 既定は Base64 のみ。保管時暗号化・外部ストアを別途。git に Secret manifest を平文コミットしない。
- 「設定をイメージに焼く」→ 環境ごとにビルドが要る・秘密が残る。ConfigMap/Secret で注入。
- 「ConfigMap を更新したら即反映」→ 環境変数で渡した値はPod再作成まで変わらない。反映には rollout が要る場合がある。
- 「ReadWriteOnce を複数ノードで共有」→ RWO は基本1ノード。複数ノード共有は ReadWriteMany 対応のストレージが要る。
- 「PVC を消すとデータも即消える」→ ReclaimPolicy 次第。重要データは Retain と バックアップを。
対応ラボ
cloud-infra-study/labs/04-04_config_secret.yaml(ConfigMap と Secret を作り、Deployment に環境変数で注入。kubectl exec で Pod 内の環境変数を確認。kind/minikube で)。
関連
- 注入先の Pod/Deployment は Pod・Deployment・ReplicaSet
- コンテナ単体のボリュームは コンテナのネットワークとボリューム
- 設定をコード管理する思想は IaCとは・宣言的構成
- 責任共有における利用者側の責務は 責任共有モデルとリージョン/AZ