サブタイトル
kustomizeを使っていい感じにいい感じする
最初に
この記事は継続的デリバリの予定です
Kustomizeとは?
k8sのyamlをそのままに複数の目的で使うことができるように宣言的パッチを当てることができる
例えば
「あ~次のサービスはnginxのイメージ1から1.14にかえたいわ~」って時に役に立ちそう
- できること
- パッチを当てるような書換が可能
- imageだけやコマンドを書き換えるということは可能
- できないこと(苦手なこと)
- 変数やテンプレートといったものを使うことができないためベースとなるyamlの構造に従う(意識する)必要がある(こいったことをしたいならhelmとかおすすめかも?)
- KindやApiVersionなどは省略して書くことができない
- PodやServiceのKindに対してパッチとしてKindを追加することができない
どんなところで有効?
同じようなマニフェストがあるところで有効
ベースとなるマニフェストを崩さずコマンドを変えたり, コマンドを変更させたりすることができる
特にイメージのバージョンやコマンドだけが違う環境で効果を発揮する
例えばディレクトリ構成が↓のようなとき
|-- v1.0
| |-- pod.yaml
| `-- service.yaml
`-- v1.14
|-- pod.yaml
`-- service.yaml
このときのそれぞれのyamlは以下のようになっている
v1.0/pod.yaml
apiVersion: v1
kind: Pod
metadata:
name: nginx
spec:
containers:
- name: nginx
image: nginx:1.0
ports:
- containerPort: 80
v1.0/service.yaml
apiVersion: v1
kind: Service
metadata:
name: nginx
spec:
ports:
- port: 80
targetPort: 80
selector:
app: nginx
type: LoadBalancer
v1.14/pod.yaml
apiVersion: v1
kind: Pod
metadata:
name: nginx
spec:
containers:
- name: nginx
image: nginx:1.14
ports:
- containerPort: 80
v1.14/service.yaml
apiVersion: v1
kind: Service
metadata:
name: nginx
spec:
ports:
- port: 80
targetPort: 80
selector:
app: nginx
type: LoadBalancer
↓のようなディレクトリ構成をとる
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の共通部分をまとめたものだ
base/pod.yaml
apiVersion: v1
kind: Pod
metadata:
name: nginx
spec:
containers:
- name: nginx
ports:
- containerPort: 80
base/service.yaml
apiVersion: v1
kind: Service
metadata:
name: nginx
spec:
ports:
- port: 80
targetPort: 80
selector:
app: nginx
type: LoadBalancer
base/kustomization.yaml
resources:
- pod.yaml
- service.yaml
base/kustomization.yamlは資源を活用するために書いているもの
ところでそれぞれのバージョンはどうなったのだろうか?
v1.0/pod.yaml
apiVersion: v1
kind: Pod
metadata:
name: nginx
spec:
containers:
- name: nginx
image: nginx:1.0
v1.0/kustomization.yaml
bases:
- ./../base/
v1.0/pod.yamlではimageタグが増えているがportはなくなっている
これはbaseで定義しているから改めて定義する必要がない
service.yamlにいたってはファイルすら作ってない
kustomization.yamlは想像がつくだろうがbaseディレクトリのファイルを読んでいる
kustomizeコマンドを使用してみよう
$ 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
こんな感じで全体のマニフェストが吐き出される
あとはお好みに合わせて
$ kustomize build nginx/v1.0 | kubectl apply -f -
とやればよしなにやってくれる
kustomizeはベースに書いたリソースを使ってそれぞれのバージョンにあった変更を宣言的に加えることに魅力があると考える.
ただどうしてもyamlの構造に縛られるためyaml書きたくない人にはKapitanというツールをおすすめする.
あとは,パッチを当てるということをkustomizeでは行っているため
あとで別のKindを追加したりだとか必ず宣言しなければならないものだとかがある.
ローカルで動いて宣言的に変更を加えたいときにkustomizeは力を発揮するだろう(間違ってたら指摘をお願いしたいです))
インストールはどうする?
$ brew install kustomize
ちなみにgo get kustomizeもできるがgoのversionが1.10.1以上が必要のようだ
次回
参考文献
最後に
ありがとうございました