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/dockerconfigjson | Dockerレジストリの認証情報 |
| kubernetes.io/tls | TLS証明書(cert + key) |
| kubernetes.io/basic-auth | Basic認証(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の再起動が必要です。