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外部からのリクエストを受けるために開かれたポート一覧 |