Kekeの日記

エンジニア、読書なんでも

HelmからKustomizeに乗り換える!軽量で、シンプルで、使いやすい!

kustomizeを使ってみる

kustomizeとは

YAMLファイルを再利用可能で設定変更のしやすい宣言的管理をします。

インストール方法

以下のようにインストールできます。

brew install kustomize

kustomizationファイルとresourceファイル

前提としてデプロイに必要なものが全て入ったものをtargetといいます。 また、一つのまとまりとしてApplcacitonを呼びます。

KustomizeではApplicationをtargetとしてOverlayしてVariantとしてApplicationを作成できます。

まずはkustomizationファイルであるkustomization.yamlを作成します。

ここで一つ説明を入れるとkustomizeではkustomization.yamlリソースが基本のセットです。

https://github.com/kubernetes-sigs/kustomize/raw/v1.0.3/docs/base.jpg

また、同じディレクトリにdeployment.yamlservice.yamlingress.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が現在は主流なので一回試すといいかもしれません。

helm.sh

ここで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につけられる共通したlabelannotationを記述できたりします。

commonLabels:
  variant: staging
  org: acmeCorporation
commonAnnotations:
  note: Hello, I am staging!

Helmのvalue.yamlのような印象を受けました。

OverlayとVariant

https://github.com/kubernetes-sigs/kustomize/raw/master/docs/overlay.jpg

一つのBase(kustomization.yaml + resouce(s) fileを元に、Overlay(=設定を覆いかぶせる)でVariant(=baseの変形系)を出力することができます。

簡単にすると

元のAppのリソースファイルにOverlayという書き換えをする奴を提要して進化系Variantと言うものを作れる

といったような感じの機能です。

また、以下の様なディレクトリ構成になっていて、慣習的にbaseoverlaysでディレクトリを分けて、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/以下にbaseoverlayをつけていると使いやすいかもしれない。