🤖

kustomize edit set image で images フィールドの順序が変わってしまう問題に対処する

2021/02/19に公開

使用した kustomize のバージョンは v4.0.1 です。

$ kustomize version
{Version:kustomize/v4.0.1 GitCommit:516ff1fa56040adc0173ff6ece66350eb4ed78a9 BuildDate:2021-02-13T21:21:14Z GoOs:darwin GoArch:amd64}

問題の解説

kustomization.yaml の images 機能を使うとマニフェストの image タグを上書きできる。

やんごとなき理由から同じ image を複数回この機能で上書きしようとすると、 images フィールド内の順序が結果に影響する。

例えば kustomization.yaml を

images:
  - name: before
    newName: after
  - name: after
    newName: after
    newTag: v1

としておくと、image: before を使用しているマニフェストは image: after:v1 に書き換わる。しかし一方で、

images:
  - name: after
    newName: after
    newTag: v1
  - name: before
    newName: after

とすると、image: before を使用しているマニフェストは image: after に書き換わる。

要するに images に記載した上書きは上から順番に適用される。
まあぎりぎりメンテできるかな…という雰囲気だが、実は $ kustomize edit set image を実行すると、この順序が変わってしまう可能性がある。

例えば一番最初に紹介した

images:
  - name: before
    newName: after
  - name: after
    newName: after
    newTag: v1

に対して $ kustomize edit set image after=after:v2 を実行すると、以下のようになる。

images:
- name: after
  newName: after
  newTag: v2
- name: before
  newName: after

これは意図しないマニフェスト生成につながってしまう。

ワークアラウンド

ワークアラウンドとしては、kustomization.yaml を分割して、先に適用したいものを上流となるように関連付ければいい。

具体例を示す。

$ tree
.
├── kustomization.yaml
└── workaround
    └── kustomization.yaml

./workaround/kustomization.yaml

resources:
- ../../../somewhere
images:
- name: before
  newName: after

./kustomization.yaml

resources:
- ./workaround
images:
- name: after
  newName: after
  newTag: v1

このようにしておけば、kustomize edit set imageを実行しても images の順序が変わったりしないので、問題を回避できる。

Discussion