第9章 アプリケーションでの設定マップの使用
設定マップを使用すると、設定アーティファクトをイメージコンテンツから切り離し、コンテナー化されたアプリケーションを移植可能な状態に保つことができます。
以下のセクションでは、設定マップ を定義し、それらを作成および使用する方法を説明します。また、Pod で ConfigMap オブジェクトを使用するユースケースについて説明します。
9.1. 設定マップについて リンクのコピーリンクがクリップボードにコピーされました!
以下のセクションを参照すると、config map を使用して、アプリケーションコードとは別に設定値を Pod に提供する方法を確認できます。
多くのアプリケーションには、設定ファイル、コマンドライン引数、および環境変数の組み合わせを使用した設定が必要です。OpenShift Container Platform では、これらの設定アーティファクトは、コンテナー化されたアプリケーションを移植可能な状態に保つためにイメージコンテンツから切り離されます。
ConfigMap オブジェクトは、コンテナーを OpenShift Container Platform に依存させないようにする一方で、コンテナーに設定データを注入するメカニズムを提供します。設定マップは、個々のプロパティーなどの粒度の細かい情報や、設定ファイル全体または JSON Blob などの粒度の粗い情報を保存するために使用できます。
ConfigMap オブジェクトは、Pod で使用したり、コントローラーなどのシステムコンポーネントの設定データを保存するために使用できる設定データのキーと値のペアを保持します。以下に例を示します。
ConfigMap オブジェクト定義
kind: ConfigMap
apiVersion: v1
metadata:
creationTimestamp: 2016-02-18T19:14:38Z
name: example-config
namespace: my-namespace
data:
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
各項目の説明:
data- 設定データを指定します。
binaryData.bar- バイナリー Java キーストアファイルなど、UTF8 以外のデータを含むファイルを指定します。Base 64 のファイルデータを入力します。
イメージなどのバイナリーファイルから設定マップを作成する場合に、binaryData フィールドを使用できます。
設定データはさまざまな方法で Pod 内で使用できます。設定マップは以下を実行するために使用できます。
- コンテナーへの環境変数値の設定
- コンテナーのコマンドライン引数の設定
- ボリュームの設定ファイルの設定
ユーザーとシステムコンポーネントの両方が設定データを設定マップに保存できます。
設定マップはシークレットに似ていますが、機密情報を含まない文字列の使用をより効果的にサポートするように設計されています。
9.1.1. 設定マップの制限 リンクのコピーリンクがクリップボードにコピーされました!
設定マップは、コンテンツを Pod で使用される前に作成する必要があります。
コントローラーは、設定データが不足していても、その状況を許容して作成できます。ケースごとに設定マップを使用して設定される個々のコンポーネントを参照してください。
ConfigMap オブジェクトはプロジェクト内にあります。
それらは同じプロジェクトの Pod によってのみ参照されます。
Kubelet は、API サーバーから取得する Pod の設定マップの使用のみをサポートします。
これには、CLI を使用して作成された Pod、またはレプリケーションコントローラーから間接的に作成された Pod が含まれます。これには、OpenShift Container Platform ノードの --manifest-url フラグ、その --config フラグ、またはその REST API を使用して作成された Pod は含まれません (これらは Pod を作成する一般的な方法ではありません)。
9.1.2. 設定マップを使用してコンテナーで環境変数を設定する リンクのコピーリンクがクリップボードにコピーされました!
config map を使用して、コンテナーで個別の環境変数を設定するために使用したり、有効な環境変数名を生成するすべてのキーを使用してコンテナーで環境変数を設定するために使用したりすることができます。
以下の例の ConfigMap カスタムリソース (CR) には、2 つの環境変数が含まれています。
apiVersion: v1
kind: ConfigMap
metadata:
name: special-config
namespace: default
data:
special.how: very
special.type: charm
各項目の説明:
metadata.name- config map の名前を指定します。
metadata.namespace- config map が存在するプロジェクトを指定します。設定マップは同じプロジェクトの Pod によってのみ参照されます。
data- 注入する環境変数を指定します。
以下の例の ConfigMap (CR) には、1 つの環境変数が含まれています。
apiVersion: v1
kind: ConfigMap
metadata:
name: env-config
namespace: default
data:
log_level: INFO
各項目の説明:
metadata.name- config map の名前を指定します。
metadata.namespace- config map が存在するプロジェクトを指定します。設定マップは同じプロジェクトの Pod によってのみ参照されます。
data- 注入する環境変数を指定します。
手順
configMapKeyRefセクションを使用して、Pod のこのConfigMapのキーを使用できます。特定の環境変数を注入するように設定されている
Pod仕様のサンプルapiVersion: v1 kind: Pod metadata: name: dapi-test-pod spec: securityContext: runAsNonRoot: true seccompProfile: type: RuntimeDefault containers: - name: test-container image: gcr.io/google_containers/busybox command: [ "/bin/sh", "-c", "env" ] 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 optional: true envFrom: - configMapRef: name: env-config securityContext: allowPrivilegeEscalation: false capabilities: drop: [ALL] restartPolicy: Never各項目の説明:
spec.containers.env- config map から取得する環境変数を指定します。
spec.containers.env.name- キーの値を注入する Pod 環境変数の名前を指定します。
spec.containers.env.valueFrom.configMapKeyRef.name- 特定の環境変数を取得する config map の名前を指定します。
spec.containers.env.valueFrom.configMapKeyRef.key- config map から取得する環境変数を指定します。
spec.containers.env.valueFrom.configMapKeyRef.optional- 環境変数が省略可能であることを指定します。オプションとして、指定された config map とキーが存在しない場合でも、Pod は起動されます。
spec.containers.envFrom.configMapRef- 環境変数をすべて取得する config map の名前を指定します。
この Pod が実行されると、Pod のログには以下の出力が含まれます。
SPECIAL_LEVEL_KEY=very log_level=INFO注記SPECIAL_TYPE_KEY=charmは出力例にリスト表示されません。optional: trueが設定されているためです。
9.1.3. 設定マップを使用したコンテナーコマンドのコマンドライン引数の設定 リンクのコピーリンクがクリップボードにコピーされました!
Config map を使用すると、Kubernetes 置換構文 $(VAR_NAME) を使用して、コンテナー内のコマンドまたは引数の値を設定できます。
例として、以下の設定マップを見てみましょう。
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: securityContext: runAsNonRoot: true seccompProfile: type: RuntimeDefault 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 securityContext: allowPrivilegeEscalation: false capabilities: drop: [ALL] restartPolicy: Never各項目の説明:
spec.containers.command- 環境変数として使用するキーで、コンテナー内のコマンドに注入する値を指定します。
この Pod が実行されると、test-container コンテナーで実行される echo コマンドの出力は以下のようになります。
very charm
9.1.4. 設定マップの使用によるボリュームへのコンテンツの挿入 リンクのコピーリンクがクリップボードにコピーされました!
config map を使用すると、ボリュームにコンテンツを注入できます。
以下の例の ConfigMap カスタムリソース (CR) には、2 つの環境変数が含まれています。
apiVersion: v1
kind: ConfigMap
metadata:
name: special-config
namespace: default
data:
special.how: very
special.type: charm
以下の手順では、config map を使用してボリュームにコンテンツを注入するためのオプションを説明します。
手順
config map を使用してコンテンツをボリュームに注入するための最も基本的な方法は、キーがファイル名であり、ファイルの内容がキーの値になっているファイルでボリュームを設定する方法です。
apiVersion: v1 kind: Pod metadata: name: dapi-test-pod spec: securityContext: runAsNonRoot: true seccompProfile: type: RuntimeDefault containers: - name: test-container image: gcr.io/google_containers/busybox command: [ "/bin/sh", "-c", "cat", "/etc/config/special.how" ] volumeMounts: - name: config-volume mountPath: /etc/config securityContext: allowPrivilegeEscalation: false capabilities: drop: [ALL] volumes: - name: config-volume configMap: name: special-config restartPolicy: Never各項目の説明:
spec.volumes.configMap.nameキーを含むファイルを指定します。
この Pod が実行されると、cat コマンドの出力は以下のようになります。
very
設定マップキーが投影されるボリューム内のパスを制御することもできます。
apiVersion: v1 kind: Pod metadata: name: dapi-test-pod spec: securityContext: runAsNonRoot: true seccompProfile: type: RuntimeDefault containers: - name: test-container image: gcr.io/google_containers/busybox command: [ "/bin/sh", "-c", "cat", "/etc/config/path/to/special-key" ] volumeMounts: - name: config-volume mountPath: /etc/config securityContext: allowPrivilegeEscalation: false capabilities: drop: [ALL] volumes: - name: config-volume configMap: name: special-config items: - key: special.how path: path/to/special-key restartPolicy: Never各項目の説明:
spec.volumes.configMap.items.path- config map キーへのパスを指定します。
この Pod を実行すると、cat コマンドの出力は
veryです。