Trending keywords: security, cloud, container,

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

SHARE:

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, productionCode 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, environmentsCode 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: trueCode 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 setCode 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/graphqlCode 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/graphqlCode 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,stagingCode language: JavaScript (javascript)

ConfigMap の一覧表示方法

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

$ kubectl get configmaps
NAME               DATA   AGE
app-config         2      19h
kube-root-ca.crt   1      43hCode 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: environmentsCode 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: NeverCode 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 3145728Code language: JavaScript (javascript)

まとめ

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