Trending keywords: security, cloud, container,

Kubernetes ConfigMap とは

SHARE:

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

このチュートリアルでは、Kubernetes ConfigMap について深く掘り下げます。最初に、ConfigMap とその個別のバリエーションについて紹介します。次に、ConfigMap の作成方法とその値の確認方法について説明します。最後に、サンプル Pod 構成で ConfigMap を使用する方法について紹介します。

ここでは、このチュートリアルの目的に合わせて、 Kind を使用してサンプルクラスターを作成しました

それでは始めましょう。

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)

Kubernetes のすべての 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、クラウドセキュリティ、オープンソーステクノロジに関するチュートリアルを公開しています。