我有一个基本的yaml和一个覆盖的yaml,使用"kustomize“我想合并这两个yaml。我的情况是,在运行kustomize build时,会出现一个输出,但这不是预期的,原因是什么?因为kustomize不是填充来自覆盖yaml的自定义信息,而是用我的示例中的覆盖"containers“替换整个基标题标记。我需要的预期行为是,它应该以某种方式使用覆盖yaml而不是替换来填充缺失的信息。
基本yaml:
apiVersion: v1
kind: Pod
metadata:
name: temp
labels:
tier: temp
spec:
containers:
- name: temp
image: temp
imagePullPolicy: Always
command: temp
args:
temp
envFrom:
- configMapRef:
name: temp
volumeMounts:
volumes:覆盖yaml:
apiVersion: v1
kind: Pod
metadata:
name: temp
labels:
tier: temp
spec:
containers:
volumeMounts:
- name: temppathname
mountPath: /temppath
volumes:
- name: temppathname
hostPath:
type: temp
path: temppathkustomize build后的预期结果:
apiVersion: v1
kind: Pod
metadata:
name: temp
labels:
tier: temp
spec:
containers:
- name: temp
image: temp
imagePullPolicy: Always
command: temp
args:
["sleep 9000"]
envFrom:
- configMapRef:
name: temp
volumeMounts:
- name: temppathname
mountPath: /temppath
volumes:
- name: temppathname
hostPath:
type: temp
path: temppath我得到的是:
apiVersion: v1
kind: Pod
metadata:
labels:
tier: temp
name: temp
spec:
containers:
volumeMounts:
- name: temppathname
mountPath: /temppath
volumes:
- name: temppathname
hostPath:
type: temp
path: temppath发布于 2019-03-27 23:38:00
在您的base.yaml中,键containers的值是一个序列(节点)。在您的overlay.yaml中,键containers的值是一个映射。当然,这两个不能合并。
根本不知道kustomize,因为那些不能合并,所以覆盖用映射节点替换整个序列节点似乎是合乎逻辑的。您期望覆盖图的映射与恰好是基础序列中的一个项(在本例中是唯一项)的映射合并,这似乎完全是任意的。如果有多个项目,则需要获取哪个项目?第一个?最后一个?第五项之前的最后一个是映射?
如果你的overlay.yaml看起来像这样:
apiVersion: v1
kind: Pod
metadata:
name: temp
labels:
tier: temp
spec:
containers:
- volumeMounts: # < created a sequence item here by inserting an item indicator
- name: temppathname
mountPath: /temppath
volumes:
- name: temppathname
hostPath:
type: temp
path: temppath然后我就可以理解你的期望了(也许上面的改变可以用来让它工作,我没有办法去测试)。
发布于 2019-06-05 17:08:37
我发现处理这个问题最简单的方法是使用JSONPatch。我将删除基数的空字段,如下所示:
apiVersion: v1
kind: Pod
metadata:
name: temp
labels:
tier: temp
spec:
containers:
- name: temp
image: temp
imagePullPolicy: Always
command: temp
args:
temp
envFrom:
- configMapRef:
name: temp然后在overlay中创建一个新的补丁,例如名为create_volume.yml
- op: add
path: /spec/volumes/-
value:
name: temppathname
hostPath:
type: temp
path: temppath
- op: add
path: /spec/containers/0/volumeMounts/-
value:
name: temppathname
mountPath: /temppath最后在overlay kustomization.yml中添加:
patchesJson6902:
- target:
version: v1
kind: Pod
name: temp
path: create_volume.yml如果它不起作用,你可能不得不使用补丁目标中的API组。到目前为止,我只修补了部署,我的目标是:
- target:
group: apps
version: v1
kind: Deployment
name: temp
path: create_volume.ymlhttps://stackoverflow.com/questions/55377644
复制相似问题