これは、このセクションの複数ページの印刷可能なビューです。 印刷するには、ここをクリックしてください.
アプリケーションへのデータ注入
1 - コンテナにコマンドと引数を定義する
このページでは、Podでコンテナを実行するときにコマンドと引数を定義する方法を説明します。
始める前に
Kubernetesクラスターが必要、かつそのクラスターと通信するためにkubectlコマンドラインツールが設定されている必要があります。 このチュートリアルは、コントロールプレーンのホストとして動作していない少なくとも2つのノードを持つクラスターで実行することをおすすめします。 まだクラスターがない場合、minikubeを使って作成するか、 以下のいずれかのKubernetesプレイグラウンドも使用できます:
バージョンを確認するには次のコマンドを実行してください:  kubectl version.
Podの作成時にコマンドと引数を定義する
Podを作成するときに、Pod内で実行するコンテナのコマンドと引数を定義できます。コマンドを定義するには、設定ファイルにcommandフィールドを記述します。コマンドの引数を定義するには、設定ファイルにargsフィールドを記述します。定義したコマンドと引数はPodの作成後に変更することはできません。
設定ファイルで定義したコマンドと引数は、コンテナイメージが提供するデフォルトのコマンドと引数を上書きします。引数を定義し、コマンドを定義しなかった場合、デフォルトのコマンドと新しい引数が使用されます。
備考:
commandフィールドは、いくつかのコンテナランタイムではエントリポイントに相当します。この演習では、1つのコンテナを実行するPodを作成します。Podの設定ファイルには、コマンドと2つの引数を定義します。
apiVersion: v1
kind: Pod
metadata:
  name: command-demo
  labels:
    purpose: demonstrate-command
spec:
  containers:
  - name: command-demo-container
    image: debian
    command: ["printenv"]
    args: ["HOSTNAME", "KUBERNETES_PORT"]
  restartPolicy: OnFailure
- 
YAMLの設定ファイルに基づいてPodを作成
kubectl apply -f https://k8s.io/examples/pods/commands.yaml - 
実行中のPodをリストアップ
kubectl get pods出力は、command-demo Podで実行されたコンテナが完了したことを示します。
 - 
コンテナ内で実行されたコマンドの出力を確認するためにPodのログを見る
kubectl logs command-demo出力は、HOSTNAMEとKUBERNETES_PORT環境変数の値を示します。
command-demo tcp://10.3.240.1:443 
環境変数を使って引数を定義する
前述の例では、文字列を指定して引数を直接定義しました。文字列を直接指定する代わりに、環境変数を使用して引数を定義することもできます。
env:
- name: MESSAGE
  value: "hello world"
command: ["/bin/echo"]
args: ["$(MESSAGE)"]
つまり、ConfigMapやSecretなど、環境変数を定義するために利用可能な技術のどれを使っても、Podの引数を定義できるということです。
備考:
環境変数は"$(VAR)"という括弧で囲まれて表示されます。これは、commandやargsフィールドで変数を展開するために必要です。シェルでコマンドを実行する
シェルでコマンドを実行する必要がある場合もあります。例えば、コマンドが複数のコマンドをパイプでつないだものであったり、シェルスクリプトであったりします。コマンドをシェルで実行するには、次のように記述します。
command: ["/bin/sh"]
args: ["-c", "while true; do echo hello; sleep 10;done"]
次の項目
- Podとコンテナの設定についてもっとよく知る
 - コンテナ内でのコマンド実行についてもっとよく知る
 - コンテナのAPIを確認する
 
2 - コンテナの環境変数の定義
このページでは、Kubernetes Podでコンテナの環境変数を定義する方法を説明します。
始める前に
Kubernetesクラスターが必要、かつそのクラスターと通信するためにkubectlコマンドラインツールが設定されている必要があります。 このチュートリアルは、コントロールプレーンのホストとして動作していない少なくとも2つのノードを持つクラスターで実行することをおすすめします。 まだクラスターがない場合、minikubeを使って作成するか、 以下のいずれかのKubernetesプレイグラウンドも使用できます:
バージョンを確認するには次のコマンドを実行してください:  kubectl version.
コンテナの環境変数を定義する
Podを作成するとき、そのPodで実行するコンテナに環境変数を設定することができます。環境変数を設定するには、設定ファイルに env または envFrom フィールドを含めます。
この演習では、1つのコンテナを実行するPodを作成します。Podの設定ファイルには、名前 DEMO_GREETING、値 "Hello from the environment"を持つ環境変数が定義されています。Podの設定マニフェストを以下に示します:
apiVersion: v1
kind: Pod
metadata:
  name: envar-demo
  labels:
    purpose: demonstrate-envars
