Traffine I/O

日本語

2022-06-29

KubernetesのConfigMap

KubernetesのConfigMapとは

ConfigMapは設定情報の辞書です。この辞書には、単一のPod、複数のPod、またはクラスタ全体に対して、適用されるレベルに応じて設定を含めることができます。ConfigMapは、非機密でプレーンな構成データを保存および共有するために使用されます。

直接的な環境変数の定義との比較

Podやデプロイメントのマニフェスト内で環境変数を直接定義することも可能ですが、この方法には制限があります。例えば、これらの変数を変更する場合、マニフェストファイルを編集し、アプリケーションを再デプロイする必要があります。さらに、これらの変数を異なるアプリケーションや環境で再利用することは簡単ではありません。

ConfigMapの利点

ConfigMapは、マニフェスト内で環境変数を直接定義することに比べていくつかの利点があります。まず第一に、ConfigMapを使用することで、Podテンプレートの外部でアプリケーションの設定を管理できます。これにより再利用性が向上し、複雑さが減少します。次に、ConfigMapは動的であるため、それらを使用するアプリケーションの再デプロイやPodの再起動なしに変更することができます。最後に、ConfigMapはアプリケーションコードから設定を分離することができ、Twelve-Factor Appの原則に従うことができます。

Minikubeの起動

Minikubeは、ローカルマシンで単一ノードのKubernetesクラスタを実行するための便利なツールです。これは特にテストや開発の目的に役立ちます。

Minikubeを起動するには、単にminikube startコマンドを実行します。

bash
$ minikube start

このコマンドは、コンピュータ上で新しい仮想マシンを初期化し、この仮想マシン内に単一ノードのKubernetesクラスタをインストールします。このコマンドを実行した後は、kubectlコマンドラインツールを使用してクラスターとの対話を行うことができます。

ConfigMapを使用せずに環境変数を定義

ConfigMapを導入する前に、Kubernetesリソース内で通常どのように環境変数を定義するかを理解することが重要です。

環境変数を含むYAMLの生成コマンド

例えば、環境変数TEST_ENVHello_Worldに設定した新しいPodを作成したい場合、通常はkubectl runコマンドと--envオプションを使用して次のようにします。

bash
$ kubectl run \
    --env TEST_ENV=Hello_World \
    --port 8080 \
    --image bhargavshah86/kube-test:v0.1 \
    --restart Never \
    --dry-run \
    -o yaml \
    helloworld > pod_env.yaml

このコマンドは、PodのYAML設定を生成し、pod_env.yamlというファイルに保存します。

生成されたYAMLの構造の理解

pod_env.yamlファイルを開くと、TEST_ENV環境変数が定義されているセクションがあることがわかります。

apiVersion: v1
kind: Pod
metadata:
  creationTimestamp: null
  labels:
    run: helloworld
  name: helloworld
spec:
  containers:
  - env:
    - name: TEST_ENV
      value: Hello_World
    image: bhargavshah86/kube-test:v0.1
    name: helloworld
    ports:
    - containerPort: 8080
    resources: {}
  dnsPolicy: ClusterFirst
  restartPolicy: Never
status: {}

spec.containers.envフィールドの下に、TEST_ENV環境変数とそれに割り当てられた値Hello_Worldが表示されます。これが、KubernetesがConfigMapを使用せずにPod内で環境変数を直接定義する方法です。

環境変数にConfigMapを使用するための移行

環境変数は、Podのマニフェスト内で直接定義することもできますが、ConfigMapを介して管理する方が柔軟で再利用性があります。

YAMLでのConfigMapの定義

ConfigMapを使用するための最初のステップは、その定義です。これには、ConfigMapをYAML形式で定義するためにkubectl create configmapコマンドを--from-literalオプションと共に使用します。

bash
$ kubectl create configmap my-config \
    --from-literal=TEST_ENV=Hello_World \
    --dry-run \
    -o yaml > configmap.yaml

このコマンドは、my-configという名前のConfigMapを作成し、環境変数TEST_ENVを値Hello_Worldで保存します。

ConfigMapのYAML構造の理解

configmap.yamlファイルを開くと、ConfigMapの構造が表示されます。

configmap.yaml
apiVersion: v1
data:
  TEST_ENV: Hello_World
kind: ConfigMap
metadata:
  creationTimestamp: null
  name: my-config

ここでは、dataフィールドの下にTEST_ENVのキーと値が保存されています。

YAMLからConfigMapの作成

ConfigMapがYAMLファイルで定義されたら、kubectl applyコマンドを使用してKubernetesクラスタにConfigMapを作成できます。

bash
$ kubectl apply -f configmap.yaml

configmap/my-config created

作成を確認するために、全てのConfigMapをリストします。

bash
$ kubectl get configmap

