🎉

Kustomize の便利な機能

2023/12/15に公開

皆さんは Kubernetes manifests のパッケージ化やテンプレート化に何を使っていますか?
Helm、Kustomize、CUE などあると思いますが、私は普段 Kustomize を使っています。
ここ最近 Kustomize の改善を行ったりした際に少し調べたので、便利そうだった機能や普段から利用している機能を紹介しようと思います。

resources

自分たちで作成し、管理している manifest は以下のように kustomization.yaml を書くことが多いと思います。

apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization

resources:
  - deployment.yaml
  - secrets.yaml
  - service-account.yaml

OSS などのリモートレポジトリの manifest をダウンロードせず、resources に kustomization.yaml が置かれているディレクトリや GitHub リリースの manifest を指定することで簡単にリモートレポジトリの manifest を利用することができます。

kustomization.yaml が置かれているディレクトリ を指定する例です。
ref=には、Tag を指定します。

apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization

resources:
  - https://github.com/kubernetes/kube-state-metrics?ref=v2.6.0

GitHub リリースの manifest を指定する例です。
v0.6.2のところには、リリースのバージョンを指定します。

apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization

resources:
  - https://github.com/kubernetes-sigs/metrics-server/releases/download/v0.6.2/components.yaml

わざわざローカルレポジトリに manifest を持ってこなくても良かったり、バージョンアップはバージョンを変更するだけなので変更自体はとても容易です。
kustomization.yaml がリモートレポジトリに置かれている場合は前者、Helm Chart から生成された manifest が GitHub リリースに置かれている場合は後者 となる場合が多かった印象です。

ImageTagTransformer

イメージ名やタグ、ダイジェストを変更します。
リモートレポジトリの manifest を利用していたり、ある特定の image のみ変更したい場合に便利です。
patches でも同じことができますが、image だけの変更であれば ImageTagTransformer のほうがコード量が少なくて済みます。

少し前になりますが、Kubernetes が使用するレジストリが k8s.gcr.io から registry.k8s.io に変更となりました。
リモートレポジトリの manifest には、k8s.gcr.io が使われているけど registry.k8s.io にもイメージがプッシュされている場合を想定します。

image(name) と変更後の image(NewName) を images に定義することで k8s.gcr.io/metrics-server/metrics-serverregistry.k8s.io/metrics-server/metrics-server に置き換え可能です。

apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization

resources:
  - https://github.com/kubernetes-sigs/metrics-server/releases/download/v0.6.2/components.yaml
images:
  - name: k8s.gcr.io/metrics-server/metrics-server
    NewName: registry.k8s.io/metrics-server/metrics-server

また、以下のように定義することでpostgresmy-registry/my-postgres:v1に変更することができます。

images:
- name: postgres
  newName: my-registry/my-postgres
  newTag: v1

LabelTransformer

commonLabels に定義した label と selector が全リソースに追加されます。すでに同じ key で定義されている場合、上書きされます。
commonLbales を変更し、Deployments やServices などのリソースの selector は、リソースがクラスタに適用された後は変更することができないため、設計時に注意が必要です。

apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization

commonLabels:
  Name: serivce-a
  owner: EigoOda

selector を追加する必要がない場合は、labels を使うことで label のみを追加することができます。
commonLabels と同様、リソースがクラスタに適用された後は変更することができません。

PrefixSuffixTransformer

全リソースに prefix や suffix を追加することができます。
以下のようにすることで resources の全リソースの名前に zozo- prefix が付与されます。

apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization

namePrefix: zozo-

resources:
- deployment.yaml
- secrets.yaml

replacement

特定のスキーマを置換することができます。
以下の例では、Deployment リソースの metadata.name を my-resource に置換します。

apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization

replacements:
- source:
    kind: Deployment
    fieldPath: metadata.name
  targets:
  - select:
      name: my-resource

以上、Kustomize の便利な機能でした!

GitHubで編集を提案

Discussion