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

zaq34kh6  于 2023-10-17  发布在  Kubernetes
关注(0)|答案(2)|浏览(95)

我有一个基本的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
ig9co6j1

ig9co6j11#

base.yaml中,键containers的值是一个序列(节点)。在overlay.yaml中,键containers的值是一个Map。当然,这两者是不能合并的。
在完全不了解kustomize的情况下,由于这些节点无法合并,所以覆盖层用Map节点替换整个序列节点似乎是合乎逻辑的。您期望覆盖的Map与恰好是基础序列中的一个项(在本例中是唯一的项)的Map合并,这似乎完全是任意的。如果有多个项目,需要考虑哪个项目?第一个?最后一个?第五项之前的最后一项是Map?
如果你的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

那么我可以理解你的期望(也许上面的变化可以应用到使其工作,我没有办法测试)。

h4cxqtbf

h4cxqtbf2#

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

相关问题