Kubernetesでは、アプリケーションの実行に必要な設定や認証情報をコンテナに直接書き込まずに、外から注入するのがベストプラクティスです。
それを可能にするのが ConfigMap と Secret です。
🔹 ConfigMap:設定値を外出しにする
ConfigMapは、設定ファイルや環境変数などを外部から注入するためのリソースです。
利用する場面
- アプリの実行ポート、モード(dev/prod)、接続先URLなど
- ソースコードを変えずに、設定だけ切り替えたいとき
例:ConfigMapの定義
apiVersion: v1
kind: ConfigMap
metadata:
name: app-config
data:
APP_MODE: "production"
PORT: "8080"
このConfigMapをPodにマウントすると、以下のように環境変数として使えます:
spec:
containers:
- name: myapp
image: myapp:latest
envFrom:
- configMapRef:
name: app-config
✅ これでアプリの中では APP_MODE
や PORT
の値が環境変数として参照できます。
🔸 Secret:パスワードやトークンなどの機密情報を安全に管理
Secretは、機密性の高い情報(例:DBのパスワード、APIキー)を暗号化して管理するためのリソースです。
特徴
- Base64でエンコードされ、Kubernetes内部では保護されて管理される
- Podに環境変数やファイルとして注入可能
- 権限管理(RBAC)と組み合わせることでアクセス制御ができる
例:Secretの定義(Base64)
echo -n 'mypassword' | base64
# → bXlwYXNzd29yZA==
apiVersion: v1
kind: Secret
metadata:
name: db-secret
type: Opaque
data:
DB_PASSWORD: bXlwYXNzd29yZA==
Pod内で環境変数として渡すには:
env:
- name: DB_PASSWORD
valueFrom:
secretKeyRef:
name: db-secret
key: DB_PASSWORD
💡 Base64は「暗号」ではなく「エンコード」です。
より安全にするには、KMS(鍵管理システム)やSealed Secretsなどの仕組みと組み合わせます。
📦 ConfigMapとSecretの使い分け
項目 | ConfigMap | Secret |
---|---|---|
用途 | 一般的なアプリ設定 | パスワード、トークンなど機密情報 |
データ形式 | プレーンテキスト | Base64エンコード(内部で暗号化) |
表示・編集 | 誰でも確認しやすい | 権限が必要 |
セキュリティ | 高くない(誰でも見える) | 高め(RBACと連携して保護) |
🧩 どのようにPodに渡せるの?
ConfigMapもSecretも、以下の方法でPodに渡せます:
方法 | 説明 |
---|---|
環境変数 | env または envFrom で渡す |
ボリュームマウント | ファイルとして /etc/config/... に渡す |
コマンド引数 | args , command で参照も可能 |
💡 実践のヒント
- 環境ごとに設定を変えたい → ConfigMapを環境別に定義
- パスワードを含めたくない → Secretで分離し、
.gitignore
を徹底 - HelmやKustomize と併用すれば、ConfigMap/Secretの管理がさらに柔軟になります