はじめに
ConfigMap は、機密性のない設定情報をコンテナイメージから分離して保存するための仕組みです。これにより、開発モード、ログレベル、機能フラグ、エンドポイント名などの設定が異なる場合でも、同じアプリケーションイメージを再利用できるようになります。
この実験では、ConfigMap の作成、データの確認、Pod の設定への適用、ConfigMap の更新、そして更新された値を反映させるための Pod の再作成を行います。後の実験では、環境変数の詳細な設定や設定ファイルのマウントについて深く掘り下げますが、この実験では ConfigMap オブジェクトとアプリケーション設定の基本的なワークフローに焦点を当てます。
ConfigMap 用の名前空間の準備
このステップでは、ConfigMap の練習用にクリーンな名前空間を準備します。
/home/labex/project から開始します。このディレクトリ内に Pod のマニフェストを作成します。
mkdir -p /home/labex/project
cd /home/labex/project
Kubernetes API サーバーに接続できるか確認します。VM が起動した直後でノードの準備ができていない場合は、数秒待ってから再度コマンドを実行してください。
kubectl get nodes --request-timeout=5s
期待される出力例:
NAME STATUS ROLES AGE VERSION
labex-v135 Ready control-plane ... v1.35...
アプリケーションオブジェクトを作成する前に、クラスターのネットワーク Pod が Ready 状態になるまで待ちます。
kubectl wait --namespace kube-system --for=condition=Ready pod -l k8s-app=calico-node --timeout=120s
期待される出力:
pod/calico-node-... condition met
ckad-prep-configmaps という名前の名前空間を作成します。
kubectl create namespace ckad-prep-configmaps
この名前空間を現在のコンテキストの名前空間として設定します。
kubectl config set-context --current --namespace=ckad-prep-configmaps
現在の名前空間を確認します。
kubectl config view --minify --output 'jsonpath={..namespace}'; echo
期待される出力:
ckad-prep-configmaps
ConfigMap の作成と確認
このステップでは、単純なアプリケーション設定を保持する ConfigMap を作成します。
kubectl create configmap コマンドを使用すると、リテラルなキーと値のペアから直接 ConfigMap を作成できます。各 --from-literal フラグは、ConfigMap の data フィールドに 1 つのエントリを追加します。
kubectl create configmap app-settings \
--from-literal=APP_MODE=dev \
--from-literal=LOG_LEVEL=debug \
--from-literal=FEATURE_BANNER=enabled
期待される出力:
configmap/app-settings created
ConfigMap の概要を確認します。
kubectl get configmap app-settings
期待される出力:
NAME DATA AGE
app-settings 3 ...
保存された値を読み取ります。jsonpath を使用すると、オブジェクト全体を表示せずに特定のフィールドのみを出力できます。
kubectl get configmap app-settings -o 'jsonpath={.data.APP_MODE}{" "}{.data.LOG_LEVEL}{" "}{.data.FEATURE_BANNER}{"\n"}'
期待される出力:
dev debug enabled
また、YAML 形式で ConfigMap を表示して、オブジェクト内でキーがどのように配置されているかを確認することもできます。
kubectl get configmap app-settings -o yaml
期待される出力例:
data:
APP_MODE: dev
FEATURE_BANNER: enabled
LOG_LEVEL: debug
ConfigMap を使用した Pod の設定
このステップでは、ConfigMap の値を環境変数として読み込む Pod を起動します。
envFrom.configMapRef フィールドを使用すると、ConfigMap 内のすべてのキーをコンテナの環境変数としてインポートできます。これは、少数の機密性のない設定をアプリケーションに接続する簡潔な方法です。
config-reader-pod.yaml を作成します。
cat > config-reader-pod.yaml <<'EOF'
apiVersion: v1
kind: Pod
metadata:
name: config-reader
labels:
app: config-reader
spec:
terminationGracePeriodSeconds: 0
containers:
- name: reader
image: busybox:1.36
command:
- /bin/sh
- -c
- 'echo mode=${APP_MODE}; echo level=${LOG_LEVEL}; echo banner=${FEATURE_BANNER}; sleep 3600'
envFrom:
- configMapRef:
name: app-settings
EOF
Pod マニフェストを適用します。
kubectl apply -f config-reader-pod.yaml
期待される出力:
pod/config-reader created
Pod が Ready 状態になるまで待ちます。
kubectl wait --for=condition=Ready pod/config-reader --timeout=120s
期待される出力:
pod/config-reader condition met
Pod のログを読み取ります。アプリケーションは ConfigMap から取得した値を出力します。
kubectl logs config-reader -c reader
期待される出力:
mode=dev
level=debug
banner=enabled
ConfigMap の更新と Pod の再作成
このステップでは、ConfigMap を更新し、コンテナが新しい値を受け取れるように Pod を再作成します。
ConfigMap を環境変数として使用している場合、実行中のコンテナの環境変数は自動的には変更されません。更新された値を読み込むには、新しいコンテナを起動する必要があります。これは CKAD 試験において重要な詳細であり、設定を更新した後にワークロードを再起動または再作成する必要があることを意味します。
ConfigMap にパッチを適用します。
kubectl patch configmap app-settings --type merge --patch '{"data":{"APP_MODE":"prod","LOG_LEVEL":"warn","FEATURE_BANNER":"disabled"}}'
期待される出力:
configmap/app-settings patched
ConfigMap の新しい値を確認します。
kubectl get configmap app-settings -o 'jsonpath={.data.APP_MODE}{" "}{.data.LOG_LEVEL}{" "}{.data.FEATURE_BANNER}{"\n"}'
期待される出力:
prod warn disabled
古い Pod を削除します。
kubectl delete pod config-reader
期待される出力例:
pod "config-reader" deleted
同じマニフェストから Pod を再作成し、Ready 状態になるまで待ちます。
kubectl apply -f config-reader-pod.yaml
kubectl wait --for=condition=Ready pod/config-reader --timeout=120s
期待される出力:
pod/config-reader created
pod/config-reader condition met
再度ログを読み取ります。新しい Pod が更新された ConfigMap の値を反映していることがわかります。
kubectl logs config-reader -c reader
期待される出力:
mode=prod
level=warn
banner=disabled
まとめ
ConfigMap の作成、データの確認、アプリケーション Pod への接続、ConfigMap の更新、そして新しい値を反映させるための Pod の再作成を行いました。これにより、後の実験で扱うより詳細な環境変数やファイルマウントのパターンに進むための、ConfigMap の基本的なワークフローを習得できました。


