首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >有没有办法在yaml文件中定制合并标题,而不是将标题完全替换为覆盖yaml

有没有办法在yaml文件中定制合并标题,而不是将标题完全替换为覆盖yaml
EN

Stack Overflow用户
提问于 2019-03-27 20:50:25
回答 2查看 1.5K关注 0票数 0

我有一个基本的yaml和一个覆盖的yaml,使用"kustomize“我想合并这两个yaml。我的情况是,在运行kustomize build时,会出现一个输出,但这不是预期的,原因是什么?因为kustomize不是填充来自覆盖yaml的自定义信息,而是用我的示例中的覆盖"containers“替换整个基标题标记。我需要的预期行为是,它应该以某种方式使用覆盖yaml而不是替换来填充缺失的信息。

基本yaml:

代码语言:javascript
运行
复制
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:

代码语言:javascript
运行
复制
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 build后的预期结果:

代码语言:javascript
运行
复制
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

我得到的是:

代码语言:javascript
运行
复制
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
EN

回答 2

Stack Overflow用户

发布于 2019-03-27 23:38:00

在您的base.yaml中,键containers的值是一个序列(节点)。在您的overlay.yaml中,键containers的值是一个映射。当然,这两个不能合并。

根本不知道kustomize,因为那些不能合并,所以覆盖用映射节点替换整个序列节点似乎是合乎逻辑的。您期望覆盖图的映射与恰好是基础序列中的一个项(在本例中是唯一项)的映射合并,这似乎完全是任意的。如果有多个项目,则需要获取哪个项目?第一个?最后一个?第五项之前的最后一个是映射?

如果你的overlay.yaml看起来像这样:

代码语言:javascript
运行
复制
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
EN

Stack Overflow用户

发布于 2019-06-05 17:08:37

我发现处理这个问题最简单的方法是使用JSONPatch。我将删除基数的空字段,如下所示:

代码语言:javascript
运行
复制
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

然后在overlay中创建一个新的补丁,例如名为create_volume.yml

代码语言:javascript
运行
复制
- 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

最后在overlay kustomization.yml中添加:

代码语言:javascript
运行
复制
patchesJson6902:
- target:
    version: v1
    kind: Pod
    name: temp
  path: create_volume.yml

如果它不起作用,你可能不得不使用补丁目标中的API组。到目前为止,我只修补了部署,我的目标是:

代码语言:javascript
运行
复制
- target:
    group: apps
    version: v1
    kind: Deployment
    name: temp
  path: create_volume.yml
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55377644

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档