設定管理

ConfigMap、Secret、環境変数

設定管理の基本

Kubernetesではアプリケーションコードと設定を分離。 ConfigMapで一般設定、Secretで機密情報を管理し、環境変数やボリュームとしてPodに注入。

ConfigMap

ConfigMapは非機密の設定データをキーバリューで保存。 環境変数、コマンドライン引数、設定ファイルとして利用可能。

configmap.yaml
yaml
1apiVersion: v1
2kind: ConfigMap
3metadata:
4 name: app-config
5data:
6 # キーバリュー形式
7 DATABASE_HOST: "postgres"
8 DATABASE_PORT: "5432"
9 LOG_LEVEL: "info"
10
11 # ファイル形式
12 nginx.conf: |
13 server {
14 listen 80;
15 location / {
16 proxy_pass http://backend:8080;
17 }
18 }
19
20 config.json: |
21 {
22 "feature_flags": {
23 "new_ui": true
24 }
25 }
1# ConfigMap作成
2kubectl create configmap app-config --from-literal=KEY=value
3kubectl create configmap app-config --from-file=config.properties
4kubectl create configmap app-config --from-env-file=.env
5
6# 確認
7kubectl get configmap
8kubectl describe configmap app-config
9kubectl get configmap app-config -o yaml

Secret

Secretはパスワード、トークン、キーなどの機密情報を保存。 Base64エンコードされるが暗号化ではない点に注意。Encryption at restの設定推奨。

Opaque

汎用的なSecret(デフォルト)

kubernetes.io/tls

TLS証明書用

kubernetes.io/dockerconfigjson

Dockerレジストリ認証

kubernetes.io/basic-auth

Basic認証用

secret.yaml
yaml
1apiVersion: v1
2kind: Secret
3metadata:
4 name: db-credentials
5type: Opaque
6data:
7 # Base64エンコード: echo -n 'value' | base64
8 username: YWRtaW4=
9 password: cGFzc3dvcmQxMjM=
10
11---
12# stringDataを使うとプレーンテキストで記述可能
13apiVersion: v1
14kind: Secret
15metadata:
16 name: db-credentials
17type: Opaque
18stringData:
19 username: admin
20 password: password123
1# Secret作成
2kubectl create secret generic db-credentials \
3 --from-literal=username=admin \
4 --from-literal=password=secret
5
6# TLS Secret
7kubectl create secret tls tls-secret \
8 --cert=tls.crt --key=tls.key
9
10# Docker Registry Secret
11kubectl create secret docker-registry regcred \
12 --docker-server=registry.example.com \
13 --docker-username=user \
14 --docker-password=pass
15
16# 確認(値はマスク)
17kubectl get secret
18kubectl describe secret db-credentials

ConfigMap/Secretの使用方法

pod-with-config.yaml
yaml
1apiVersion: v1
2kind: Pod
3metadata:
4 name: app
5spec:
6 containers:
7 - name: app
8 image: myapp:latest
9
10 # 1. 環境変数として個別に注入
11 env:
12 - name: DATABASE_HOST
13 valueFrom:
14 configMapKeyRef:
15 name: app-config
16 key: DATABASE_HOST
17 - name: DB_PASSWORD
18 valueFrom:
19 secretKeyRef:
20 name: db-credentials
21 key: password
22
23 # 2. 全キーを環境変数として注入
24 envFrom:
25 - configMapRef:
26 name: app-config
27 - secretRef:
28 name: db-credentials
29
30 # 3. ボリュームとしてマウント
31 volumeMounts:
32 - name: config-volume
33 mountPath: /etc/config
34 - name: secret-volume
35 mountPath: /etc/secrets
36 readOnly: true
37
38 volumes:
39 - name: config-volume
40 configMap:
41 name: app-config
42 items: # 特定キーのみ
43 - key: nginx.conf
44 path: nginx.conf
45 - name: secret-volume
46 secret:
47 secretName: db-credentials
48 defaultMode: 0400 # パーミッション

更新と反映

ボリュームマウント

ConfigMap/Secret更新後、kubeletが自動で同期(デフォルト約1分)。 アプリが設定ファイルの変更を検知してリロードする必要あり。

環境変数

環境変数は更新されない。Podの再起動が必要。 Deployment更新(annotationの変更等)でローリングアップデート。

1# ConfigMap更新後にDeploymentを再起動
2kubectl rollout restart deployment/app
3
4# またはannotationで強制更新
5kubectl patch deployment app -p \
6 '{"spec":{"template":{"metadata":{"annotations":{"configHash":"v2"}}}}}'

SRE/インフラ観点

ConfigMapベストプラクティス

  • • 環境別(dev/staging/prod)でConfigMapを分離
  • • イミュータブルConfigMapの活用(immutable: true)
  • • Helmの values.yaml や Kustomize でテンプレート化

Secretベストプラクティス

  • • Secretをgit管理しない(SealedSecret、SOPS等を使用)
  • • Encryption at restを有効化
  • • 外部シークレット管理(Vault、AWS Secrets Manager)連携
  • • RBACでSecret参照権限を制限

外部シークレット管理

  • External Secrets Operator: 外部ストアとSecretを同期
  • Sealed Secrets: 暗号化してgit管理可能に
  • Vault Agent: HashiCorp Vaultとサイドカー連携