Merge 有没有一种方法可以使yaml文件中的合并标题kustomize而不是用覆盖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

我有一个基本yaml和一个覆盖yaml,使用“kustomize”,我想合并这两个yaml。我遇到的情况是,在运行kustomize构建时会出现一个输出,但这不是预期的为什么?因为在我的例子中,kustomize代替了覆盖yaml中的自定义信息,而是用覆盖“containers”替换了基础的整个标题标记。我需要的预期行为是,it应该以某种方式使用覆盖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

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