Red Hat Training
A Red Hat training course is available for OpenShift Container Platform
第22章 ConfigMap
22.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
- 1
- 設定データが含まれます。
設定データは各種の方法で Pod で使用されます。ConfigMap は以下を実行するために使用できます。
- 環境変数の値の設定
- コンテナーのコマンドライン引数の設定
- ボリュームの設定ファイルの設定
ユーザーとシステムコンポーネントの両方が設定データを ConfigMap に保存できます。
22.2. ConfigMap の作成
以下のコマンドを使用すると、ConfigMap をディレクトリーや特定ファイルまたはリテラル値から簡単に作成できます。
$ oc create configmap <configmap_name> [options]
以下のセクションでは、ConfigMap を作成するための各種の方法について説明します。
22.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-68f728db198522.2.2. ファイルからの作成
特定のファイルを指定して --from-file オプションを渡し、それを CLI に複数回渡すことができます。以下を実行すると、ディレクトリーからの作成の例と同等の結果を出すことができます。
特定のファイルを指定して
ConfigMapを作成します。$ oc create configmap game-config-2 \ --from-file=example-files/game.properties \ --from-file=example-files/ui.properties結果を確認します。
$ 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 オプションで設定することができます。以下は例になります。
キーと値のペアを指定して
ConfigMapを作成します。$ oc create configmap game-config-3 \ --from-file=game-special-key=example-files/game.properties結果を確認します。
$ 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
22.2.3. リテラル値からの作成
ConfigMap にリテラル値を指定することもできます。--from-literal オプションは、リテラル値をコマンドラインに直接指定できる key=value 構文を取ります。
リテラル値を指定して
ConfigMapを作成します。$ oc create configmap special-config \ --from-literal=special.how=very \ --from-literal=special.type=charm結果を確認します。
$ 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
22.3. ユースケース: Pod での ConfigMap の使用
以下のセクションでは、Pod で ConfigMap オブジェクトを使用する際のいくつかのユースケースについて説明します。
22.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
apiVersion: v1 kind: ConfigMap metadata: name: env-config 1 namespace: default data: log_level: INFO 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
この Pod が実行されると、その出力には以下の行が含まれます。
SPECIAL_LEVEL_KEY=very log_level=INFO
22.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
22.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
22.4. Redis の設定例
実際の使用例として、ConfigMap を使用して Redis を設定することができます。推奨の設定で Redis を挿入して Redis をキャッシュとして使用するには、Redis 設定ファイルに以下を含めるようにしてください。
maxmemory 2mb maxmemory-policy allkeys-lru
設定ファイルが example-files/redis/redis-config にある場合、これを使って ConfigMap を作成します。
設定ファイルを指定して
ConfigMapを作成します。$ oc create configmap example-redis-config \ --from-file=example-files/redis/redis-config結果を確認します。
$ 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 を作成します。
以下のような 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.confPod を作成します。
$ oc create -f redis-pod.yaml
新規に作成された Pod には、example-redis-config ConfigMap の redis-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"
22.5. 制限
ConfigMap は、それらが Pod で使用される前に作成される必要があります。コントローラーは設定データが欠落している場合にもそれを容認するように作成できます。個別のケースについては、ConfigMap で設定された個々のコンポーネントを確認してください。
ConfigMap オブジェクトはプロジェクトにあります。それらは同じプロジェクトの Pod によってのみ参照されます。
Kubelet は、API サーバーから取得する Pod の ConfigMap の使用のみをサポートします。これには CLI を使用して作成された Pod やレプリケーションコントローラーから間接的に作成された Pod が含まれますが、OpenShift Container Platform ノードの --manifest-url フラグやその --config フラグ、またはその REST API を使用して作成された Pod は含まれません (これらは Pod を作成する一般的な方法ではありません)。