【Kubernetes】Imperative (命令型) VS Declarative (宣言型)の違い　no.7

![名称未設定のデザイン (12).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011305/f2a45cf7-e7c8-a81e-7215-5d2c174c94ea.png)

こんにちは。

まゆみです。

Kubernetesについての記事をシリーズで書いています

今回の記事では、Kubernetesオブジェクト管理の異なる2つのアプローチ方法について書いていこうと思います

具体的には、Kubernetesのオブジェクト管理は

>①Imperative (命令型)
②Declarative (宣言型)

の２つがあります

実は今までの記事で書いていたのは『Imperative』による方法です。(記事の中で明示していませんでしたが。。。)

なので今回の記事では、<font color="Red">Imperative と Declarative の違いを明確にしたうえで、Declarativeによるオブジェクト管理の実際の方法</font>を書いていこうと思います

ではさっそく始めていきますね。

#Docker CLI とDocker-composeの違いのようなもの

読者の皆さんが、Docker コマンドとdocker-composeコマンドの違いをご理解しているという前提で書きますね。

Imperative とDeclarativeの違いには

>Imperative がDockerでの1つ1つのコマンドだとすれば

>Declarativeはdocker-composeを利用してコンテナをrunすることだ

ということです。

今までのKubernetesに関するシリーズの記事では<font color="Red">Imperativeな方法によって、コマンドを1行づつ実行し</font>podやdeploymentを作ったり・削除したりしてきました。

ただ、より複雑なサービスを作るに従い、コマンドが長くなったり、何度も間違いなくコマンドを打ったりするのが大変だったと思います

Declarativeな方法を使うことでコマンドを繰り返し書かなければいけないという苦痛から解放されましょう。

#実際のDeclarativeなアプローチはこんな感じ

[Kubernetesドキュメント](https://kubernetes.io/ja/docs/concepts/overview/working-with-objects/kubernetes-objects/)から抜粋します

![2021-07-22_11-55-34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011305/407a5ac8-d54f-457a-20eb-ad617b1aa805.png)

docker-composeファイルを書いた時と同じような要領で

>どんなオブジェクトを作るのか
どのように作られるのか
他のどのオブジェクトと関連しているのか

などをyamlファイルに書き、ターミナルに戻って『どのyamlファイルの内容をclusterを作るために適用するのか？』という意味のコマンドを打ちます(docker-compose upでコンテナを実行したのと似ていますね。)

```
kubectl apply -f config.yaml
```

では下記に、Declarativeなアプローチの管理方法のより具体的な手順を書いていきますね。


#.yamlファイルを用意する

docker-composeでyamlファイルを使ったように、KubernetesのDeclarativeなオブジェクト管理でもyamlファイルを用意します。

<font color="Red">ファイル名はあなたの好きなようにつけて大丈夫ですが、拡張子を.yamlにしてください。</font>

##Visual Studio Codeを使っている人におすすめの拡張機能

Visual Studio Code を使っている人は(あくまでもオプションですが)『YAML』という拡張機能をインストールする事をおすすめします

![2021-07-21_16-53-39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011305/80e059b9-ee8d-9dd7-1653-a08b852d575d.png)

そして歯車をクリックして『拡張機能の設定』からsetting.json を下のように書き換えます

![2021-07-21_16-57-24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011305/c5130365-9d5a-73ad-5b54-a113b0b8bf80.png)

このように設定することで、例えばyamlファイルに書く項目(kindやmetadataなど)の頭文字『k』や『m』を打った時点で『kind』や『metadata』などとオートコンプリートしてくれます。

![2021-07-21_17-03-40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011305/624418b2-49e2-1f8c-0dae-9508c63b3b6c.png)

#yamlファイルに書くべく最低限必要の4つの項目

yamlファイルによってどんなオブジェクトを作るとしても、必ず書かなければならない項目が4つあります。

今回の記事では、yamlファイルに記載する項目として最低限必要な4つの項目を紹介して、締めくくろうと思います。

それは以下の4つの項目になります

<ul>
<li>apiVersion</li>
<li>kind</li>
<li>metadata</li>
<li>spec</li>
</ul>

になります。

上記の4つは必ず必要な項目なので先に書いて後で肉付けしていきましょう

一つづつ解説していきます

##apiVersion

バージョンを書きます。

今、この記事を書いている時点と、あなたがこの記事を読んでいる時点ではバージョンが違うかも知れないので、[Kubernetesのドキュメント](https://kubernetes.io/ja/docs/concepts/workloads/controllers/deployment/)を見て、確認しておいてくださいね。

![2021-07-22_12-18-47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011305/5378a946-5554-9621-6f01-3b47a8eccbc2.png)

##kind

どのオブジェクトを作成したいのかを書きます。

Deploymentと最初の文字は大文字になっていますので、大文字と小文字の違いにも注意して書いてください

また、Deployment以外のオブジェクトを作りたい時のyamlファイルの書き方については[KubernetesドキュメントのAPIリファレンスの項目](https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.21/#deployment-v1-apps)を参考にしてください。

![2021-07-22_12-31-38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011305/e4755dfa-39b0-4470-e2b4-6784418cca5b.png)

オブジェクトの種類ごとの書く項目の違いなどが記されています

##metadata

オブジェクトの名前を書きます

Imperativeなアプローチの時に

```
kubectl create deployment <deployment名>
```
とコマンドを打って、オブジェクトに名前をつけましたよね。
その<deployment名>をmetadataの欄に書きます

name: 以外にもmetadataの欄に書けるものがあります。

metadataの『ObjectMeta』と書いてある部分をクリックすると表示されますので、参考にどうぞ

![2021-07-22_12-40-50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011305/e3f88c5c-dacf-e104-bd4c-de253c5bf6cc.png)

![2021-07-22_12-46-41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011305/0f413908-4268-70ed-55cd-be3d8f163eb4.png)


##spec

yamlファイルで設定されるオブジェクトの詳細について書きます。

specに書く具体的な内容につきましては、記事を改めて書かせていただきますね。