ConfigMap を使用したアプリケーションの設定

KubernetesBeginner
オンラインで実践に進む

はじめに

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 の基本的なワークフローを習得できました。