< 一覧に戻る

Kubernetes ConfigMap とは?基本の作成方法を解説

ConfigMap は、Kubernetes のアプリケーションでコード内の定数を使用できるようにするデータのキーと値のペアです。ConfigMap では、構成値を Kubernetes 環境に保存することで、12 Factor-App 方式の config 係数が容易になります。これは、12 Factor-App 方式として知られる、移植可能で回復性がある Web アプリケーションを構築するための一連のベストプラクティスです。

この記事の内容
This is the block containing the component that will be injected inside the Rich Text. You can hide this block if you want.

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

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]

次に、キーをその名前で参照できます:

signup.features, port, environments

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

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

次に、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

一方、パラメータがディレクトリを指している場合は、各ファイルの名前をキーとして使用し、各ファイルの内容を値に使用します。ここでは、例として、次の 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

コマンド ラインからの ConfigMap の作成

コマンドラインから直接 ConfigMap を作成できます。--from-literalフラグを使用すると、1 つ以上のキーと値のペアを入力できます。各ペアに同じ--from-literalフラグを指定する必要があります:

$ kubectl create configmap app-config --from-literal=port=3000
--from-literal=environments=production,development,staging

ConfigMap の一覧表示方法

いくつかの ConfigMap を Kubernetes に保存したら、get configmapsコマンドを使用してそれらを一覧表示できます:

$ kubectl get configmaps
NAME DATA AGE
app-config 2 19h
kube-root-ca.crt 1 43h

このコマンドでは、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

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

ボリューム経由で 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

この Pod のログの内容を調べると、ConfigMap のすべてのキーと値のペアを確認できます。app-config のキーと値の各ペアはそれぞれ独自のファイルに存在するため、cat /etc/config/*コマンドを使用して、そのボリュームにリストされているファイルの内容を表示できます:

$ kubectl logs busybox
production, development, productionenglish3000experimental.signup=false
plans.available=[starter, growth, scale]

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

まとめ

この記事では、Kubernetes ConfigMap の詳しいチュートリアルと実際の使用方法をご紹介しました。コンテンツに関心を持たれた方は、Sysdig から今後公開されるチュートリアルをご購読ください。Kubernetes、クラウドセキュリティ、オープンソーステクノロジに関するチュートリアルを公開しています。

FAQs

No items found.

セキュリティ専門家とともに、
クラウドを防御する正しい方法を試してみよう