有没有一种方法可以使kustomize yaml文件中的合并标题,而不是用覆盖yaml完全替换该标题

时间:2019-03-27 12:50:25

标签: merge kubernetes yaml

我有一个基本的yaml和一个重叠的yaml,使用“ kustomize”我想将这两个yaml合并。我发生的事情是,在运行kustomize构建时,会出现输出,但是为什么不这样呢?因为在我的案例中,使用Kustomize而不是从覆盖yaml填充自定义信息,而是用覆盖的“容器”替换了基座的整个标题标签。我需要的预期行为是,它应该使用覆盖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 个答案:

答案 0 :(得分:1)

在您的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

那我可以理解您的期望(也许可以应用上述更改使其生效,但我没有办法进行测试)。

答案 1 :(得分:0)

我发现处理此问题的最简单方法是使用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_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