LoginSignup
3
1

More than 3 years have passed since last update.

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

Last updated at Posted at 2018-09-07

サブタイトル

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


見てもわかるように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の共通部分をまとめたものだ

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以上が必要のようだ

次回

Kustomizeの基本的な使い方

参考文献

最後に

ありがとうございました

3
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
1