この連載が書籍になりました!『Kubernetes完全ガイド

KubernetesのConfig&Storageリソース(その1)

2018年5月31日(木)
青山 真也
今回と次回の2回に渡って、5種類に大別されるKubernetesのリソースのうち、Config&Storageリソースを解説する。

Config&Storageリソース

連載の第3回目で、Kubernetesのリソースは5種類に大別されることをお話しました。そのうちの1つであるConfig&Storageリソースについて、今回と次回の2回で解説します。

5種類に大別できるKubernetesのリソース

リソースの分類内容
Workloadsリソースコンテナの実行に関するリソース
Discovery&LBリソースコンテナを外部公開するようなエンドポイントを提供するリソース
Config&Storageリソース設定・機密情報・永続化ボリュームなどに関するリソース
Clusterリソースセキュリティやクォータなどに関するリソース
Metadataリソースリソースを操作する系統のリソース

Config&Storageリソースは、コンテナに対して設定ファイル、パスワードなどの機密情報などをインジェクトしたり、永続化ボリュームを提供したりするためのリソースです。内部的に利用されているものを除いて、利用者が直接利用するものとしては、全部で3種類のConfig&Storageリソースが存在します。

  • Secret
  • ConfigMap
  • PersistentVolumeClaim

環境変数の利用

Kubernetesでは、個別のコンテナに対する設定の内容は環境変数やファイルが置かれた領域をマウントして渡すことが一般的です。そこで、リソースの解説に入る前に、Kubernetesでの環境変数の扱いについて解説します。

Kubernetesで環境変数を渡す際には、podテンプレートにenvまたはenvFromを指定します。大きく分けて、下記の5つの情報源から環境変数を埋め込むことが可能です。

  • 静的設定
  • Podの情報
  • Containerの情報
  • Secretリソースの機密情報
  • ConfigMapリソースからのKey-Value値

静的設定

静的設定では、その名の通りspec.containers[].envに静的な値として定義します。

リスト1:envで環境変数に値を渡す例

apiVersion: v1
kind: Pod
metadata:
  name: sample-env
  labels:
    app: sample-app
spec:
  containers:
    - name: nginx-container
      image: nginx:1.12
      env:
        - name: MAX_CONNECTION
          value: "100"

$ kubectl apply -f env-sample.yml

コンテナ内から見てみると、環境変数が設定されていることを確認できます。

リスト2:静的に設定した環境変数を確認

$ kubectl exec -it sample-env env | grep MAX_CONNECTION
MAX_CONNECTION=100

Podの情報

どのノードで起動しているか、Pod自身のIP Address、起動時間などのPodに関する情報は、fieldRefを使うことで参照できます。参照可能な値に関しては、「kubectl get pods -o yaml」などで確認できます。一部抜粋すると、登録したYAMLファイルの情報とは別に、PodのIPやホストの情報といった様々な情報が追加されていることが確認できます。

リスト3:Podの情報を確認

# 起動しているPodの情報を確認
$ kubectl get pod nginx-pod -o yaml
…(省略)…
spec:
  nodeName: gke-k8s-default-pool-9c2aa160-v5v4
  restartPolicy: Always
  schedulerName: default-scheduler
  securityContext: {}
  serviceAccount: default
  serviceAccountName: default
  terminationGracePeriodSeconds: 30
…(省略)…
status:
  hostIP: 10.240.0.9
  phase: Running
  podIP: 10.8.2.77
  qosClass: Burstable
  startTime: 2018-05-27T05:23:00Z
…(省略)…

今回は起動しているホスト名を環境変数として登録してみます。先ほど出力したYAMLの形式に沿ってKeyを指定するため、spec.nodeNameを指定します。

リスト4:ホスト名を環境変数に登録するenv-pod-sample.yml

# 起動しているKubernetes Nodeの名前をK8S_NODE環境変数に登録
apiVersion: v1
kind: Pod
metadata:
  name: sample-env-pod
  labels:
    app: sample-app
spec:
  containers:
    - name: nginx-container
      image: nginx:1.12
      env:
        - name: K8S_NODE
          valueFrom:
            fieldRef:
              fieldPath: spec.nodeName

$ kubectl apply -f env-pod-sample.yml

コンテナ内から見てみると、環境変数が設定されていることを確認できます。

リスト5:環境変数が設定されていることを確認

$ kubectl exec -it sample-env-pod env | grep K8S_NODE
K8S_NODE=tmp-check-iyhhhlpiq-ake-ntmqohp

Containerの情報

Podの情報と同様に、Containerに関する情報はresourceFieldRefを使うことで参照することが可能です。Podには複数のContainerの情報が含まれており、各Containerに対して設定可能な値についてはfieldRefでは参照できない点に注意してください。こちらも同様に参照可能な値に関しては、「kubectl get pods -o yaml」などで確認することができます。

リスト6:Containerに関する情報を環境変数に登録するenv-container-sample.yml

# CPUのRequests/Limitsを環境変数に登録
apiVersion: v1
kind: Pod
metadata:
  name: sample-env-container
  labels:
    app: sample-app
spec:
  containers:
    - name: nginx-container
      image: nginx:1.12
      env:
        - name: CPU_REQUEST
          valueFrom:
            resourceFieldRef:
              containerName: nginx-container
              resource: requests.cpu
        - name: CPU_LIMIT
          valueFrom:
            resourceFieldRef:
              containerName: nginx-container
              resource: limits.cpu

$ kubectl apply -f env-container-sample.yml

コンテナ内から見てみると、環境変数が設定されていることを確認できます。

リスト7:設定された環境変数を確認

$ kubectl exec -it sample-env-container  env | grep CPU
CPU_REQUEST=0
CPU_LIMIT=3

Secretリソースの機密情報

機密情報などは別途Secretリソースを作成し、環境変数として参照させることが推奨されています。詳しくはSecretリソースの項目で説明します。

ConfigMapリソースからのKey-Value値

単純なKey-Value値や設定ファイルなどは、ConfigMapで管理することが可能です。Podに都度環境変数を埋め込んでも問題ありませんが、一括での変更や重複が多い場合にはConfigMapの利用を検討して下さい。詳しくはConfigMapリソースの項目で説明します。

環境変数利用時の注意点

Kubernetesで渡される環境変数には、少し癖があります。例えば、下記のPodのテンプレートは一見すると正しく動作して、コンテナ起動後に「100」と「ホスト名」が出力されるように見えます。

リスト8:環境変数の展開を期待するYAML Manifest(失敗)

# 環境変数の展開を期待するYAML Manifest(失敗)
apiVersion: v1
kind: Pod
metadata:
  name: sample-fail-env
  labels:
    app: sample-app
spec:
  containers:
    - name: nginx-container
      image: nginx:1.12
      command: ["echo"]
      args: ["${TESTENV}", "${HOSTNAME}"]
      env:
        - name: TESTENV
          value: "100"

$ kubectl apply -f fail-env-sample.yml

$ kubectl logs sample-fail-env
${TESTENV} ${HOSTNAME}

しかしこのPodを起動すると${TESTENV} ${HOSTNAME}という文字列が出力されてしまいます。Kubernetesでは commandargsで実行するコマンドを指定する際に通常通り環境変数を利用することはできません。厳密に言うと、Podテンプレート内で定義された環境変数に限り(TESTENV)という形式で呼び出すことが可能です。つまり、${}ではなく$()を利用するということです。これに従い上述のテンプレートを書き直すと、下記のようになります。

リスト9:環境変数の展開を期待するYAML Manifest(一部成功)

# 環境変数の展開を期待するYAML Manifest(一部成功)
apiVersion: v1
kind: Pod
metadata:
  name: sample-fail-env
  labels:
    app: sample-app
spec:
  containers:
    - name: nginx-container
      image: nginx:1.12
      command: ["echo"]
      args: ["$(TESTENV)", "$(HOSTNAME)"]
      env:
        - name: TESTENV
          value: "100"

$ kubectl apply -f fail-env-sample.yml
$ kubectl logs sample-fail-env
100 $(HOSTNAME)

このPodを実行すると、100 $(HOSTNAME)と出力されます。あくまでも、command,argsで参照可能なのは、そのPodテンプレート内で定義された環境変数のみ(この場合はTESTENV)だということに注意して下さい。もしOSからしか参照できない環境変数を利用する場合には、Entrypoint(command)をentrypoint.shなどのシェルスクリプトにして、シェルスクリプト内で処理を行うようにして下さい。

株式会社サイバーエージェント アドテク本部 Strategic Infrastructure Agency

2016年入社。OpenStackを使ったプライベートクラウドやGKE互換なコンテナプラットフォームをゼロから構築し、国内カンファレンスでのKeynoteに登壇。
その後、世界で2番目にCertified Kubernetes Application Developer、138番目にCertified Kubernetes Administratorの認定資格を取得。
現在はKubernetesやOpenStackなどOSSへのコントリビュート活動をはじめ、CNCF公式のCloud Native Meetup TokyoのOrganizerやJapan Container Daysの運営などコミュニティ活動にも従事している。

連載バックナンバー

仮想化/コンテナ技術解説
第9回

KubernetesのConfig&Storageリソース(その2)

2018/6/6
連載9回目となる今回は、Config&Storageリソースのうち、PersistentVolumeClaimについて解説する。
仮想化/コンテナ技術解説
第8回

KubernetesのConfig&Storageリソース(その1)

2018/5/31
今回と次回の2回に渡って、5種類に大別されるKubernetesのリソースのうち、Config&Storageリソースを解説する。
仮想化/コンテナ技術解説
第7回

KubernetesのDiscovery&LBリソース(その2)

2018/5/16
前回に引き続き、Discovery&LBリソースのServiceとIngressを紹介する。

Think ITメルマガ会員登録受付中

Think ITでは、技術情報が詰まったメールマガジン「Think IT Weekly」の配信サービスを提供しています。メルマガ会員登録を済ませれば、メルマガだけでなく、さまざまな限定特典を入手できるようになります。

Think ITメルマガ会員のサービス内容を見る

他にもこの記事が読まれています