spec:
  containers:
  - name: envar-demo-container
    image: gcr.io/google-samples/node-hello:1.0
    env:
    - name: DEMO_GREETING
      value: "Hello from the environment"
    - name: DEMO_FAREWELL
      value: "Such a sweet sorrow"
- 
マニフェストに基づいてPodを作成します:
kubectl apply -f https://k8s.io/examples/pods/inject/envars.yaml - 
実行中のPodを一覧表示します:
kubectl get pods -l purpose=demonstrate-envars出力は以下のようになります:
NAME READY STATUS RESTARTS AGE envar-demo 1/1 Running 0 9s - 
Podで実行しているコンテナのシェルを取得します:
kubectl exec -it envar-demo -- /bin/bash - 
シェルで
printenvコマンドを実行すると、環境変数の一覧が表示されます。# コンテナ内のシェルで以下のコマンドを実行します printenv出力は以下のようになります:
NODE_VERSION=4.4.2 EXAMPLE_SERVICE_PORT_8080_TCP_ADDR=10.3.245.237 HOSTNAME=envar-demo ... DEMO_GREETING=Hello from the environment DEMO_FAREWELL=Such a sweet sorrow - 
シェルを終了するには、
exitと入力します。 
備考:
envまたはenvFromフィールドを使用して設定された環境変数は、コンテナイメージで指定された環境変数を上書きします。備考:
環境変数は互いに参照することができますが、順序が重要です。同じコンテキストで定義されている他の変数を使用する場合は、その変数をリストの後に配置する必要があります。同様に、循環参照は避けてください。設定の中で環境変数を使用する
Podの設定で定義した環境変数は、Podのコンテナに設定したコマンドや引数など、設定の他の場所で使用することができます。以下の設定例では、環境変数GREETING、HONORORIFIC、NAMEにそれぞれ Warm greetings to、The Most Honorable、Kubernetesを設定しています。これらの環境変数は、env-print-demoコンテナに渡されるCLI引数で使われます。
apiVersion: v1
kind: Pod
metadata:
  name: print-greeting
spec:
  containers:
  - name: env-print-demo
    image: bash
    env:
    - name: GREETING
      value: "Warm greetings to"
    - name: HONORIFIC
      value: "The Most Honorable"
    - name: NAME
      value: "Kubernetes"
    command: ["echo"]
    args: ["$(GREETING) $(HONORIFIC) $(NAME)"]
作成されると、コンテナ上でecho Warm greetings to The Most Honorable Kubernetesというコマンドが実行されます。
次の項目
- 環境変数の詳細
 - Secretを環境変数として使用する詳細
 - EnvVarSourceをご覧ください。
 
3 - 環境変数によりコンテナに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のフィールドです。これらは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
次の項目
4 - Secretsで安全にクレデンシャルを配布する
このページでは、パスワードや暗号化キーなどの機密データをPodに安全に注入する方法を紹介します。
始める前に
Kubernetesクラスターが必要、かつそのクラスターと通信するためにkubectlコマンドラインツールが設定されている必要があります。 このチュートリアルは、コントロールプレーンのホストとして動作していない少なくとも2つのノードを持つクラスターで実行することをおすすめします。 まだクラスターがない場合、minikubeを使って作成するか、 以下のいずれかのKubernetesプレイグラウンドも使用できます:
作業するKubernetesサーバーは次のバージョン以降のものである必要があります: v1.6.バージョンを確認するには次のコマンドを実行してください:  kubectl version.
機密データをbase64でエンコードする
ユーザー名my-appとパスワード39528$vdg7Jbの2つの機密データが必要だとします。
まず、base64エンコーディングツールを使って、ユーザ名とパスワードをbase64表現に変換します。
ここでは、手軽に入手できるbase64プログラムを使った例を紹介します:
echo -n 'my-app' | base64
echo -n '39528$vdg7Jb' | base64
出力結果によると、ユーザ名のbase64表現はbXktYXBwで、パスワードのbase64表現はMzk1MjgkdmRnN0piです。
注意:
OSから信頼されているローカルツールを使用することで、外部ツールのセキュリティリスクを低減することができます。Secretを作成する
以下はユーザー名とパスワードを保持するSecretを作成するために使用できる設定ファイルです:
apiVersion: v1
kind: Secret
metadata:
  name: test-secret
data:
  username: bXktYXBw
  password: Mzk1MjgkdmRnN0pi
