Mímisbrunnr知恵の泉

← クラウドインフラ 一覧

🎓 レベル:標準 | 重要度:A(必須)

📎 前提:Pod・Deployment・ReplicaSet | 関連:Service・IngressIaCとは・宣言的構成

要点(BLUF)

概念 ── 設定・秘密・状態を本体から外に出す

同じイメージを開発・本番で使い回すには、環境差(接続先・フラグ)をイメージに焼かず、外から注入する必要があります。秘密情報も同様に、コードやイメージに埋めない(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 はオンデマンドで自動払い出し(動的プロビジョニング)

なぜ分離するのか

⚠️ よくある誤解・落とし穴

対応ラボ

cloud-infra-study/labs/04-04_config_secret.yaml(ConfigMap と Secret を作り、Deployment に環境変数で注入。kubectl exec で Pod 内の環境変数を確認。kind/minikube で)。

関連

第4章 Kubernetes 目次