Kubernetes の ConfigMap について
アプリケーション リポジトリには、index.html
ファイルに読み込まれる構成ファイルがあり、これを使用するとイメージの完全なビルドを必要とせずに環境変数を更新できます。
構成ファイルには機密情報は含まれていません。コンテナーと共に読み込む必要があるだけです。 暗号化またはエンコードを必要とせずに、このファイルをコンテナーにマウントするにはどうすればよいのでしょうか。
ConfigMap の理解
ConfigMap はシークレットと同等のものです。 シークレットは機密データを保存して提供するための手段を提供しますが、ConfigMap は、シークレットと同じキーと値の構造を使用して、機密ではないデータを保存するための手段を提供するオブジェクトです。 ConfigMap オブジェクトを使うと、イメージがステートレスなままになるように、コンテナー イメージから構成を切り離すことができます。
ConfigMap を作成して、アプリケーション コードとは別に構成データを格納し、シークレット オブジェクトをポッドに読み込むのと同様の方法でそれを読み込みます。 ConfigMap は、環境変数を使用するか、コンテナー内のボリュームに ConfigMap をファイルとしてマウントすることでしか参照できません。
ConfigMap にはデータ サイズの制限があります。ConfigMap に保持できるデータは最大 1 MiB です。 このサイズ制限は、ユーザーに大きな構成を小さなチャンクに分割させることで、大きくて複雑な構成ファイルを回避するのに役立ちます。 ConfigMap を使うと、必要な構成ファイルだけをコンテナーにマウントでき、細分性を高めることができます。
シークレットと同様に ConfigMap は名前空間に対応します。 ConfigMap にアクセスしてこれをマウントするには、それが作成されたのと同じ名前空間に存在するコンテナーを使用するしかありません。
ConfigMap は、状態の格納と読み取りのために、Helm や Kubernetes Operator などの他のツールでも広く使われています。
ConfigMap の更新
ポッド内に "ボリュームとしてマウントされた" すべての ConfigMap は、値が変更されると自動的に更新されます。 Kubelet の構成が原因で、この変更はすぐには行われない場合がありますが、変更は自動的に行われるので、ポッドを再起動する必要はありません。
ConfigMap が "環境変数にバインドされている" 場合、自動的には更新されません。 このような場合、変更を有効にするには、ポッドを再起動する必要があります。
ConfigMaps を作成して使用する
ConfigMap は、シークレットと同じ方法、つまり YAML ファイルを使って作成できます。 ConfigMap は次のように指定します。
apiVersion: v1
kind: ConfigMap
metadata:
name: configmap-name
namespace: default
data:
key-name: "value as key"
key.name: |
multi line
property, called "file-like" values
次の例で示すように、ポッドまたはデプロイの指定で 1 つ以上のキーを使って ConfigMap を参照できます。
apiVersion: v1
kind: Pod
metadata:
name: configmap-as-env
namespace: default
spec:
containers:
- name: configmap-env
image: alpine
command: ["sleep", "3600"]
env:
- name: ENVIRONMENT_VARIABLE_NAME
valueFrom:
configMapKeyRef:
name: configmap-name
key: key-name
また、次の例で示すように、読み取り専用ボリュームを使って、ポッド内のファイルとしてそれをマウントすることもできます。
apiVersion: v1
kind: Pod
metadata:
name: configmap-as-env
namespace: default
spec:
containers:
- name: configmap-env
image: alpine
command: ["sleep", "3600"]
volumeMounts:
- name: volume-name
mountPath: "/path/to/mount"
readOnly: true
volumes:
- name: volume-name
configMap:
name: configmap-name
items:
- key: "key-name"
path: "path/to/mount/the/key"