設定管理
ConfigMap、Secret、環境変数
設定管理の基本
Kubernetesではアプリケーションコードと設定を分離。 ConfigMapで一般設定、Secretで機密情報を管理し、環境変数やボリュームとしてPodに注入。
ConfigMap
ConfigMapは非機密の設定データをキーバリューで保存。 環境変数、コマンドライン引数、設定ファイルとして利用可能。
configmap.yaml
yaml
1 apiVersion: v1 2 kind: ConfigMap 3 metadata: 4 name: app-config 5 data: 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作成 2 kubectl create configmap app-config --from-literal=KEY=value 3 kubectl create configmap app-config --from-file=config.properties 4 kubectl create configmap app-config --from-env-file=.env 5 6 # 確認 7 kubectl get configmap 8 kubectl describe configmap app-config 9 kubectl 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
1 apiVersion: v1 2 kind: Secret 3 metadata: 4 name: db-credentials 5 type: Opaque 6 data: 7 # Base64エンコード: echo -n 'value' | base64 8 username: YWRtaW4= 9 password: cGFzc3dvcmQxMjM= 10 11 --- 12 # stringDataを使うとプレーンテキストで記述可能 13 apiVersion: v1 14 kind: Secret 15 metadata: 16 name: db-credentials 17 type: Opaque 18 stringData: 19 username: admin 20 password: password123
1 # Secret作成 2 kubectl create secret generic db-credentials \ 3 --from-literal=username=admin \ 4 --from-literal=password=secret 5 6 # TLS Secret 7 kubectl create secret tls tls-secret \ 8 --cert=tls.crt --key=tls.key 9 10 # Docker Registry Secret 11 kubectl create secret docker-registry regcred \ 12 --docker-server=registry.example.com \ 13 --docker-username=user \ 14 --docker-password=pass 15 16 # 確認(値はマスク) 17 kubectl get secret 18 kubectl describe secret db-credentials
ConfigMap/Secretの使用方法
pod-with-config.yaml
yaml
1 apiVersion: v1 2 kind: Pod 3 metadata: 4 name: app 5 spec: 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を再起動 2 kubectl rollout restart deployment/app 3 4 # またはannotationで強制更新 5 kubectl 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とサイドカー連携