我有一个基本的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: 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
2条答案
按热度按时间ig9co6j11#
在
base.yaml
中,键containers
的值是一个序列(节点)。在overlay.yaml
中,键containers
的值是一个Map。当然,这两者是不能合并的。在完全不了解kustomize的情况下,由于这些节点无法合并,所以覆盖层用Map节点替换整个序列节点似乎是合乎逻辑的。您期望覆盖的Map与恰好是基础序列中的一个项(在本例中是唯一的项)的Map合并,这似乎完全是任意的。如果有多个项目,需要考虑哪个项目?第一个?最后一个?第五项之前的最后一项是Map?
如果你的
overlay.yaml
看起来像:那么我可以理解你的期望(也许上面的变化可以应用到使其工作,我没有办法测试)。
h4cxqtbf2#
我发现处理这个问题最简单的方法是使用JSONPatch。我会删除基地的空字段,如:
然后在你的覆盖中创建一个新的补丁,例如命名为
create_volume.yml
:最后,在覆盖
kustomization.yml
中添加:如果它不起作用,您可能不得不在修补程序目标中使用API组。到目前为止,我只修补部署,我的目标是: