我在模板基础文件中将emptyDir
下的sizeLimit
属性设置为2Gi。我想去掉sizelimit
,只剩下emptyDir: {}
。我一直无法实现这一点,使用定制叠加。我将在下面详细介绍我的文件夹结构和定制文件。
文件夹结构:
application
├── majorbase
│ ├── kustomization.yaml
│ └── resources
│ └── web-template.yaml
├── minorbase
│ ├── kustomization.yaml
│ └── resources
└── myoverlays
├── kustomization.yaml
└── resources
└── my-new-web.yaml
文件夹myoverlays
在其定制中包含以下内容。yaml文件
bases:
- ../minorbase
patchesStrategicMerge:
- resources/my-new-web.yaml
文件夹minorbase
在其定制中包含以下内容。yaml文件
bases:
- ../majorbase
文件夹majorbase
在其定制中包含以下内容。yaml文件
resources:
- resources/web-template.yaml
我要编辑的部分在majorbase/template中看起来像这样。
volumes:
- name: test-vol
emptyDir:
sizeLimit: "2Gi"
上述配置需要使用下面的覆盖来更新。
volumes:
- name: test-vol
emptyDir: {}
这就是我的问题所在。每当我在覆盖层中删除sizelimit
时,定制只是选择基础中提到的2Gi值。当我提到sizeLimit
的不同值时,例如"1Gi"在我的overlays文件中,自定义处理更改。这种行为的原因是什么?有可能实现我在这里想要做的吗?
注意:这个答案假设是最新版本的Kustomize(我在本地运行4.5.2)。您的示例使用了已弃用的语法(例如,bases
节在2.1.0版本中已弃用)。
你的问题是你正在使用strategicMerge
补丁,你正在合并和空地图({}
)与{"sizeLimit": "26gi"}
。如果你将一个空映射与任何东西合并,它是无操作的:你最终会得到"anything"
要显式删除一个元素,您有几个选择。
您可以使用$patch: replace
指令(您可以在这里找到一个示例)来让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
您可以在这里找到完整的可运行演示。