- 
Secret を作成する
kubectl apply -f https://k8s.io/examples/pods/inject/secret.yaml - 
Secretの情報を取得する
kubectl get secret test-secret出力:
NAME TYPE DATA AGE test-secret Opaque 2 1m - 
Secretの詳細な情報を取得する:
kubectl describe secret test-secret出力:
Name: test-secret Namespace: default Labels: <none> Annotations: <none> Type: Opaque Data ==== password: 13 bytes username: 7 bytes 
kubectlでSecretを作成する
base64エンコードの手順を省略したい場合は、kubectl create secretコマンドで同じSecretを作成することができます。
例えば:
kubectl create secret generic test-secret --from-literal='username=my-app' --from-literal='password=39528$vdg7Jb'
先ほどの詳細なアプローチでは 各ステップを明示的に実行し、何が起こっているかを示していますが、kubectl create secretの方が便利です。
Volumeにある機密情報をアクセスするPodを作成する
これはPodの作成に使用できる設定ファイルです。
apiVersion: v1
kind: Pod
metadata:
  name: secret-test-pod
spec:
  containers:
    - name: test-container
      image: nginx
      volumeMounts:
          # name must match the volume name below
          - name: secret-volume
            mountPath: /etc/secret-volume
  # The secret data is exposed to Containers in the Pod through a Volume.
  volumes:
    - name: secret-volume
      secret:
        secretName: test-secret
- 
Podを作成する:
kubectl apply -f https://k8s.io/examples/pods/inject/secret-pod.yaml - 
Podの
STATUSがRunningであるのを確認する:kubectl get pod secret-test-pod出力:
NAME READY STATUS RESTARTS AGE secret-test-pod 1/1 Running 0 42m - 
Podの中にあるコンテナにシェルを実行する
kubectl exec -i -t secret-test-pod -- /bin/bash - 
機密データは
/etc/secret-volumeにマウントされたボリュームを介してコンテナに公開されます。ディレクトリ
/etc/secret-volume中のファイルの一覧を確認する:# Run this in the shell inside the container ls /etc/secret-volumepasswordとusername2つのファイル名が出力される:password username - 
usernameとpasswordファイルの中身を表示する: 
# Run this in the shell inside the container
echo "$( cat /etc/secret-volume/username )"
echo "$( cat /etc/secret-volume/password )"
出力:
my-app
39528$vdg7Jb
Secretでコンテナの環境変数を定義する
単一のSecretでコンテナの環境変数を定義する
- 
Secretの中でkey-valueペアで環境変数を定義する:
kubectl create secret generic backend-user --from-literal=backend-username='backend-admin' - 
Secretで定義された
backend-usernameの値をPodの環境変数SECRET_USERNAMEに割り当てます。apiVersion: v1 kind: Pod metadata: name: env-single-secret spec: containers: - name: envars-test-container image: nginx env: - name: SECRET_USERNAME valueFrom: secretKeyRef: name: backend-user key: backend-username - 
Podを作成する:
kubectl create -f https://k8s.io/examples/pods/inject/pod-single-secret-env-variable.yaml - 
コンテナの環境変数
SECRET_USERNAMEの中身を表示する:kubectl exec -i -t env-single-secret -- /bin/sh -c 'echo $SECRET_USERNAME'出力:
backend-admin 
複数のSecretからコンテナの環境変数を定義する
- 
前述の例と同様に、まずSecretを作成します:
kubectl create secret generic backend-user --from-literal=backend-username='backend-admin' kubectl create secret generic db-user --from-literal=db-username='db-admin' - 
Podの中で環境変数を定義する:
apiVersion: v1 kind: Pod metadata: name: envvars-multiple-secrets spec: containers: - name: envars-test-container image: nginx env: - name: BACKEND_USERNAME valueFrom: secretKeyRef: name: backend-user key: backend-username - name: DB_USERNAME valueFrom: secretKeyRef: name: db-user key: db-username - 
Podを作成する:
kubectl create -f https://k8s.io/examples/pods/inject/pod-multiple-secret-env-variable.yaml - 
コンテナの環境変数を表示する:
kubectl exec -i -t envvars-multiple-secrets -- /bin/sh -c 'env | grep _USERNAME'出力:
DB_USERNAME=db-admin BACKEND_USERNAME=backend-admin 
Secretのすべてのkey-valueペアを環境変数として設定する
備考:
この機能は Kubernetes v1.6 以降から利用可能- 
複数のkey-valueペアを含むSecretを作成する
kubectl create secret generic test-secret --from-literal=username='my-app' --from-literal=password='39528$vdg7Jb' - 
envFromを使用してSecretのすべてのデータをコンテナの環境変数として定義します。SecretのキーがPodの環境変数名になります。
apiVersion: v1 kind: Pod metadata: name: envfrom-secret spec: containers: - name: envars-test-container image: nginx envFrom: - secretRef: name: test-secret - 
Podを作成する:
kubectl create -f https://k8s.io/examples/pods/inject/pod-secret-envFrom.yaml - 
usernameとpasswordコンテナの環境変数を表示するkubectl exec -i -t envfrom-secret -- /bin/sh -c 'echo "username: $username\npassword: $password\n"'出力:
username: my-app password: 39528$vdg7Jb