无法使用 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 的完整可运行演示。
我在模板基础文件中将 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 的完整可运行演示。