Merge 有没有一种方法可以使yaml文件中的合并标题kustomize而不是用覆盖yaml完全替换该标题
我有一个基本yaml和一个覆盖yaml,使用“kustomize”,我想合并这两个yaml。我遇到的情况是,在运行kustomize构建时会出现一个输出,但这不是预期的为什么?因为在我的例子中,kustomize代替了覆盖yaml中的自定义信息,而是用覆盖“containers”替换了基础的整个标题标记。我需要的预期行为是,it应该以某种方式使用覆盖yaml而不是替换来填充缺少的信息 基本yaml:Merge 有没有一种方法可以使yaml文件中的合并标题kustomize而不是用覆盖yaml完全替换该标题,merge,kubernetes,yaml,kustomize,Merge,Kubernetes,Yaml,Kustomize,我有一个基本yaml和一个覆盖yaml,使用“kustomize”,我想合并这两个yaml。我遇到的情况是,在运行kustomize构建时会出现一个输出,但这不是预期的为什么?因为在我的例子中,kustomize代替了覆盖yaml中的自定义信息,而是用覆盖“containers”替换了基础的整个标题标记。我需要的预期行为是,it应该以某种方式使用覆盖yaml而不是替换来填充缺少的信息 基本yaml: apiVersion: v1 kind: Pod metadata: name: temp
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: temppath
kustomize生成后的预期结果:
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
在
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
apiVersion:v1
种类:豆荚
元数据:
姓名:临时雇员
标签:
级别:临时
规格:
容器:
-volumeMounts:#<通过插入项目指示符在此处创建了序列项目
-名称:temppathname
mountPath:/temppath
卷数:
-名称:temppathname
主机路径:
类型:临时
路径:临时路径
然后我可以理解您的期望(也许可以应用上面的更改使其工作,我没有办法进行测试)。我发现处理这一问题最简单的方法是使用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
然后在覆盖中创建一个新补丁,例如名为create\u 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
最后在叠加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.yml