hisamounaのブログ

アウトプットを習慣化するためのブログ

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.

github.com

OpenAPI schemaを独自定義することで解決

github.com

Kustomizeの v4.1.0 からOpenAPI schemaファイルを利用できるようになったみたいです。

github.com

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もサポートされるようになったみたいです。

github.com