皆さんはKustomizeのimages transformerは使っていますか?kustomization.yamlに書く、こういうやつです:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization

resources:
  - deployment.yaml

images:
  - name: old-image
    newName: new-image
    newTag: v1.0.0

kustomization.yamlにこのimages:というブロックを書くと、deployment.yamlでimage: old-imageと書かれている部分がimage: new-image:v1.0.0に置き換えられます。これがimages transformerと呼ばれるもので、kustomizeのドキュメントではImageTagTransformer のところとか、exampleのimages transformer のところとかに説明が書いてあります。

扨、Kubernetesの大きな強みの一つとして、CustomResourceDefinitionを使用して独自のリソースを作成することができる、というものがあります。世の中にはいろいろなOSS CRDがありますが、今回話題にしたいのはDeploymentなどのようにコンテナイメージを指定するタイプのCustomResourceです。例えば、Argo WorkflowsのWorkflowリソースでは次の様にイメージを指定します:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
apiVersion: argoproj.io/v1alpha1
kind: Workflow
metadata:
  name: batchjob
spec:
  entrypoint: main
  templates:
    - name: main
      container:
        image: old-image

しかしこの場合、kustomization.yamlでイメージを指定しても、old-imageを置き換えてくれません。

が、置き換えて欲しいですよね?

それ、images transformer configurationを書くことで実現できます。

上書きしたいリソースのkindと、イメージを指定するpathを書いた設定ファイルを用意するだけです。この例の場合、kindはWorkflowで、pathはspec/templates/container/imageです。リストのインデックスとかは書く必要は無いです。設定ファイルは次の様になります:

1
2
3
images:
  - path: spec/templates/container/image
    kind: Workflow

これを例えば、images_transformer_configuration.yamlに保存したとすると、kustomization.yamlには次の様な記述を追加します:

1
2
configurations:
  - images_transformer_configuration.yaml

あとはDeploymentの時と同様にimages:ブロックを記述するだけです。

今回の例の全体としては次の様になります:

kustomization.yaml:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
resources:
  - workflow.yaml

configurations:
  - images_transformer_configuration.yaml

images:
  - name: old-image
    newName: new-image
    newTag: v1.0.0

workflow.yaml:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
apiVersion: argoproj.io/v1alpha1
kind: Workflow
metadata:
  name: batchjob
spec:
  entrypoint: main
  templates:
    - name: main
      container:
        image: old-image

images_transformer_configuration.yaml:

1
2
3
images:
  - path: spec/templates/container/image
    kind: Workflow

これらを一つのディレクトリに置き、kustomize buildすると次の出力が得られます:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
apiVersion: argoproj.io/v1alpha1
kind: Workflow
metadata:
  name: batchjob
spec:
  entrypoint: main
  templates:
  - container:
      image: new-image:v1.0.0
    name: main

以上です。なお、以上のことはkubernetes-sigs/kustomize/examples/transformerconfigs/images に書いてあります。