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
をつけていると使いやすいかもしれない。