Kustiomizeを使ってk8sのyamlを楽にしたい

## サブタイトル
kustomizeを使っていい感じにいい感じする

## 最初に
この記事は継続的デリバリの予定です
## Kustomizeとは？
k8sのyamlをそのままに複数の目的で使うことができるように宣言的パッチを当てることができる
例えば
「あ～次のサービスはnginxのイメージ1から1.14にかえたいわ～」って時に役に立ちそう

- できること
  - パッチを当てるような書換が可能
  - imageだけやコマンドを書き換えるということは可能
- できないこと(苦手なこと)
  - 変数やテンプレートといったものを使うことができないためベースとなるyamlの構造に従う(意識する)必要がある(こいったことをしたいならhelmとかおすすめかも?)
  - KindやApiVersionなどは省略して書くことができない
  - PodやServiceのKindに対してパッチとしてKindを追加することができない
 
## どんなところで有効？
同じようなマニフェストがあるところで有効
ベースとなるマニフェストを崩さずコマンドを変えたり, コマンドを変更させたりすることができる
特にイメージのバージョンやコマンドだけが違う環境で効果を発揮する
例えばディレクトリ構成が↓のようなとき


```console

|-- v1.0
|   |-- pod.yaml
|   `-- service.yaml
`-- v1.14
    |-- pod.yaml
    `-- service.yaml
```
このときのそれぞれのyamlは以下のようになっている

<details><summary>v1.0/pod.yaml</summary><div>

```
apiVersion: v1
kind: Pod
metadata:
  name: nginx
spec:
  containers:
    - name: nginx
      image: nginx:1.0
      ports:
      - containerPort: 80
```
</div></details>

<details><summary>v1.0/service.yaml</summary><div>

```
apiVersion: v1
kind: Service
metadata:
  name: nginx
spec:
  ports:
    - port: 80
      targetPort: 80
  selector:
    app: nginx
  type: LoadBalancer
```
</div></details>

<details><summary>v1.14/pod.yaml</summary><div>

```
apiVersion: v1
kind: Pod
metadata:
  name: nginx
spec:
  containers:
    - name: nginx
      image: nginx:1.14
      ports:
      - containerPort: 80
```
</div></details>


<details><summary>v1.14/service.yaml</summary><div>

```
apiVersion: v1
kind: Service
metadata:
  name: nginx
spec:
  ports:
    - port: 80
      targetPort: 80
  selector:
    app: nginx
  type: LoadBalancer
```
</div></details>
見てもわかるようにpod.yamlはimageが1.0から1.14のみだ
service.yamlに関しては全く同じ内容となっている
こういうときに
「yamlいい感じにまとめてそのリソース使えないかな〜」的なことを思った方は
ぜひ一度試してほしいと思う

↓のようなディレクトリ構成をとる

```
nginx
|-- base
|   |-- kustomization.yaml
|   |-- pod.yaml
|   `-- service.yaml
|-- v1.0
|   |-- apply.yaml
|   |-- kustomization.yaml
|   `-- pod.yaml
`-- v1.14
    |-- kustomization.yaml
    `-- pod.yaml
```

baseフォルダが増えた.
結論から言うと結局長ったらしいマニフェストは書く必要がある(A Wall of Yaml)
今回は短くしたが.....

これはv1.0,v1.14の共通部分をまとめたものだ

<details><summary>base/pod.yaml</summary><div>

```
apiVersion: v1
kind: Pod
metadata:
  name: nginx
spec:
  containers:
    - name: nginx
      ports:
      - containerPort: 80
```
</div></details>


<details><summary>base/service.yaml</summary><div>

```
apiVersion: v1
kind: Service
metadata:
  name: nginx
spec:
  ports:
    - port: 80
      targetPort: 80
  selector:
    app: nginx
  type: LoadBalancer
```
</div></details>

<details><summary>base/kustomization.yaml</summary><div>

```
resources:
  - pod.yaml
  - service.yaml
```
</div></details>

base/kustomization.yamlは資源を活用するために書いているもの
ところでそれぞれのバージョンはどうなったのだろうか?

<details><summary>v1.0/pod.yaml</summary><div>

```
apiVersion: v1
kind: Pod
metadata:
  name: nginx
spec:
  containers:
    - name: nginx
      image: nginx:1.0
```
</div></details>

<details><summary>v1.0/kustomization.yaml</summary><div>

```
bases:
  - ./../base/
```
</div></details>

v1.0/pod.yamlではimageタグが増えているがportはなくなっている
これはbaseで定義しているから改めて定義する必要がない
service.yamlにいたってはファイルすら作ってない
kustomization.yamlは想像がつくだろうがbaseディレクトリのファイルを読んでいる
kustomizeコマンドを使用してみよう


```console
$ kustomize build nginx/v1.0

apiVersion: v1
kind: Pod
metadata:
  name: nginx
spec:
  containers:
  - image: nginx:1.0
    name: nginx
    ports:
    - containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
  name: nginx
spec:
  ports:
  - port: 80
    targetPort: 80
  selector:
    app: nginx
  type: LoadBalancer
```
こんな感じで全体のマニフェストが吐き出される
あとはお好みに合わせて

```console
$ kustomize build nginx/v1.0 | kubectl apply -f -
```
とやればよしなにやってくれる

kustomizeはベースに書いたリソースを使ってそれぞれのバージョンにあった変更を宣言的に加えることに魅力があると考える.
ただどうしてもyamlの構造に縛られるためyaml書きたくない人にはKapitanというツールをおすすめする.
あとは,パッチを当てるということをkustomizeでは行っているため
あとで別のKindを追加したりだとか必ず宣言しなければならないものだとかがある.
ローカルで動いて宣言的に変更を加えたいときにkustomizeは力を発揮するだろう(間違ってたら指摘をお願いしたいです))


## インストールはどうする？
```console
$ brew install kustomize
```
ちなみにgo get kustomizeもできるがgoのversionが1.10.1以上が必要のようだ

## 次回
[Kustomizeの基本的な使い方](https://qiita.com/aeleniumfor/items/2b01a85ba36ef8a8602d)
## 参考文献
https://github.com/kubernetes-sigs/kustomize


## 最後に
ありがとうございました