第21章 ConfigMap

21.1. 概要

数多くのアプリケーションには、設定ファイル、コマンドライン引数、および環境変数の組み合わせを使用した設定が必要です。これらの設定アーティファクトは、コンテナー化されたアプリケーションを移植可能な状態に保つためにイメージコンテンツから切り離す必要があります。

ConfigMap オブジェクトは、コンテナーを OpenShift Container Platform に依存しない状態にする一方でコンテナーに設定データを挿入するメカニズムを提供します。ConfigMap は、個々のプロパティーなどの粒度の細かい情報や設定ファイル全体または JSON Blob などの粒度の荒い情報を保存するために使用できます。

ConfigMap API オブジェクトは、 Pod で使用したり、コントローラーなどのシステムコントローラーの設定データを保存するために使用できる設定データのキーと値のペアを保持します。ConfigMapシークレットに似ていますが、機密情報を含まない文字列の使用をより効果的にサポートするように設計されています。

例:

ConfigMap オブジェクト定義

kind: ConfigMap
apiVersion: v1
metadata:
  creationTimestamp: 2016-02-18T19:14:38Z
  name: example-config
  namespace: default
data: 1
  example.property.1: hello
  example.property.2: world
  example.property.file: |-
    property.1=value-1
    property.2=value-2
    property.3=value-3
binaryData:
  bar: L3Jvb3QvMTAw 2

1
設定データが含まれます。
2
バイナリー Java キーストアファイルなどの UTF8 以外のデータを含むファイルを参照します。Base 64 にファイルパスを入力します。
注記

ファイルから configmap を作成する際にbinaryData フィールドを使用できます。

設定データは各種の方法で Pod で使用されます。ConfigMap は以下を実行するために使用できます。

  1. 環境変数の値の設定
  2. コンテナーのコマンドライン引数の設定
  3. ボリュームの設定ファイルの設定

ユーザーとシステムコンポーネントの両方が設定データを ConfigMap に保存できます。

21.2. ConfigMap の作成

以下のコマンドを使用すると、ConfigMap をディレクトリーや特定ファイルまたはリテラル値から簡単に作成できます。

$ oc create configmap <configmap_name> [options]

以下のセクションでは、ConfigMap を作成するための各種の方法について説明します。

21.2.1. ディレクトリーからの作成

ConfigMap の設定に必要なデータを含むファイルのあるディレクトリーについて見てみましょう。

$ ls example-files
game.properties
ui.properties

$ cat example-files/game.properties
enemies=aliens
lives=3
enemies.cheat=true
enemies.cheat.level=noGoodRotten
secret.code.passphrase=UUDDLRLRBABAS
secret.code.allowed=true
secret.code.lives=30

$ cat example-files/ui.properties
color.good=purple
color.bad=yellow
allow.textmode=true
how.nice.to.look=fairlyNice

以下のコマンドを使用して、このディレクトリーの各ファイルの内容を保持する ConfigMap を作成できます。

$ oc create configmap game-config \
    --from-file=example-files/

--from-file オプションがディレクトリーを参照する場合、そのディレクトリーに直接含まれる各ファイルが ConfigMap でキーを設定するために使用されます。このキーの名前はファイル名であり、キーの値はファイルの内容になります。

たとえば、上記のコマンドは以下の ConfigMap を作成します。

$ oc describe configmaps game-config
Name:           game-config
Namespace:      default
Labels:         <none>
Annotations:    <none>

Data

game.properties:        121 bytes
ui.properties:          83 bytes

マップにある 2 つのキーが、コマンドで指定されたディレクトリーのファイル名に基づいて作成されていることに気づかれることでしょう。それらのキーの内容のサイズは大きくなる可能性があるため、oc describe の出力はキーとキーのサイズのみを表示します。

キーの値を確認する必要がある場合は、オブジェクトに対して oc get をオプション -o を指定して実行できます。

$ oc get configmaps game-config -o yaml

apiVersion: v1
data:
  game.properties: |-
    enemies=aliens
    lives=3
    enemies.cheat=true
    enemies.cheat.level=noGoodRotten
    secret.code.passphrase=UUDDLRLRBABAS
    secret.code.allowed=true
    secret.code.lives=30
  ui.properties: |
    color.good=purple
    color.bad=yellow
    allow.textmode=true
    how.nice.to.look=fairlyNice
