Kubernetes ConfigMap とは?基本の作成方法を解説
ConfigMapは、Kubernetesのアプリケーションでコード内の定数を使用できるようにするデータのキーと値のペアです。ConfigMapを活用すれば、構成データをアプリケーションコードから切り離し、環境に応じた設定の迅速な運用と更新を実現できます。
この記事では、Kubernetes ConfigMapの基本として、ConfigMap と概要と例、作成方法と確認方法などを解説します。
関 連 記 事
Kubernetesとは? | Kubernetesセキュリティ の基礎 | Kubernetesアーキテクチャの 設計方法 |
AWSのEKS (Elastic Kubernetes Service) | Kubernetesの クラスターとは? | Kubernetes のノードとは? |
KubernetesのPodとは? | KubernetesのHelmとは? | クラウドセキュリティと ランタイムインサイト |
Kubernetes ConfigMap とは?
ConfigMapとは、Kubernetesのアプリケーションにおいて、コード内の定数を使用できるようにするデータのキーと値のペアのことです。基本はアプリケーション設定データの管理を目的に使われます。
構成値を Kubernetes 環境に保存することで、12 Factor-App 方式の config 係数が容易になります。これは、12 Factor-App 方式として知られる、移植可能で回復性がある Web アプリケーションを構築するための一連のベストプラクティスです。
Kubernetes ConfigMapの例
ConfigMapは、キーと値のパターンに従う構成プロパティです。ファイルを .env または .properties ファイルとしてすでに使用している可能性があります。以下は、いくつかの構成プロパティを含むファイルの例です。
app.properties
port = 3000
language = english
environments = production, development, staging
この構成ファイルを Kubernetes に保存するには、次のマニフェストを作成する必要があります。
config-map-example.yml
apiVersion: v1
kind: ConfigMap
metadata:
name: app-config
data:
port: "3000"
language: "english"
environments: production, development, production
Code language: JavaScript (javascript)
data セクションでは、さまざまな種類のアイテムを保存できます。最大 1MB のデータしか保持できませんが、制限が厳しすぎる場合は、異なる名前で複数の ConfigMap を作成できます。
データ定義の Literal スタイルを使用して、ネストされたキーと値のペアを保存できます:
config-map-example.yml
apiVersion: v1
kind: ConfigMap
metadata:
name: app-config
data:
port: "3000"
environments: production, development, production
signup.features: |
experimental.signup=true
plans.available=[starter, growth, scale]
Code language: JavaScript (javascript)
次に、キーをその名前で参照できます:
signup.features, port, environments
Code language: CSS (css)
Pod 内でこれらのプロパティを指定する方法については後で示します。
使用可能な ConfigMap のタイプ
Kubernetes では、実行時の処理方法に応じて、さまざまなタイプの ConfigMap が用意されています。
ConfigMap は optional としてマークできます。存在しない ConfigMap を参照しようとすると、デフォルトで Kubernetes によって Pod を正常に起動できなくなります。ConfigMap が存在しない場合でも Pod を実行したい場合は、ConfigMap を optional としてマークできます。
ConfigMap は immutable としてマークすることもできます。immutable フィールドを使用して、変更がないか ConfigMap を注意深く監視するように Kubernetes に指示できます。immutable の ConfigMap を更新しようとすると、Kubernetes によってその操作を実行できなくなります:
config-map-example.yml
apiVersion: v1
kind: ConfigMap
metadata:
name: app-config
data:
port: "3000"
environments: production, development, production
signup.features: |
experimental.signup=true
plans.available=[starter, growth, scale]
immutable: true
Code language: JavaScript (javascript)
immutable フラグを適用すると、元に戻したり、変更したりできなくなるため、注意してください。この場合は、オブジェクト全体を削除して、最初からやり直す必要があります:
❯ kubectl apply -f config-map-example.yml
pod/busybox unchanged
The ConfigMap "app-config" is invalid:
* immutable: Forbidden: field is immutable when `immutable` is set
* data: Forbidden: field is immutable when `immutable` is set
Code language: JavaScript (javascript)
次に、ConfigMap を作成するさまざまな方法について説明します。
ConfigMap の作成方法
さまざまな方法で ConfigMap を作成できるため、柔軟な構成管理が可能になります。
ファイルまたはディレクトリからの ConfigMap の作成
単一のファイルまたはファイルのディレクトリ全体を参照する ConfigMap を作成できます。—from-file フラグを使用すると、そのファイルまたはディレクトリへのパスを指定できます。
パラメータがファイルを指している場合、そのファイルのプロパティをキーと値のペアとして使用します:
$ cat .env.local
FRONTEND_URL=http://localhost:3000
WP_GRAPHQL_URL=http://localhost:10008/graphql
$ kubectl create configmap app-config --from-file=.env.local
configmap/app-config created
$ kubectl describe configmap app-config
Name: app-config
Namespace: default
Labels: <none>
Annotations: <none>
Data
====
.env.local:
----
FRONTEND_URL=http://localhost:3000
WP_GRAPHQL_URL=http://localhost:10008/graphql
Code language: JavaScript (javascript)
一方、パラメータがディレクトリを指している場合は、各ファイルの名前をキーとして使用し、各ファイルの内容を値に使用します。ここでは、例として、次の 2 つのファイルを含む example という名前の新しいフォルダを作成しました: .env.local and .env.remote:
$ kubectl create configmap app-config --from-file=example
configmap/app-config created
$ kubectl describe configmap app-config
Name: app-config
Namespace: default
Labels: <none>
Annotations: <none>
Data
====
.env.local:
----
FRONTEND_URL=http://localhost:3000
WP_GRAPHQL_URL=http://localhost:10008/graphql
.env.remote:
----
FRONTEND_URL=http://headless.example.com
WP_GRAPHQL_URL=http://example.com/graphql
Code language: HTML, XML (xml)
コマンド ラインからの ConfigMap の作成
コマンドラインから直接 ConfigMap を作成できます。–from-literal フラグを使用すると、1 つ以上のキーと値のペアを入力できます。各ペアに同じ –from-literal フラグを指定する必要があります:
$ kubectl create configmap app-config --from-literal=port=3000
--from-literal=environments=production,development,staging
Code language: JavaScript (javascript)
ConfigMap の一覧表示方法
いくつかの ConfigMap を Kubernetes に保存したら、get configmaps コマンドを使用してそれらを一覧表示できます:
$ kubectl get configmaps
NAME DATA AGE
app-config 2 19h
kube-root-ca.crt 1 43h
Code language: JavaScript (javascript)
このコマンドでは、ConfigMap の名前のみを表示します。それらの内容を調べたい場合は、describe を使用する必要があります:
$ kubectl describe configmap app-config
ConfigMap のキーの使用方法
Pod に ConfigMap データを指定するには、主に 2 つの方法があります:
環境変数として ConfigMap を指定する
Pod マニフェストをマウントし、ConfigMap データから取得した env キーと値のペアを指定できます。専用の configMapKeyRef フィールドを使用して、ConfigMap の名前とその ConfigMap から取得したキーの 2 つのパラメータを指定する必要があります:
pod.yml
apiVersion: v1
kind: Pod
metadata:
name: busybox
spec:
containers:
- name: test-container
image: gcr.io/google_containers/busybox
command: [ "/bin/sh", "-c", "env" ]
env:
- name: PORT
valueFrom:
configMapKeyRef:
name: app-config
key: port
- name: ENVIRONMENTS
valueFrom:
configMapKeyRef:
name: app-config
key: environments
Code language: JavaScript (javascript)
ConfigMap オブジェクト全体を読み込む場合は、代わりに envFrom フィールドを使用できます:
…
envFrom:
- configMapRef:
name: app-config
Pod をデプロイしたら、ログを調べて、env 変数が正しく読み込まれたことを確認できます:
$ kubectl logs busybox
KUBERNETES_PORT=tcp://10.96.0.1:443
KUBERNETES_SERVICE_PORT=443
HOSTNAME=busybox
SHLVL=1
HOME=/root
PORT=3000
ENVIRONMENTS=production, development, production
…
Code language: PHP (php)
ボリューム経由で ConfigMap をマウントする
ConfigMap は、ボリューム経由で使用することもできます。まず、その ConfigMap を使用してボリュームをマウントする必要があります。次に、Pod コンテナ仕様の volumeMounts フィールドを使用して、各キーをファイルとして使用できるようにします:
pod.yml
apiVersion: v1
kind: Pod
metadata:
name: busybox
spec:
containers:
- name: test-container
image: gcr.io/google_containers/busybox
command: [ "/bin/sh", "-c", "cat /etc/config/*" ]
volumeMounts:
- name: config-volume
mountPath: /etc/config
volumes:
- name: config-volume
configMap:
name: app-config
restartPolicy: Never
Code language: JavaScript (javascript)
この Pod のログの内容を調べると、ConfigMap のすべてのキーと値のペアを確認できます。app-config のキーと値の各ペアはそれぞれ独自のファイルに存在するため、cat /etc/config/* コマンドを使用して、そのボリュームにリストされているファイルの内容を表示できます:
$ kubectl logs busybox
production, development, productionenglish3000experimental.signup=false
plans.available=[starter, growth, scale]
Code language: JavaScript (javascript)
Kubernetes ConfigMap の保存場所
Kubernetes では、ConfigMap や Secrets などの API オブジェクトを etcd クラスター内に保存します。etcd には、Kubernetes がコンテナを調整するために必要なすべてのキーと値のオブジェクトが保存されるため、etcd は基本的に Kubernetes の頭脳として機能します。
ただし、etcd を使用する際の問題は、保存できるデータのサイズが制限されることです。キー値には、1MB の制限があります(これが etcd の上限になります)。
その制限を超えようとすると、次のエラーメッセージが表示されます:
$ kubectl apply -f config-map-example.yml
Resource: "/v1, Resource=configmaps", GroupVersionKind: "/v1, Kind=ConfigMap"
Name: "app-config", Namespace: "default"
for: "config-map-example.yml": Request entity too large: limit is 3145728
Code language: JavaScript (javascript)
まとめ
この記事では、Kubernetes ConfigMap の詳しいチュートリアルと実際の使用方法をご紹介しました。コンテンツに関心を持たれた方は、Sysdig から今後公開されるチュートリアルをご購読ください。Kubernetes、クラウドセキュリティ、オープンソーステクノロジに関するチュートリアルを公開しています。