環境変数によりコンテナにPod情報を共有する

このページでは、Podが内部で実行しているコンテナに自身の情報を共有する方法を説明します。環境変数ではPodのフィールドとコンテナのフィールドを共有することができます。

始める前に

Kubernetesクラスターが必要、かつそのクラスターと通信するためにkubectlコマンドラインツールが設定されている必要があります。 このチュートリアルは、コントロールプレーンのホストとして動作していない少なくとも2つのノードを持つクラスターで実行することをおすすめします。 まだクラスターがない場合、minikubeを使って作成するか、 以下のいずれかのKubernetesプレイグラウンドも使用できます:

バージョンを確認するには次のコマンドを実行してください: kubectl version.

Downward API

Podとコンテナのフィールドを実行中のコンテナに共有する方法は2つあります:

これら2つの方法を合わせて、Podとコンテナフィールドを共有する方法をDownward APIと呼びます。

Podフィールドを環境変数の値として使用する

この演習では、1つのコンテナを持つPodを作成します。Podの設定ファイルは次のとおりです:

apiVersion: v1 kind: Pod metadata:  name: dapi-envars-fieldref spec:  containers:  - name: test-container  image: registry.k8s.io/busybox  command: [ "sh", "-c"]  args:  - while true; do  echo -en '\n';  printenv MY_NODE_NAME MY_POD_NAME MY_POD_NAMESPACE;  printenv MY_POD_IP MY_POD_SERVICE_ACCOUNT;  sleep 10;  done;  env:  - name: MY_NODE_NAME  valueFrom:  fieldRef:  fieldPath: spec.nodeName  - name: MY_POD_NAME  valueFrom:  fieldRef:  fieldPath: metadata.name  - name: MY_POD_NAMESPACE  valueFrom:  fieldRef:  fieldPath: metadata.namespace  - name: MY_POD_IP  valueFrom:  fieldRef:  fieldPath: status.podIP  - name: MY_POD_SERVICE_ACCOUNT  valueFrom:  fieldRef:  fieldPath: spec.serviceAccountName  restartPolicy: Never 

設定ファイルには、5つの環境変数があります。envフィールドはEnvVarsの配列です。配列の最初の要素では、環境変数MY_NODE_NAMEの値をPodのspec.nodeNameフィールドから取得することを指定します。同様に、他の環境変数もPodのフィールドから名前を取得します。

Podを作成します:

kubectl apply -f https://k8s.io/examples/pods/inject/dapi-envars-pod.yaml 

Podのコンテナが実行されていることを確認します:

kubectl get pods 

コンテナのログを表示します:

kubectl logs dapi-envars-fieldref 

出力には、選択した環境変数の値が表示されます:

minikube dapi-envars-fieldref default 172.17.0.4 default 

これらの値がログにある理由を確認するには、設定ファイルのcommandおよびargsフィールドを確認してください。コンテナが起動すると、5つの環境変数の値が標準出力に書き込まれます。これを10秒ごとに繰り返します。

次に、Podで実行しているコンテナへのシェルを取得します:

kubectl exec -it dapi-envars-fieldref -- sh 

シェルで環境変数を表示します:

/# printenv 

出力は、特定の環境変数にPodフィールドの値が割り当てられていることを示しています:

MY_POD_SERVICE_ACCOUNT=default ... MY_POD_NAMESPACE=default MY_POD_IP=172.17.0.4 ... MY_NODE_NAME=minikube ... MY_POD_NAME=dapi-envars-fieldref 

コンテナフィールドを環境変数の値として使用する

前の演習では、環境変数の値としてPodフィールドを使用しました。次の演習では、環境変数の値としてコンテナフィールドを使用します。これは、1つのコンテナを持つPodの設定ファイルです:

apiVersion: v1 kind: Pod metadata:  name: dapi-envars-resourcefieldref spec:  containers:  - name: test-container  image: registry.k8s.io/busybox:1.24  command: [ "sh", "-c"]  args:  - while true; do  echo -en '\n';  printenv MY_CPU_REQUEST MY_CPU_LIMIT;  printenv MY_MEM_REQUEST MY_MEM_LIMIT;  sleep 10;  done;  resources:  requests:  memory: "32Mi"  cpu: "125m"  limits:  memory: "64Mi"  cpu: "250m"  env:  - name: MY_CPU_REQUEST  valueFrom:  resourceFieldRef:  containerName: test-container  resource: requests.cpu  - name: MY_CPU_LIMIT  valueFrom:  resourceFieldRef:  containerName: test-container  resource: limits.cpu  - name: MY_MEM_REQUEST  valueFrom:  resourceFieldRef:  containerName: test-container  resource: requests.memory  - name: MY_MEM_LIMIT  valueFrom:  resourceFieldRef:  containerName: test-container  resource: limits.memory  restartPolicy: Never 

設定ファイルには、4つの環境変数があります。envフィールドはEnvVarsの配列です。配列の最初の要素では、環境変数MY_CPU_REQUESTの値をtest-containerという名前のコンテナのrequests.cpuフィールドから取得することを指定します。同様に、他の環境変数もコンテナのフィールドから値を取得します。

Podを作成します:

kubectl apply -f https://k8s.io/examples/pods/inject/dapi-envars-container.yaml 

Podのコンテナが実行されていることを確認します:

kubectl get pods 

コンテナのログを表示します:

kubectl logs dapi-envars-resourcefieldref 

出力には、選択した環境変数の値が表示されます:

1 1 33554432 67108864 

次の項目