NAME               DATA   AGE
kube-root-ca.crt   1      4m9s
my-config          1      5s

ConfigMapの詳細の確認

ConfigMapの詳細を確認できます。

bash
$ kubectl describe configmap my-config

Name:         my-config
Namespace:    default
Labels:       <none>
Annotations:  <none>

Data
====
TEST_ENV:
----
Hello_World

BinaryData
====

Events:  <none>

ConfigMap参照でPodマニフェスト内で環境変数を定義

Podのマニフェストでは、ConfigMapを参照して環境変数を定義することができます。

pod_configmap_env.yaml
apiVersion: v1
kind: Pod
metadata:
  creationTimestamp: null
  labels:
    run: helloworld-configmap-env
  name: helloworld-configmap-env
spec:
  containers:
  - env:
    - name: TEST_ENV
      valueFrom:
        configMapKeyRef:
          name: my-config
          key: TEST_ENV
    image: bhargavshah86/kube-test:v0.1
    name: helloworld-configmap-env
    ports:
    - containerPort: 8080
    resources: {}
  dnsPolicy: ClusterFirst
  restartPolicy: Never
status: {}

ConfigMapを参照したPodマニフェストを定義した後、Podを作成します。

bash
$ kubectl apply -f pod_configmap_env.yaml

正しく設定されているか確認するために、Pod内の環境変数を表示できます。

bash
$ kubectl exec -it helloworld-configmap-env env

HOME=/root
PKG_RELEASE=1
NJS_VERSION=0.3.1
NGINX_VERSION=1.16.0
KUBERNETES_PORT_443_TCP_ADDR=10.96.0.1
KUBERNETES_PORT_443_TCP_PORT=443
KUBERNETES_PORT_443_TCP_PROTO=tcp
KUBERNETES_PORT_443_TCP=tcp://10.96.0.1:443
KUBERNETES_PORT=tcp://10.96.0.1:443
KUBERNETES_SERVICE_PORT_HTTPS=443
KUBERNETES_SERVICE_PORT=443
KUBERNETES_SERVICE_HOST=10.96.0.1
TEST_ENV=Hello_World
TERM=xterm
HOSTNAME=helloworld-configmap-env
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin

このコマンドは全ての環境変数を表示し、出力の中にTEST_ENV=Hello_Worldが表示されるはずです。

コンテナ内でConfigMapをボリュームとしてマウント

環境変数の設定に加えて、ConfigMapはコンテナ内にボリュームとしてマウントされるデータを保存するためにも使用できます。これは、設定ファイルやシークレット、その他のコンテナ内からアクセスが必要なデータに便利です。

ConfigMapボリュームマウントの概要

ConfigMapに保存されているデータはファイルに書き込まれ、そのファイルはPod内にボリュームとしてマウントされます。これは、コンテナ間で構成ファイル、SSLキー、パスワードなどの非機密データを共有する必要がある場合に便利です。

PodマニフェストでConfigMapをボリュームとして定義

ConfigMapをボリュームとして使用するには、PodマニフェストのvolumesセクションでConfigMapを参照し、volumeMountsセクションでボリュームのマウント先を指定する必要があります。

pod_configmap_volume.yaml
apiVersion: v1
kind: Pod
metadata:
  creationTimestamp: null
  labels:
    run: helloworld-configmap-volume
  name: helloworld-configmap-volume
spec:
  containers:
  - image: bhargavshah86/kube-test:v0.1
    name: helloworld-configmap-volume
    ports:
    - containerPort: 8080
    resources: {}
    volumeMounts:
      - name: my-config-volume
        mountPath: /my-config/TEST_ENV
  volumes:
    - name: my-config-volume
      configMap:
        name: my-config
        items:
          - key: TEST_ENV
            path: keys
status: {}

この例では、my-configという名前のConfigMapをmy-config-volumeという名前のボリュームとして使用し、コンテナ内のパス/my-configにマウントしています。

ConfigMapボリュームを持つPodの作成と検証

ConfigMapボリュームを使用したPodマニフェストを定義した後、Podを作成します。

bash
$ kubectl apply -f pod_configmap_volume.yaml

Pod内でシェルを実行し、ファイルシステムを確認してボリュームが正しくマウントされていることを確認できます。

bash
$ kubectl exec -it helloworld-configmap-volume sh

Podのシェルに入った後、マウントされたディレクトリに移動し、TEST_ENVキーがConfigMapに書き込まれたファイルが存在することを確認します。

bash
/usr/share/nginx/html # cat /my-config/TEST_ENV/keys

Hello_World

このコマンドはキーの内容を表示し、my-config ConfigMapのTEST_ENVキーに関連付けられた値であるHello_Worldが表示されるはずです。

Ryusei Kakujo

researchgatelinkedingithub

Focusing on data science for mobility

Bench Press 100kg!