kubernetes 修补或添加嵌套结构,具体取决于它是否存在

问题描述 投票:0回答:1

我想知道是否有任何方法可以使用“/root/subdir”的补丁,如果“root”不存在,则创建“root”(加上“subdir”),或者简单地添加或替换“subdir”,如果“root”已经存在。

示例:

patchesJson6902:
  - target:
      kind: MyKind
      name: config
      version: v1beta1
      group: mygroup.com
    patch: |-
      - op: replace
        path: /spec/array/0/spec/newField
        value: test

如果

/spec/array/0/spec
已经存在,那么一切都会成功。否则,我得到:

% kustomize build --load-restrictor LoadRestrictionsNone
Error: replace operation does not apply: doc is missing path: /spec/array/0/spec/newField: missing value

我意识到“替换”实际上并不能做到这一点,但是有没有办法实现这种行为?

kubernetes kubectl kustomize
1个回答
0
投票

使用 kubectl kustomize 进行 Json6902 修补时出现的最常见问题是无法认识到“添加”有时可能表现得像“替换”。Paul Dally 的Medium blog解释了相同的问题及其解决方案.

Kubernetes 补丁本身是为了与已经存在的资源一起使用而设计的;它们不会自动支持将丢失的目录添加到路径中。但是,如果“/root”目录尚不存在,您可以创建它,然后使用策略合并补丁来修改“/root/subdir”以获得所需的行为。

战略合并补丁:

补丁Json6902:

  • target: kind: MyKind name: config version: v1beta1 group: mygroup.com patch: |- spec: array: spec:{} #创建嵌套结构的空对象 newField: test #要添加或替换的值

有关战略合并补丁的更多信息,请参阅此官方 Kubernetes 文档。

此补丁尝试合并提供的规范部分,其中包括嵌套的“newfield”,如果“spec/array/0/spec”不存在,它将使用指定的“newField”值创建通过遵循这种方法,您可以有效地使用补丁创建或更新 kubernetes 资源中的嵌套结构。

© www.soinside.com 2019 - 2024. All rights reserved.