Kustomize でマニフェストのフィールドを削除する

対象のフィールドの値を null としてパッチすることでフィールドそのものを削除できます。

kustomize version
{Version:3.5.4 GitCommit:3af514fa9f85430f0c1557c4a0291e62112ab026 BuildDate:2020-01-17T14:23:25+00:00 GoOs:darwin GoArch:amd64}

例えば次のような Pod マニフェストがあるとします。

apiVersion: v1
kind: Pod
metadata:
  name: dapi-test-pod
spec:
  containers:
  - name: test-container
    image: k8s.gcr.io/busybox
    command: [ "/bin/sh", "-c", "env" ]
    env:
    - name: LOG_LEVEL
      valueFrom:
        configMapKeyRef:
          name: env-config
          key: log_level
  restartPolicy: Never

このマニフェストの環境変数 LOG_LEVEL は ConfigMap から値を取得するように設定されていますが、これを直接 INFO に設定したい。つまり次のように env.value フィールドを値を INFO として新たに追加し、既存の env.valueFrom フィールドを削除したいとします。

--- a/pod.yaml
+++ b/pod.yaml
@@ -9,8 +9,5 @@ spec:
     command: [ "/bin/sh", "-c", "env" ]
     env:
     - name: LOG_LEVEL
-      valueFrom:
-        configMapKeyRef:
-          name: env-config
-          key: log_level
+      value: INFO
   restartPolicy: Never

ここで次のような $patch :delete を使用して env.valueFrom フィールドを削除しようとしますが、

apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
resources:
- pod.yaml
patchesStrategicMerge:
- |-
  apiVersion: apps/v1
  kind: Pod
  metadata:
    name: dapi-test-pod
  spec:
    containers:
    - name: test-container
      env:
      - name: LOG_LEVEL
        value: INFO
        valueFrom:
          $patch: delete

値は消えてもフィールド自体は残ってしまい、これをそのまま適用しようとしてもバリデーションエラーになります。

apiVersion: v1
kind: Pod
metadata:
  name: dapi-test-pod
spec:
  containers:
  - command:
    - /bin/sh
    - -c
    - env
    env:
    - name: LOG_LEVEL
      value: INFO
      valueFrom: {}  # <-------- Here
    image: k8s.gcr.io/busybox
    name: test-container
  restartPolicy: Never

ここでは削除したい対象のフィールドの値を null でパッチすることで、

apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
resources:
- pod.yaml
patchesStrategicMerge:
- |-
  apiVersion: v1
  kind: Pod
  metadata:
    name: dapi-test-pod
  spec:
    containers:
    - name: test-container
      env:
      - name: LOG_LEVEL
        value: INFO
        valueFrom: null

フィールドそのものも削除できます。

apiVersion: v1
kind: Pod
metadata:
  name: dapi-test-pod
spec:
  containers:
  - command:
    - /bin/sh
    - -c
    - env
    env:
    - name: LOG_LEVEL
      value: INFO
    image: k8s.gcr.io/busybox
    name: test-container
  restartPolicy: Never