## kustomize?
k8sのYAMLをカスタマイズすることができるkustomizeというツール。
### 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.yaml
にcommonLabels
を書き加えてbuildを実行すると
commonLabels: someName: someValue owner: alice app: bingo resources: - deployment.yaml - service.yaml
結果はこうなった。全部のlabels
とselector
に追加されるのか。ほほー。
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って機能で元のファイルを一部書き換えたものを生成できるみたいだし、変数を定義できたりもするみたいだから、ちょこちょこ読んで触ってみてみようかな。