无法使用 kustomize 删除 "Sizelimit" 属性

Unable to remove a "Sizelimit" property using kustomize

我在模板基础文件中将 emptyDir 下的 sizeLimit 属性 设置为 2Gi。我想删除 sizelimit 而只有 emptyDir: {}。我一直无法使用 Kustomization 覆盖来实现此目的。我将在下面详细说明我的文件夹结构和 kustomization yamls。

文件夹结构:

application
├── majorbase
│   ├── kustomization.yaml
│   └── resources
│       └── web-template.yaml
├── minorbase
│   ├── kustomization.yaml
│   └── resources
└── myoverlays
    ├── kustomization.yaml
    └── resources
        └── my-new-web.yaml

文件夹 myoverlays 的 kustomization.yaml 文件中包含以下内容

bases:
- ../minorbase
patchesStrategicMerge:
- resources/my-new-web.yaml

文件夹 minorbase 的 kustomization.yaml 文件中包含以下内容

bases:
- ../majorbase

文件夹 majorbase 的 kustomization.yaml 文件中包含以下内容

resources:
- resources/web-template.yaml

我要编辑的部分在 majorbase/template 中看起来像这样。

volumes:
      - name: test-vol
        emptyDir:
          sizeLimit: "2Gi"

以上配置需要使用覆盖更新,如下所示。

volumes:
      - name: test-vol
        emptyDir: {}

这就是我的问题所在。每当我删除叠加层中的 sizelimit 时,Kustomization 只会选择基础中提到的 2Gi 值。当我在覆盖文件中提到 sizeLimit 的不同值(例如“1Gi”)时,kustomization 正在接受更改。这种行为的原因是什么?是否有可能实现我在这里尝试做的事情?

注意:此答案假定使用最新版本的 Kustomize(我在本地是 运行 4.5.2)。您的示例使用了已弃用的语法(例如 bases 部分已弃用 in version 2.1.0)。


您的问题是您使用的是 strategicMerge 补丁,并且您正在合并空地图 ({}) 与 {"sizeLimit": "26gi"}。如果您将空地图与任何东西合并,它就是 no-op:您最终会得到“任何东西”。

要明确删除元素,您有几种选择。

您可以使用 $patch: replace 指令(您可以找到 here 的示例)让 Kustomize 替换 emptyDir 元素, 而不是合并内容。看起来像:

apiVersion: v1
kind: Pod
metadata:
  name: example
spec:
  volumes:
    - name: test-vol
      emptyDir:
        $patch: replace

对应的 kustomization.yaml 可能类似于:

apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
resources:
  - ../../base

patches:
  - path: resources/my-new-web.yaml

或者,您可以使用 JSONPatch 补丁,这对于显式删除字段很有用:

- path: /spec/volumes/0/emptyDir/sizeLimit
  op: remove

其中 kustomization.yaml 看起来像:

apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
resources:
  - ....//base

patches:
  - target:
      kind: Pod
      name: example
    path: resources/my-new-web.yaml

您可以找到此 here 的完整可运行演示。