Rolloutsリソースに対してPatchを当てる
困ったこと
Rolloutリソースのspec.containersのfieldsに対してpatchを当てたところ完全に書き換えられてしまった。
期待の出力
nginxイメージのtagが1.21 -> 1.18に書き換わってほしい。それ以外はそのままに。
$ kustomize build example/ apiVersion: argoproj.io/v1alpha1 kind: Rollout metadata: name: rollout-test spec: selector: matchLabels: name: test template: metadata: labels: name: rollout-test spec: containers: - image: nginx:1.18 name: nginx ports: - containerPort: 80 resources: limits: cpu: 300m memory: 300M - image: golang:1.17 name: golang
実際の出力
spec.containers全体がrollout-patch.yamlの内容に書き換わってしまった、、、
apiVersion: argoproj.io/v1alpha1 kind: Rollout metadata: name: rollout-test spec: selector: matchLabels: name: test template: metadata: labels: name: rollout-test spec: containers: - image: nginx:1.18 name: nginx
CustomResourcesのstrategic mergeはサポートされていないよう
The issue is that kustomize does not support strategic merge patching of custom resources, so the patch you have defined, is actually replacing the entire list of containers.
OpenAPI schemaを独自定義することで解決
Kustomizeの v4.1.0
からOpenAPI schemaファイルを利用できるようになったみたいです。
RolloutのOpenAPI schemaファイルを作成
rollout-crd.yamlからopenapi schemaのjsonを作成するスクリプトを書きました。
実行
$ go run main.go
$ ls scheka.json
schema.json
patchを当てられるように、jsonを編集。
今回のケースではspec.containersのfieldsに対してpatchを当てたいので、spec.containersにx-kubernetes-patch-merge-keyとx-kubernetes-patch-strategyをセット
"containers": { "items": { . . . }, "type": "array", "x-kubernetes-patch-merge-key": "name", "x-kubernetes-patch-strategy": "merge", },
jsonをkustomization.yamlがあるパスに配置し、kustomization.yamlを修正
$ mv schema.json example/
# kustomization.yaml . . . openapi: path: schema.json
patchが当てられるように!
$ kustomiza build example/ apiVersion: argoproj.io/v1alpha1 kind: Rollout metadata: name: rollout-test spec: selector: matchLabels: name: test template: metadata: labels: name: rollout-test spec: containers: - image: nginx:1.18 name: nginx ports: - containerPort: 80 resources: limits: cpu: 300m memory: 300M - image: golang:1.17 name: golang
補足
openapi schemaファイルはyamlもサポートされるようになったみたいです。