kind: ConfigMap
metadata:
  creationTimestamp: 2016-02-18T18:34:05Z
  name: game-config
  namespace: default
  resourceVersion: "407"-
  selflink: /api/v1/namespaces/default/configmaps/game-config
  uid: 30944725-d66e-11e5-8cd0-68f728db1985

21.2.2. ファイルからの作成

特定のファイルを指定して --from-file オプションを渡し、それを CLI に複数回渡すことができます。以下を実行すると、ディレクトリーからの作成の例と同等の結果を出すことができます。

注記

ファイルから configmap を作成する場合、UTF8 以外のデータを破損することなく、UTF8 以外のデータを含むファイルをこの新規フィールドに配置できます。OpenShift Container Platform はバイナリーファイルを検出し、ファイルを MIME として透過的にエンコーディングします。サーバーでは、データを破損することなく MIME ペイロードがデコーディングされ、保存されます。

  1. 特定のファイルを指定して ConfigMap を作成します。

    $ oc create configmap game-config-2 \
        --from-file=example-files/game.properties \
        --from-file=example-files/ui.properties
  2. 結果を確認します。

    $ oc get configmaps game-config-2 -o yaml
    
    apiVersion: v1
    data:
      game.properties: |-
        enemies=aliens
        lives=3
        enemies.cheat=true
        enemies.cheat.level=noGoodRotten
        secret.code.passphrase=UUDDLRLRBABAS
        secret.code.allowed=true
        secret.code.lives=30
      ui.properties: |
        color.good=purple
        color.bad=yellow
        allow.textmode=true
        how.nice.to.look=fairlyNice
    kind: ConfigMap
    metadata:
      creationTimestamp: 2016-02-18T18:52:05Z
      name: game-config-2
      namespace: default
      resourceVersion: "516"
      selflink: /api/v1/namespaces/default/configmaps/game-config-2
      uid: b4952dc3-d670-11e5-8cd0-68f728db1985

さらに key=value の式を渡して、個々のファイルに使用するキーを --from-file オプションで設定することができます。以下は例になります。

  1. キーと値のペアを指定して ConfigMap を作成します。

    $ oc create configmap game-config-3 \
        --from-file=game-special-key=example-files/game.properties
  2. 結果を確認します。

    $ oc get configmaps game-config-3 -o yaml
    
    apiVersion: v1
    data:
      game-special-key: |-
        enemies=aliens
        lives=3
        enemies.cheat=true
        enemies.cheat.level=noGoodRotten
        secret.code.passphrase=UUDDLRLRBABAS
        secret.code.allowed=true
        secret.code.lives=30
    kind: ConfigMap
    metadata:
      creationTimestamp: 2016-02-18T18:54:22Z
      name: game-config-3
      namespace: default
      resourceVersion: "530"
      selflink: /api/v1/namespaces/default/configmaps/game-config-3
      uid: 05f8da22-d671-11e5-8cd0-68f728db1985

21.2.3. リテラル値からの作成

ConfigMap にリテラル値を指定することもできます。--from-literal オプションは、リテラル値をコマンドラインに直接指定できる key=value 構文を取ります。

  1. リテラル値を指定して ConfigMap を作成します。

    $ oc create configmap special-config \
        --from-literal=special.how=very \
        --from-literal=special.type=charm
  2. 結果を確認します。

    $ oc get configmaps special-config -o yaml
    
    apiVersion: v1
    data:
      special.how: very
      special.type: charm
    kind: ConfigMap
    metadata:
      creationTimestamp: 2016-02-18T19:14:38Z
      name: special-config
      namespace: default
      resourceVersion: "651"
      selflink: /api/v1/namespaces/default/configmaps/special-config
      uid: dadce046-d673-11e5-8cd0-68f728db1985

21.3. ユースケース: Pod での ConfigMap の使用

以下のセクションでは、Pod で ConfigMap オブジェクトを使用する際のいくつかのユースケースについて説明します。

21.3.1. 環境変数での使用

ConfigMaps は個別の環境変数を設定するために使用したり、有効な環境変数名を生成するすべてのキーで環境変数を設定したりできます。例として、以下の ConfigMaps について見てみましょう。

