Chuyển đến nội dung chính

レッスン6: ConfigMaps & Secrets

ConfigMapとSecretの作成方法(imperative/declarative)。環境変数(envFrom/valueFrom)と ボリュームマウントによるPodへの注入。自動更新の動作と制限。

ConfigMaps & Secrets — 環境変数注入とボリュームマウント

1. ConfigMap

# Imperative — コマンドで素早く作成
kubectl create configmap app-config \
  --from-literal=DB_HOST=mysql \
  --from-literal=DB_PORT=3306

kubectl create configmap app-config --from-file=config.properties

# Declarative — YAMLファイルで作成
apiVersion: v1
kind: ConfigMap
metadata:
  name: app-config
data:
  DB_HOST: mysql
  DB_PORT: "3306"         # 値は常に文字列
  app.properties: |       # マルチラインデータ
    server.port=8080
    logging.level=INFO

2. Secrets

# Imperative
kubectl create secret generic db-secret \
  --from-literal=username=admin \
  --from-literal=password=s3cr3t

# Declarative(値はbase64エンコードが必要)
apiVersion: v1
kind: Secret
metadata:
  name: db-secret
type: Opaque
data:
  username: YWRtaW4=       # echo -n "admin" | base64
  password: czNjcjN0       # echo -n "s3cr3t" | base64

# stringDataを使用(プレーンテキスト、Kubernetes側で自動エンコード)
apiVersion: v1
kind: Secret
metadata:
  name: db-secret
type: Opaque
stringData:
  username: admin
  password: s3cr3t
Secretタイプ用途
Opaque(デフォルト)任意のkey-valueデータ
kubernetes.io/dockerconfigjsonDockerレジストリの認証情報
kubernetes.io/tlsTLS証明書(cert + key)
kubernetes.io/basic-authBasic認証(username + password)

試験のポイント: Secretはbase64でエンコードされていますが、暗号化されていません。base64は誰でもデコードできます。本番環境ではEncryption at Restを有効にするか、External Secrets Operatorを使用すべきです。CKADではstringData(プレーンテキスト)とdata(base64)の使い分けがよく出題されます。

3. 環境変数として注入

# envFrom — ConfigMap/Secretの全キーを環境変数として注入
env:
  envFrom:
  - configMapRef:
      name: app-config
  - secretRef:
      name: db-secret

# valueFrom — 特定のキーを1つずつ環境変数として注入
env:
- name: DATABASE_HOST
  valueFrom:
    configMapKeyRef:
      name: app-config
      key: DB_HOST
- name: DATABASE_PASSWORD
  valueFrom:
    secretKeyRef:
      name: db-secret
      key: password

4. ボリュームとして注入

spec:
  containers:
  - name: app
    image: myapp
    volumeMounts:
    - name: config-volume
      mountPath: /etc/config     # 各キーがファイルになる
      readOnly: true
    - name: secret-volume
      mountPath: /etc/secrets
      readOnly: true
  volumes:
  - name: config-volume
    configMap:
      name: app-config
  - name: secret-volume
    secret:
      secretName: db-secret

# ボリュームマウント後のファイル構造:
# /etc/config/DB_HOST        → ファイル内容: "mysql"
# /etc/config/DB_PORT        → ファイル内容: "3306"
# /etc/secrets/username      → ファイル内容: "admin"
# /etc/secrets/password      → ファイル内容: "s3cr3t"

5. 自動更新の動作

注入方法自動更新備考
環境変数(envFrom/valueFrom)されないPod再起動が必要
ボリュームマウントされる(遅延あり)kubeletの同期間隔に依存(デフォルト約60秒)

6. チートシート

タスクコマンド / YAML
ConfigMapを素早く作成kubectl create cm name --from-literal=k=v
Secretを素早く作成kubectl create secret generic name --from-literal=k=v
全キーを環境変数に注入envFrom: configMapRef/secretRef
ファイルとしてマウントvolumes: configMap/secret + volumeMounts
base64エンコードecho -n "text" | base64
base64デコードecho "encoded" | base64 -d

7. 練習問題

Q1: ConfigMap "app-config"の全キーを環境変数としてPodに注入する正しいYAML構文はどれですか?

  • A) env: - configMapRef: name: app-config
  • B) envFrom: - configMapRef: name: app-config ✓
  • C) envFrom: - configMap: name: app-config
  • D) env: - valueFrom: configMapRef: name: app-config

解説: envFromはConfigMapまたはSecretの全キーを環境変数として一括注入します。正しいキーはconfigMapRef(ConfigMapの場合)またはsecretRef(Secretの場合)です。valueFromは個別のキーを1つずつ注入する場合に使用します。

Q2: Secret YAMLのdataフィールドに値を設定する際、値はどの形式で記述する必要がありますか?

  • A) プレーンテキスト
  • B) base64エンコード ✓
  • C) SHA256ハッシュ
  • D) AES暗号化

解説: Secretのdataフィールドの値はbase64エンコードが必要です。プレーンテキストで記述したい場合はstringDataフィールドを使用します。base64はエンコードであり暗号化ではないことに注意 — セキュリティのためではなくバイナリデータの格納のための仕様です。

Q3: ConfigMapをボリュームマウントでPodに注入しています。ConfigMapの値を更新した後、Podを再起動せずに変更が反映されますか?

  • A) いいえ、常にPodの再起動が必要
  • B) はい、ボリュームマウントの場合はkubeletの同期間隔後に自動更新される ✓
  • C) はい、即座に反映される
  • D) ConfigMapは一度作成すると変更できない(immutable)

解説: ボリュームマウントの場合、kubeletが定期的にConfigMapの変更を検出してファイルを更新します(デフォルト約60秒の遅延)。ただし環境変数(envFrom/valueFrom)として注入した場合は自動更新されず、Podの再起動が必要です。