0

我有一个基本 yaml 和一个覆盖 yaml,并使用“kustomize”我想合并这两个 yaml。发生在我身上的是,在运行 kustomize build 时会出现一个输出,但预计不会是为什么?因为在我的例子中,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
4

2 回答 2

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

那么我可以理解您的期望(也许可以应用上述更改使其工作,我没有办法测试)。

于 2019-03-27T15:38:00.327 回答
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
于 2019-06-05T09:08:37.223 回答