2 つの環境変数を含む ConfigMap

apiVersion: v1
kind: ConfigMap
metadata:
  name: special-config 1
  namespace: default
data:
  special.how: very 2
  special.type: charm 3

1
ConfigMap の名前です。
2 3
注入する環境変数

1 つの環境変数を含む ConfigMap

apiVersion: v1
kind: ConfigMap
metadata:
  name: env-config 1
  namespace: default
data:
  log_level: INFO 2

1
ConfigMap の名前です。
2
注入する環境変数

configMapKeyRef セクションを使用して、Pod の ConfigMap のキーを使用できます。

特定の環境変数を挿入するように設定されている Pod 仕様のサンプル

apiVersion: v1
kind: Pod
metadata:
  name: dapi-test-pod
spec:
  containers:
    - name: test-container
      image: gcr.io/google_containers/busybox
      command: [ "/bin/sh", "-c", "env" ]
      env: 1
        - name: SPECIAL_LEVEL_KEY
          valueFrom:
            configMapKeyRef:
              name: special-config 2
              key: special.how 3
        - name: SPECIAL_TYPE_KEY
          valueFrom:
            configMapKeyRef:
              name: special-config 4
              key: special.type 5
              optional: true 6
      envFrom: 7
        - configMapRef:
            name: env-config 8
  restartPolicy: Never

1
ConfigMap から指定された環境変数をプルするためのスタンザです。
2 4
特定の環境変数のプルに使用する ConfigMap の名前です。
3 5
ConfigMap からプルする環境変数です。
6
環境変数をオプションにします。オプションとして、Pod は指定された ConfigMap およびキーが存在しない場合でも起動します。
7
ConfigMap からすべての環境変数をプルするためのスタンザです。
8
すべての環境変数のプルに使用する ConfigMap の名前です。

この Pod が実行されると、その出力には以下の行が含まれます。

SPECIAL_LEVEL_KEY=very
log_level=INFO

21.3.2. コマンドライン引数の設定

ConfigMap は、コンテナーのコマンドまたは引数の値を設定するために使用することもできます。これは、Kubernetes 置換構文 $(VAR_NAME) を使用して実行できます。以下の ConfigMaps について見てみましょう。

apiVersion: v1
kind: ConfigMap
metadata:
  name: special-config
  namespace: default
data:
  special.how: very
  special.type: charm

値をコマンドラインに挿入するには、「環境変数での使用」のユースケースで説明されているように環境変数として使用する必要のあるキーを使用する必要があります。次に、$(VAR_NAME) 構文を使用してコンテナーのコマンドでそれらを参照することができます。

特定の環境変数を挿入するように設定されている Pod 仕様のサンプル

apiVersion: v1
kind: Pod
metadata:
  name: dapi-test-pod
spec:
  containers:
    - name: test-container
      image: gcr.io/google_containers/busybox
      command: [ "/bin/sh", "-c", "echo $(SPECIAL_LEVEL_KEY) $(SPECIAL_TYPE_KEY)" ]
      env:
        - name: SPECIAL_LEVEL_KEY
          valueFrom:
            configMapKeyRef:
              name: special-config
              key: special.how
        - name: SPECIAL_TYPE_KEY
          valueFrom:
            configMapKeyRef:
              name: special-config
              key: special.type
  restartPolicy: Never

この Pod が実行されると、test-container コンテナーからの出力は以下のようになります。

very charm

21.3.3. ボリュームでの使用

ConfigMap はボリュームで使用することもできます。以下の ConfigMap の例に戻りましょう。

apiVersion: v1
kind: ConfigMap
metadata:
  name: special-config
  namespace: default
data:
  special.how: very
  special.type: charm

ボリュームでこの ConfigMap を使用する方法として 2 つの異なるオプションがあります。最も基本的な方法は、キーがファイル名であり、ファイルの内容がキーの値になっているファイルでボリュームを設定する方法です。

apiVersion: v1
kind: Pod
metadata:
  name: dapi-test-pod
spec:
  containers:
    - name: test-container
      image: gcr.io/google_containers/busybox
      command: [ "/bin/sh", "cat", "/etc/config/special.how" ]
      volumeMounts:
      - name: config-volume
        mountPath: /etc/config
  volumes:
    - name: config-volume
      configMap:
        name: special-config
  restartPolicy: Never

