KubernetesのConfigMapとは
ConfigMapは設定情報の辞書です。この辞書には、単一のPod、複数のPod、またはクラスタ全体に対して、適用されるレベルに応じて設定を含めることができます。ConfigMapは、非機密でプレーンな構成データを保存および共有するために使用されます。
直接的な環境変数の定義との比較
Podやデプロイメントのマニフェスト内で環境変数を直接定義することも可能ですが、この方法には制限があります。例えば、これらの変数を変更する場合、マニフェストファイルを編集し、アプリケーションを再デプロイする必要があります。さらに、これらの変数を異なるアプリケーションや環境で再利用することは簡単ではありません。
ConfigMapの利点
ConfigMapは、マニフェスト内で環境変数を直接定義することに比べていくつかの利点があります。まず第一に、ConfigMapを使用することで、Podテンプレートの外部でアプリケーションの設定を管理できます。これにより再利用性が向上し、複雑さが減少します。次に、ConfigMapは動的であるため、それらを使用するアプリケーションの再デプロイやPodの再起動なしに変更することができます。最後に、ConfigMapはアプリケーションコードから設定を分離することができ、Twelve-Factor Appの原則に従うことができます。
Minikubeの起動
Minikubeは、ローカルマシンで単一ノードのKubernetesクラスタを実行するための便利なツールです。これは特にテストや開発の目的に役立ちます。
Minikubeを起動するには、単にminikube start
コマンドを実行します。
$ minikube start
このコマンドは、コンピュータ上で新しい仮想マシンを初期化し、この仮想マシン内に単一ノードのKubernetesクラスタをインストールします。このコマンドを実行した後は、kubectl
コマンドラインツールを使用してクラスターとの対話を行うことができます。
ConfigMapを使用せずに環境変数を定義
ConfigMapを導入する前に、Kubernetesリソース内で通常どのように環境変数を定義するかを理解することが重要です。
環境変数を含むYAMLの生成コマンド
例えば、環境変数TEST_ENV
をHello_World
に設定した新しいPodを作成したい場合、通常はkubectl run
コマンドと--env
オプションを使用して次のようにします。
$ 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
オプションと共に使用します。
$ 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の構造が表示されます。
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を作成できます。
$ kubectl apply -f configmap.yaml
configmap/my-config created
作成を確認するために、全てのConfigMapをリストします。
$ kubectl get configmap
NAME DATA AGE
kube-root-ca.crt 1 4m9s
my-config 1 5s
ConfigMapの詳細の確認
ConfigMapの詳細を確認できます。
$ 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を参照して環境変数を定義することができます。
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を作成します。
$ kubectl apply -f pod_configmap_env.yaml
正しく設定されているか確認するために、Pod内の環境変数を表示できます。
$ 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
セクションでボリュームのマウント先を指定する必要があります。
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を作成します。
$ kubectl apply -f pod_configmap_volume.yaml
Pod内でシェルを実行し、ファイルシステムを確認してボリュームが正しくマウントされていることを確認できます。
$ kubectl exec -it helloworld-configmap-volume sh
Podのシェルに入った後、マウントされたディレクトリに移動し、TEST_ENV
キーがConfigMapに書き込まれたファイルが存在することを確認します。
/usr/share/nginx/html # cat /my-config/TEST_ENV/keys
Hello_World
このコマンドはキーの内容を表示し、my-config
ConfigMapのTEST_ENV
キーに関連付けられた値であるHello_World
が表示されるはずです。