🤖
kustomize edit set image で images フィールドの順序が変わってしまう問題に対処する
使用した 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