7.5. コンテナーによる API オブジェクト使用の許可
Downward API は、OpenShift Container Platform に結合せずにコンテナーが API オブジェクトの情報を使用できるメカニズムです。この情報には、Pod の名前、namespace およびリソース値が含まれます。コンテナーは、環境変数やボリュームプラグインを使用して Downward API からの情報を使用できます。
7.5.1. Downward API の使用によるコンテナーへの Pod 情報の公開
Downward API には、Pod の名前、プロジェクト、リソースの値などの情報が含まれます。コンテナーは、環境変数やボリュームプラグインを使用して Downward API からの情報を使用できます。
Pod 内のフィールドは、FieldRef
API タイプを使用して選択されます。FieldRef
には 2 つのフィールドがあります。
フィールド | 説明 |
---|---|
| Pod に関連して選択するフィールドのパスです。 |
|
|
現時点で v1 API の有効なセレクターには以下が含まれます。
セレクター | 説明 |
---|---|
| Pod の名前です。これは環境変数およびボリュームでサポートされています。 |
| Pod の namespace です。 これは環境変数およびボリュームでサポートされています。 |
| Pod のラベルです。これはボリュームでのみサポートされ、環境変数ではサポートされていません。 |
| Pod のアノテーションです。これはボリュームでのみサポートされ、環境変数ではサポートされていません。 |
| Pod の IP です。これは環境変数でのみサポートされ、ボリュームではサポートされていません。 |
apiVersion
フィールドは、指定されていない場合は、対象の Pod テンプレートの API バージョンにデフォルト設定されます。
7.5.2. Downward API を使用してコンテナーの値を使用する方法について
コンテナーは、環境変数やボリュームプラグインを使用して API の値を使用することができます。選択する方法により、コンテナーは以下を使用できます。
- Pod の名前
- Pod プロジェクト/namespace
- Pod のアノテーション
- Pod のラベル
アノテーションとラベルは、ボリュームプラグインのみを使用して利用できます。
7.5.2.1. 環境変数の使用によるコンテナー値の使用
コンテナーの環境変数を設定する際に、EnvVar
タイプの valueFrom
フィールド (タイプは EnvVarSource
) を使用して、変数の値が value
フィールドで指定されるリテラル値ではなく、FieldRef
ソースからの値になるように指定します。
この方法で使用できるのは Pod の定数属性のみです。変数の値の変更についてプロセスに通知する方法でプロセスを起動すると、環境変数を更新できなくなるためです。環境変数を使用してサポートされるフィールドには、以下が含まれます。
- Pod の名前
- Pod プロジェクト/namespace
手順
コンテナーで使用する環境変数を含む新しい Pod 仕様を作成します。
次のような
pod.yaml
ファイルを作成します。apiVersion: v1 kind: Pod metadata: name: dapi-env-test-pod spec: containers: - name: env-test-container image: gcr.io/google_containers/busybox command: [ "/bin/sh", "-c", "env" ] env: - name: MY_POD_NAME valueFrom: fieldRef: fieldPath: metadata.name - name: MY_POD_NAMESPACE valueFrom: fieldRef: fieldPath: metadata.namespace restartPolicy: Never # ...
pod.yaml
ファイルから Pod を作成します。$ oc create -f pod.yaml
検証
コンテナーのログで
MY_POD_NAME
およびMY_POD_NAMESPACE
の値を確認します。$ oc logs -p dapi-env-test-pod
7.5.2.2. ボリュームプラグインを使用したコンテナー値の使用
コンテナーは、ボリュームプラグイン使用して API 値を使用できます。
コンテナーは、以下を使用できます。
- Pod の名前
- Pod プロジェクト/namespace
- Pod のアノテーション
- Pod のラベル
手順
ボリュームプラグインを使用するには、以下の手順を実行します。
コンテナーで使用する環境変数を含む新しい Pod 仕様を作成します。
次のような
volume-pod.yaml
ファイルを作成します。kind: Pod apiVersion: v1 metadata: labels: zone: us-east-coast cluster: downward-api-test-cluster1 rack: rack-123 name: dapi-volume-test-pod annotations: annotation1: "345" annotation2: "456" spec: containers: - name: volume-test-container image: gcr.io/google_containers/busybox command: ["sh", "-c", "cat /tmp/etc/pod_labels /tmp/etc/pod_annotations"] volumeMounts: - name: podinfo mountPath: /tmp/etc readOnly: false volumes: - name: podinfo downwardAPI: defaultMode: 420 items: - fieldRef: fieldPath: metadata.name path: pod_name - fieldRef: fieldPath: metadata.namespace path: pod_namespace - fieldRef: fieldPath: metadata.labels path: pod_labels - fieldRef: fieldPath: metadata.annotations path: pod_annotations restartPolicy: Never # ...
volume-pod.yaml
ファイルから Pod を作成します。$ oc create -f volume-pod.yaml
検証
コンテナーのログを確認し、設定されたフィールドの有無を確認します。
$ oc logs -p dapi-volume-test-pod
出力例
cluster=downward-api-test-cluster1 rack=rack-123 zone=us-east-coast annotation1=345 annotation2=456 kubernetes.io/config.source=api
7.5.3. Downward API を使用してコンテナーリソースを使用する方法について
Pod の作成時に、Downward API を使用してコンピューティングリソースの要求および制限に関する情報を挿入し、イメージおよびアプリケーションの作成者が特定の環境用のイメージを適切に作成できるようにします。
環境変数またはボリュームプラグインを使用してこれを実行できます。
7.5.3.1. 環境変数を使用したコンテナーリソースの使用
Pod を作成するときは、Downward API を使用し、環境変数を使用してコンピューティングリソースの要求と制限に関する情報を挿入できます。
Pod 設定の作成時に、spec.container
フィールド内の resources
フィールドの内容に対応する環境変数を指定します。
リソース制限がコンテナー設定に含まれていない場合、Downward API はデフォルトでノードの CPU およびメモリーの割り当て可能な値に設定されます。
手順
注入するリソースを含む新しい Pod 仕様を作成します。
次のような
pod.yaml
ファイルを作成します。apiVersion: v1 kind: Pod metadata: name: dapi-env-test-pod spec: containers: - name: test-container image: gcr.io/google_containers/busybox:1.24 command: [ "/bin/sh", "-c", "env" ] resources: requests: memory: "32Mi" cpu: "125m" limits: memory: "64Mi" cpu: "250m" env: - name: MY_CPU_REQUEST valueFrom: resourceFieldRef: resource: requests.cpu - name: MY_CPU_LIMIT valueFrom: resourceFieldRef: resource: limits.cpu - name: MY_MEM_REQUEST valueFrom: resourceFieldRef: resource: requests.memory - name: MY_MEM_LIMIT valueFrom: resourceFieldRef: resource: limits.memory # ...
pod.yaml
ファイルから Pod を作成します。$ oc create -f pod.yaml
7.5.3.2. ボリュームプラグインを使用したコンテナーリソースの使用
Pod を作成するときは、Downward API を使用し、ボリュームプラグインを使用してコンピューティングリソースの要求と制限に関する情報を挿入できます。
Pod 設定の作成時に、spec.volumes.downwardAPI.items
フィールドを使用して spec.resources
フィールドに対応する必要なリソースを記述します。
リソース制限がコンテナー設定に含まれていない場合、Downward API はデフォルトでノードの CPU およびメモリーの割り当て可能な値に設定されます。
手順
注入するリソースを含む新しい Pod 仕様を作成します。
次のような
pod.yaml
ファイルを作成します。apiVersion: v1 kind: Pod metadata: name: dapi-env-test-pod spec: containers: - name: client-container image: gcr.io/google_containers/busybox:1.24 command: ["sh", "-c", "while true; do echo; if [[ -e /etc/cpu_limit ]]; then cat /etc/cpu_limit; fi; if [[ -e /etc/cpu_request ]]; then cat /etc/cpu_request; fi; if [[ -e /etc/mem_limit ]]; then cat /etc/mem_limit; fi; if [[ -e /etc/mem_request ]]; then cat /etc/mem_request; fi; sleep 5; done"] resources: requests: memory: "32Mi" cpu: "125m" limits: memory: "64Mi" cpu: "250m" volumeMounts: - name: podinfo mountPath: /etc readOnly: false volumes: - name: podinfo downwardAPI: items: - path: "cpu_limit" resourceFieldRef: containerName: client-container resource: limits.cpu - path: "cpu_request" resourceFieldRef: containerName: client-container resource: requests.cpu - path: "mem_limit" resourceFieldRef: containerName: client-container resource: limits.memory - path: "mem_request" resourceFieldRef: containerName: client-container resource: requests.memory # ...
volume-pod.yaml
ファイルから Pod を作成します。$ oc create -f volume-pod.yaml
7.5.4. Downward API を使用したシークレットの使用
Pod の作成時に、Downward API を使用してシークレットを挿入し、イメージおよびアプリケーションの作成者が特定の環境用のイメージを作成できるようにできます。
手順
注入するシークレットを作成します。
次のような
secret.yaml
ファイルを作成します。apiVersion: v1 kind: Secret metadata: name: mysecret data: password: <password> username: <username> type: kubernetes.io/basic-auth
secret.yaml
ファイルからシークレットオブジェクトを作成します。$ oc create -f secret.yaml
上記の
Secret
オブジェクトからusername
フィールドを参照する Pod を作成します。次のような
pod.yaml
ファイルを作成します。apiVersion: v1 kind: Pod metadata: name: dapi-env-test-pod spec: containers: - name: env-test-container image: gcr.io/google_containers/busybox command: [ "/bin/sh", "-c", "env" ] env: - name: MY_SECRET_USERNAME valueFrom: secretKeyRef: name: mysecret key: username restartPolicy: Never # ...
pod.yaml
ファイルから Pod を作成します。$ oc create -f pod.yaml
検証
コンテナーのログで
MY_SECRET_USERNAME
の値を確認します。$ oc logs -p dapi-env-test-pod
7.5.5. Downward API を使用した設定マップの使用
Pod の作成時に、Downward API を使用して設定マップの値を挿入し、イメージおよびアプリケーションの作成者が特定の環境用のイメージを作成することができるようにすることができます。
手順
注入する値を含む config map を作成します。
次のような
configmap.yaml
ファイルを作成します。apiVersion: v1 kind: ConfigMap metadata: name: myconfigmap data: mykey: myvalue
configmap.yaml
ファイルから config map を作成します。$ oc create -f configmap.yaml
上記の config map を参照する Pod を作成します。
次のような
pod.yaml
ファイルを作成します。apiVersion: v1 kind: Pod metadata: name: dapi-env-test-pod spec: containers: - name: env-test-container image: gcr.io/google_containers/busybox command: [ "/bin/sh", "-c", "env" ] env: - name: MY_CONFIGMAP_VALUE valueFrom: configMapKeyRef: name: myconfigmap key: mykey restartPolicy: Always # ...
pod.yaml
ファイルから Pod を作成します。$ oc create -f pod.yaml
検証
コンテナーのログで
MY_CONFIGMAP_VALUE
の値を確認します。$ oc logs -p dapi-env-test-pod
7.5.6. 環境変数の参照
Pod の作成時に、$()
構文を使用して事前に定義された環境変数の値を参照できます。環境変数の参照が解決されない場合、値は提供された文字列のままになります。
手順
既存の環境変数を参照する Pod を作成します。
次のような
pod.yaml
ファイルを作成します。apiVersion: v1 kind: Pod metadata: name: dapi-env-test-pod spec: containers: - name: env-test-container image: gcr.io/google_containers/busybox command: [ "/bin/sh", "-c", "env" ] env: - name: MY_EXISTING_ENV value: my_value - name: MY_ENV_VAR_REF_ENV value: $(MY_EXISTING_ENV) restartPolicy: Never # ...
pod.yaml
ファイルから Pod を作成します。$ oc create -f pod.yaml
検証
コンテナーのログで
MY_ENV_VAR_REF_ENV
値を確認します。$ oc logs -p dapi-env-test-pod
7.5.7. 環境変数の参照のエスケープ
Pod の作成時に、二重ドル記号を使用して環境変数の参照をエスケープできます。次に値は指定された値の単一ドル記号のバージョンに設定されます。
手順
既存の環境変数を参照する Pod を作成します。
次のような
pod.yaml
ファイルを作成します。apiVersion: v1 kind: Pod metadata: name: dapi-env-test-pod spec: containers: - name: env-test-container image: gcr.io/google_containers/busybox command: [ "/bin/sh", "-c", "env" ] env: - name: MY_NEW_ENV value: $$(SOME_OTHER_ENV) restartPolicy: Never # ...
pod.yaml
ファイルから Pod を作成します。$ oc create -f pod.yaml
検証
コンテナーのログで
MY_NEW_ENV
値を確認します。$ oc logs -p dapi-env-test-pod