Ubuntu で Kubernetes 三昧その 8(Statefulset)の続きです。
この記事では、Kubernetesにおける重要な設定管理機能である ConfigMap の役割を学び、それを Deployment から環境変数として利用する方法をステップバイステップで解説します。
このチュートリアルで学ぶこと
namespace を作成して作業環境を分離する方法
ConfigMap を使って設定データをキーと値のペアで管理する方法
Deployment で作成するPodから ConfigMap の値を環境変数として参照する方法
Step 1: namespace の作成 - 作業場所の準備
まずはじめに、今回の作業専用の場所として dev という名前の namespace(ネームスペース)を作成します。namespace を使うことで、他のリソースと区別することができ、管理がしやすくなります。
# 'dev' という名前の namespace を作成します
kubectl create ns dev
実行結果:
namespace/dev created
Step 2: ConfigMap の作成 - 設定データの定義
次に、Podに渡したい設定データを ConfigMap として作成します。ConfigMap は、設定情報をKubernetesクラスタ内で独立して管理するためのオブジェクトです。
今回は、username というキーに mike という値を持つ nginxconfigmap という名前の ConfigMap を作成します。
map.yaml ファイルの準備:
# --- は、1つのファイルに複数のYAML定義を書く際の区切りです
---
# オブジェクトの種類を指定します
kind: ConfigMap 
# APIのバージョンを指定します
apiVersion: v1 
# オブジェクトのメタデータ(名前など)を定義します
metadata:
  # このConfigMapを作成するnamespaceを指定します
  namespace: dev
  # ConfigMapの名前を定義します
  name: nginxconfigmap
# 保持したいデータをキー(key)と値(value)のペアで定義します
data:
  username: mike
---
kubectl apply で ConfigMap をクラスタに適用:
kubectl apply -f map.yaml
実行結果:
configmap/nginxconfigmap created
作成された ConfigMap の確認:
dev ネームスペースに nginxconfigmap が作成されたことを確認しましょう。
kubectl get cm -n dev
実行結果:
NAME               DATA   AGE
kube-root-ca.crt   1      8m56s
nginxconfigmap     1      75s
DATA が 1 となっており、1つのデータが格納されていることがわかります。
Step 3: Deployment から ConfigMap を参照する
最後に、nginx のコンテナを起動する Deployment を作成し、先ほど作成した ConfigMap の値をコンテナの環境変数として渡します。
nginx.yaml ファイルの準備:
---
apiVersion: apps/v1
kind: Deployment
metadata:
  namespace: dev
  name: nginx-deployment
spec:
  selector:
    matchLabels:
      app: nginxdeployment
  # 同じPodを2つ起動する設定
  replicas: 2
  template:
    metadata:
      labels:
        app: nginxdeployment
    spec:
      containers:
      - name: nginxdeployment
        image: nginx:latest
        # ↓↓↓↓ ここが今回のポイントです ↓↓↓↓
        # コンテナ内で使用する環境変数(env)を定義します
        env:
          # 環境変数名を 'nginxconfig' に設定します
          - name: nginxconfig
            # 環境変数の値を、直接書くのではなくConfigMapから取得します
            valueFrom:
              configMapKeyRef:
                # 使用するConfigMapの名前を指定します
                name: nginxconfigmap
                # ConfigMapの中から、どのキーの値を使うかを指定します
                key: username
        # コンテナがリッスンするポート番号
        ports:
        - containerPort: 80
---
この設定により、起動するnginxdeploymentコンテナの中には、nginxconfigという名前の環境変数が作られ、その値はnginxconfigmapのusernameキーの値、つまりmikeが設定されます。
Deployment の作成:
(もし古いDeploymentが残っている場合は、一度削除してから作成します)
kubectl delete deploy nginx-deployment -n dev
kubectl apply -f nginx.yaml 
実行結果:
deployment.apps/nginx-deployment deleted
deployment.apps/nginx-deployment created
Deployment と Pod の状態確認:
replicas: 2 の設定通り、2つのPodが Running 状態になっていることを確認します。
# Deploymentの状態を確認
kubectl get deploy -n dev
# Podの状態を確認
kubectl get pod -n dev
実行結果:
# Deploymentの実行結果
NAME               READY   UP-TO-DATE   AVAILABLE   AGE
nginx-deployment   2/2     2            2           9s
Podの実行結果
NAME                                READY   STATUS    RESTARTS   AGE
nginx-deployment-659c68c8d8-n9wpw   1/1     Running   0          17s
nginx-deployment-659c68c8d8-nh4d8   1/1     Running   0          17s
これで、設定データをコードやイメージから分離し、ConfigMap を使って動的にコンテナへ注入する一連の流れが完了しました。
さらに学習を進めるために
作成したPodの中に入り、printenv コマンドで nginxconfig 環境変数が正しく設定されているか確認してみましょう。
ConfigMap の値を mike から jane に変更し、Deployment のPodを再起動すると、環境変数の値が新しいものに変わることを確認してみましょう。
参考: