Kubernetesマニフェスト(Manifest)

これまでは基本的に、Podなどの情報をコマンド内に入れてコマンドを実行し、その都度やりたいことに応じたコマンド例を挙げてきた。たとえば、前のセクションでDeploymentを起動したあとPod数を増やす、といった書き方が典型的な例である。このように毎回やりたいことを命令する方法を命令的という。この方法はhow、つまりどのように行うかに注目している。

これに対して、最終的に得たい状態を入力して作成を実行する方法を宣言的という。宣言的な場合は、情報、つまりwhatに注目して作成を実行する。

Kubernetesでは宣言的な記述方法として、YAMLファイル(マニフェスト)に情報を記載する方法を利用する。このYAMLファイルの中に、最終的に得たいPodなどの情報(what)を記入することで、目的のものをKubernetesに自動で作成させる。このとき、Kubernetesではどのように作るか(how)を考える必要がないため、このhowを抽象化できる点が宣言的な方法の利点だといえる。

たとえば、次の2つは同じものを命令的(kubectl run)に記載した例と、宣言的(pod.yaml)に作成した例である。

命令的: kubectl run

kubectl run --image gcr.io/google-samples/hello-app:1.0 --restart Never Helloworld

宣言的: pod.yaml

apiVersion: v1
kind: Pod
metadata:
  creationTimestamp: null
  labels:
    run: helloworld
  name: helloworld
spec:
  containers:
  - env:
    - name: TEST_ENV
      value: Hello_World
    image: gcr.io/google-samples/hello-app:1.0
    ports:
    - containerPort: 8080

命令的な作成から宣言的な作成への変換は、以下のコマンドでも実行できる。

kubectl run --image gcr.io/google-samples/hello-app:1.0 --restart Never helloworld -o yaml helloworld > pod.yaml

このようにYAMLを指定してkubectl runと同じPodを作成するには、kubectl applyコマンドで作成したYAMLファイルを指定すればよい。

kubectl apply -f pod.yaml

次に、YAMLファイルに記述した内容について見ていく。ただし、すべての内容をここで扱うと量が膨大になるため、一部だけを取り上げる。他の項目については公式ドキュメントを参照してほしい。 上で説明したpod.yamlファイルが、おそらく最も簡単な形である。ただし、大規模な構成でも考え方は同じである。

このYAMLファイルの1段目に記載されているものから見てみよう。大きく4つの項目があることがわかる。それぞれの項目は次の意味を持つ。

key 意味
apiVersion 表示したいKubernetes ObjectのVersionを指定
kind apiVersionで指定したKubernetes Objectセットの中から、使用したいタイプを指定
例: Pod, ReplicaSet, Deployment
metadata オブジェクト情報を指定(名前など、一意に識別するための情報)
spec オブジェクトに適用したい内容を指定

上の4項目はYAMLファイルを作成するときの必須項目である。また、作成対象の種類によって2段目以降に記述する項目は変わるため、詳細な説明は省略する。

今回作成したファイルには、以下のような設定が記述されている。

1段目 2段目 3段目 説明
metadata - - -
- creationTimestamp - ノード作成時間を残すかどうかの設定
- labels - Kubernetesノードラベル(公式ドキュメント参照
- name - namespace内で一意なオブジェクト名を設定
spec - - -
- containers - コンテナ仕様を設定
- - env 環境変数をコンテナに指定
- - image Dockerイメージのリポジトリおよびタグ
- - ports Pod外部からのリクエストを受けるために開かれたポート一覧