この Pod が実行されると出力は以下のようになります。

very

ConfigMap キーが展開されるボリューム内のパスを制御することもできます。

apiVersion: v1
kind: Pod
metadata:
  name: dapi-test-pod
spec:
  containers:
    - name: test-container
      image: gcr.io/google_containers/busybox
      command: [ "/bin/sh", "cat", "/etc/config/path/to/special-key" ]
      volumeMounts:
      - name: config-volume
        mountPath: /etc/config
  volumes:
    - name: config-volume
      configMap:
        name: special-config
        items:
        - key: special.how
          path: path/to/special-key
  restartPolicy: Never

この Pod が実行されると出力は以下のようになります。

very

21.4. Redis の設定例

実際の使用例として、ConfigMap を使用して Redis を設定することができます。推奨の設定で Redis を挿入して Redis をキャッシュとして使用するには、Redis 設定ファイルに以下を含めるようにしてください。

maxmemory 2mb
maxmemory-policy allkeys-lru

設定ファイルが example-files/redis/redis-config にある場合、これを使って ConfigMap を作成します。

  1. 設定ファイルを指定して ConfigMap を作成します。

    $ oc create configmap example-redis-config \
        --from-file=example-files/redis/redis-config
  2. 結果を確認します。

    $ oc get configmap example-redis-config -o yaml
    
    apiVersion: v1
    data:
      redis-config: |
        maxmemory 2mb
        maxmemory-policy allkeys-lru
    kind: ConfigMap
    metadata:
      creationTimestamp: 2016-04-06T05:53:07Z
      name: example-redis-config
      namespace: default
      resourceVersion: "2985"
      selflink: /api/v1/namespaces/default/configmaps/example-redis-config
      uid: d65739c1-fbbb-11e5-8a72-68f728db1985

ここで、この ConfigMap を使用する Pod を作成します。

  1. 以下のような Pod 定義を作成し、これを redis-pod.yaml などのファイルに保存します。

    apiVersion: v1
    kind: Pod
    metadata:
      name: redis
    spec:
      containers:
      - name: redis
        image: kubernetes/redis:v1
        env:
        - name: MASTER
          value: "true"
        ports:
        - containerPort: 6379
        resources:
          limits:
            cpu: "0.1"
        volumeMounts:
        - mountPath: /redis-master-data
          name: data
        - mountPath: /redis-master
          name: config
      volumes:
        - name: data
          emptyDir: {}
        - name: config
          configMap:
            name: example-redis-config
            items:
            - key: redis-config
              path: redis.conf
  2. Pod を作成します。

    $ oc create -f redis-pod.yaml

新規に作成された Pod には、example-redis-config ConfigMapredis-config キーを redis.conf というファイルに置く ConfigMap ボリュームがあります。このボリュームは Redis コンテナーの /redis-master ディレクトリーにマウントされ、設定ファイルを /redis-master/redis.conf に配置します。ここでイメージがマスターの Redis 設定ファイルを検索します。

この Pod に対して oc exec を実行し、redis-cli ツールを実行する場合、設定が正常に適用されたことを確認できます。

$ oc exec -it redis redis-cli
127.0.0.1:6379> CONFIG GET maxmemory
1) "maxmemory"
2) "2097152"
127.0.0.1:6379> CONFIG GET maxmemory-policy
1) "maxmemory-policy"
2) "allkeys-lru"

21.5. 制限

ConfigMap は、それらが Pod で使用される前に作成される必要があります。コントローラーは設定データが欠落している場合にもそれを容認するように作成できます。個別のケースについては、ConfigMap で設定された個々のコンポーネントを確認してください。

ConfigMap オブジェクトはプロジェクトにあります。それらは同じプロジェクトの Pod によってのみ参照されます。

Kubelet は、API サーバーから取得する Pod の ConfigMap の使用のみをサポートします。これには CLI を使用して作成された Pod やレプリケーションコントローラーから間接的に作成された Pod が含まれますが、OpenShift Container Platform ノードの --manifest-url フラグやその --config フラグ、またはその REST API を使用して作成された Pod は含まれません (これらは Pod を作成する一般的な方法ではありません)。