kustomizeメモ

## kustomize?

k8sYAMLをカスタマイズすることができるkustomizeというツール。

github.com

### Install

インストールはここに書いてある通りにやるだけ。シンプル。

https://github.com/kubernetes-sigs/kustomize/blob/master/docs/INSTALL.md

### Documents

ドキュメントは、メインのREADME.mdとあとこの2つくらい読んだら良さそう。

https://github.com/kubernetes-sigs/kustomize/blob/master/docs/kustomization.yaml

https://github.com/kubernetes-sigs/kustomize/blob/master/docs/glossary.md

## 何ができるの?

kustomization.yamlというファイルに設定を書いてkustomize buildを実行したらYAMLを出力してくれる。

## リソースをひとまとめにする

こんな風にファイルを用意して

❯ tree
.
└── hello
    ├── deployment.yaml
    ├── kustomization.yaml
    └── service.yaml

1 directory, 3 files

hello/kustomize.yamlはこう。

resources:
- deployment.yaml
- service.yaml

hello/deployment.yamlもシンプルにこうで

apiVersion: apps/v1
kind: Deployment
metadata:
  name: the-deployment
spec:
  selector:
    matchLabels:
      deployment: hello
  replicas: 1
  template:
    metadata:
      labels:
        deployment: hello
    spec:
      containers:
      - name: the-container
        image: nginx:1.15.5
        ports:
        - containerPort: 80

hello/service.yamlもこんな感じ

kind: Service
apiVersion: v1
metadata:
  name: the-service
spec:
  selector:
    deployment: hello
  type: LoadBalancer
  ports:
  - port: 80

でkustomizeを実行すると結果はこうなる。単純にマージされてるだけだね。

❯ kustomize build hello
apiVersion: v1
kind: Service
metadata:
  name: the-service
spec:
  ports:
  - port: 80
  selector:
    deployment: hello
  type: LoadBalancer
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: the-deployment
spec:
  replicas: 1
  selector:
    matchLabels:
      deployment: hello
  template:
    metadata:
      labels:
        deployment: hello
    spec:
      containers:
      - image: nginx:1.15.5
        name: the-container
        ports:
        - containerPort: 80

使うときはkubectl applyに渡してあげればいい。

❯ kustomize build hello | kubectl apply -f -
service/the-service created
deployment.apps/the-deployment created

Minikubeだとこんな感じで叩くとnginxのページが返される。

❯ curl $(minikube service the-service --url)

まぁ、単純にマージするだけだと、そんなに嬉しくないけど、ビルドするときにごにょっとできるみたい。例えばラベル。

## 全てのラベルとセレクターにラベルを挿入する

kustomization.yamlcommonLabelsを書き加えてbuildを実行すると

commonLabels:
  someName: someValue
  owner: alice
  app: bingo

resources:
- deployment.yaml
- service.yaml

結果はこうなった。全部のlabelsselectorに追加されるのか。ほほー。

apiVersion: v1
kind: Service
metadata:
  labels:
    app: bingo
    owner: alice
    someName: someValue
  name: the-service
spec:
  ports:
  - port: 80
  selector:
    app: bingo
    deployment: hello
    owner: alice
    someName: someValue
  type: LoadBalancer
---
apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: bingo
    owner: alice
    someName: someValue
  name: the-deployment
spec:
  replicas: 1
  selector:
    matchLabels:
      app: bingo
      deployment: hello
      owner: alice
      someName: someValue
  template:
    metadata:
      labels:
        app: bingo
        deployment: hello
        owner: alice
        someName: someValue
    spec:
      containers:
      - image: nginx:1.15.5
        name: the-container
        ports:
        - containerPort: 80

ってことは、元々のやつからラベルとセレクターを取り除いて、こういう風にしても大丈夫ってことか

kustomization.yaml

commonLabels:
  someName: someValue

resources:
- deployment.yaml
- service.yaml

deployment.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: the-deployment
spec:
  replicas: 1
  template:
    spec:
      containers:
      - name: the-container
        image: nginx:1.15.5
        ports:
        - containerPort: 80

service.yaml

kind: Service
apiVersion: v1
metadata:
  name: the-service
spec:
  type: LoadBalancer
  ports:
  - port: 80

こうなった。minikubeに適用したらちゃんと動いた。

❯ kustomize build hello
apiVersion: v1
kind: Service
metadata:
  labels:
    someName: someValue
  name: the-service
spec:
  ports:
  - port: 80
  selector:
    someName: someValue
  type: LoadBalancer
---
apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    someName: someValue
  name: the-deployment
spec:
  replicas: 1
  selector:
    matchLabels:
      someName: someValue
  template:
    metadata:
      labels:
        someName: someValue
    spec:
      containers:
      - image: nginx:1.15.5
        name: the-container
        ports:
        - containerPort: 80

ふむふむ。他にもネームスペースとか、名前のプレフィックスとか、アノテーションもそれぞれ共通で追加できるし、ConfigMapを生成したりもできるみたい。あと、Overlayって機能で元のファイルを一部書き換えたものを生成できるみたいだし、変数を定義できたりもするみたいだから、ちょこちょこ読んで触ってみてみようかな。