HelmからKustomizeに乗り換える!軽量で、シンプルで、使いやすい!
kustomizeを使ってみる
kustomizeとは
YAMLファイルを再利用可能で設定変更のしやすい宣言的管理をします。
インストール方法
以下のようにインストールできます。
brew install kustomize
kustomizationファイルとresourceファイル
前提としてデプロイに必要なものが全て入ったものをtargetといいます。
また、一つのまとまりとしてApplcacitonを呼びます。
KustomizeではApplicationをtargetとしてOverlayしてVariantとしてApplicationを作成できます。
まずはkustomizationファイルであるkustomization.yamlを作成します。
ここで一つ説明を入れるとkustomizeではkustomization.yamlとリソースが基本のセットです。
また、同じディレクトリにdeployment.yaml、service.yaml、ingress.yamlも作成します。これらはKubernetesAPIのオブジェクトでありリソースファイルと呼ばれます。
なので以下のようなディレクトリ構造ができあがるはずです。
~/someApp ├── deployment.yaml ├── ingress.yaml ├── kustomization.yaml └── service.yaml
以下の様にしてビルドすることができます。
kustomize build ~/someApp
直接デプロイすることもできます。
kustomize build ~/someApp | kubectl apply -f -
Helmとの対応関係を書くと以下の通りでしょう。
| helm | kustomize |
|---|---|
| chart | target |
value.yaml |
kustomization.yaml |
templates/ |
resourceファイル |
Helmが現在は主流なので一回試すといいかもしれません。
ここでkustomization.yamlには以下の項目を追加しておきます。
# List of resources to manage by kustomize resources: - deployment.yaml - configMap.yaml - service.yaml - ingress.yaml
またkustomization.yamlに書けるいくつかAPIが用意されています。
| object | 説明 |
|---|---|
namespace |
すべてのresouces[]に`namespaceを適用する |
namePrefix |
すべてのresouces[].nameにPrefixを追加する。 |
commonLabels |
すべてのresouces[]にlabelを付与する |
commonAnnotations |
すべてのresouces[]にannotationを付与する |
resources |
このbase(target)に含まれるresouces一覧 |
configMapGenerator |
マニフェストファイルなしでConfigMapを作る |
secretGenerator |
マニフェストファイルなしでSecretを作る |
bases |
Overlayするbase(target)を指定 |
patches |
Overlayをするpatchファイルを指定 |
patchesJson6902 |
Overlayをするpatchファイルをjsonで渡す |
crds |
CustomResourceDefinitionを作成。 |
vars |
env`として渡せる。DownwardAPIも同様に使える |
imageTags |
patchを作成せずにimageTagを編集する |
例えばresourcesにつけられる共通したlabelやannotationを記述できたりします。
commonLabels: variant: staging org: acmeCorporation commonAnnotations: note: Hello, I am staging!
Helmのvalue.yamlのような印象を受けました。
OverlayとVariant
一つのBase(kustomization.yaml + resouce(s) fileを元に、Overlay(=設定を覆いかぶせる)でVariant(=baseの変形系)を出力することができます。
簡単にすると
元のAppのリソースファイルにOverlayという書き換えをする奴を提要して進化系Variantと言うものを作れる
といったような感じの機能です。
また、以下の様なディレクトリ構成になっていて、慣習的にbaseとoverlaysでディレクトリを分けて、overlaysの中にさらにVariantの種類で分けるみたいです。
~/someApp
├── base
│ ├── deployment.yaml
│ ├── kustomization.yaml
│ └── service.yaml
└── overlays
├── development
│ ├── cpu_count.yaml
│ ├── kustomization.yaml
│ └── replica_count.yaml
└── production
├── cpu_count.yaml
├── kustomization.yaml
└── replica_count.yaml
ここでOverlaykustomization.yamlには元となるファイルを
bases[]
で配列を指定します。私の場合は以下のようになります。
bases: - ../../base
そしてパッチを当てるときに、どのようにパッチを当てるかを定義したファイルを以下のように渡します。
patches[]
私の場合は以下のようになります。
patches: - deployment.yaml
ここではproductionのVariantを生成します。
kustomize build ~/someApp/overlays/production
すると出力されるので以下のようにして保持してください。
kustomize build ~/someApp/overlays/production > production.yaml
たとえばVariantには
- staging
- production
- dev
などいくつも作られることが想定できます。
Overlayでは特定のtargetを上書きするtargetです。
BaseとなるものをAppとして成立し、Variantも同様に成立しデプロイできます。
そのような感覚が大事だと思います。
まるっきり削除したいフィールドがあるとき
例えばreplicasを削除したかったら$patch: deleteを使って
spec: replicas: 2 $patch: delete
のようになる。注意点としては
- replica:2と完全に一致していないと削除されない
- 同じレベルのフィールドも削除される
また置き換える、かつ、そのレベルのフィールドをまるっきり消したいときは$patch: replaceとするといいでしょう。
例えば以下のようなフィールドがあるとします。
spec:
containers:
- name: base
image: osixia/openbase:1.1.11
args: ["--copy-service"]
volumeMounts:
- name: base-data
mountPath: /var/lib/base
- name: base-config
mountPath: /etc/base/slapd.d
- name: base-certs
mountPath: /container/service/slapd/assets/certs
- name: configmap-volume
mountPath: /container/environment/01-custom
- name: container-run
mountPath: /container/run
このbaseを変更しつつ、volumeMountsを消したいとします。
spec:
containers:
- name: after
$patch: delete
のようにすると
spec:
containers:
- args:
- --copy-service
image: osixia/openbase:1.1.11
name: base
ports:
- containerPort: 389
name: openbase
volumeMounts:
- mountPath: /var/lib/base
name: base-data
- mountPath: /etc/base/slapd.d
name: base-config
- mountPath: /container/service/slapd/assets/certs
name: base-certs
- mountPath: /container/environment/01-custom
name: configmap-volume
- mountPath: /container/run
name: container-run
のようになってしまい、何も変更できません。
containers:
- name: after
$patch: replace
のようにすると
spec:
containers:
- name: after
のようにしてくれます。
所感
Helmよりも軽量であるイメージで、これが標準のCLIとして組み込まれるために開発中とのことで、非常に先が明るく、マスターしておくことは重要だと思いました。
ディレクトリもk8s/以下にbaseとoverlayをつけていると使いやすいかもしれない。

