使用 kubectl kustomize 将项目添加到列表

Eir*_*k H 6 kubectl kustomize

我想将base/foo.yaml应用于我的所有环境,它部分看起来像这样

Kubernetes:
  deploymentPatches:
    - patch: |-
      - {"op": "add", "path": "/spec/template/spec/volumes/-", "value": {"name": "volume", "secret": {"secretName": "my-secret"}}}
      - {"op": "add", "path": "/spec/template/spec/containers/0/volumeMounts/-", "value": {"mountPath": "/connections", "name": "volume"}}
Run Code Online (Sandbox Code Playgroud)

现在我还想添加特定于环境的补丁,因此运行eg后我的最终目标kubectl kustomize accept应该是

Kubernetes:
  deploymentPatches:
    - patch: |-
      - {"op": "add", "path": "/spec/template/spec/volumes/-", "value": {"name": "volume", "secret": {"secretName": "my-secret"}}}
      - {"op": "add", "path": "/spec/template/spec/containers/0/volumeMounts/-", "value": {"mountPath": "/connections", "name": "volume"}}
      - {"op": "add", "path": "/spec/template/spec/containers/0/env/-", "value": {"name": "MY_ENVIRONMENT", "value": "accept"}}
Run Code Online (Sandbox Code Playgroud)

或者

Kubernetes:
  deploymentPatches:
    - patch: |-
      - {"op": "add", "path": "/spec/template/spec/volumes/-", "value": {"name": "volume", "secret": {"secretName": "my-secret"}}}
      - {"op": "add", "path": "/spec/template/spec/containers/0/volumeMounts/-", "value": {"mountPath": "/connections", "name": "volume"}}
    - patch: |-
      - {"op": "add", "path": "/spec/template/spec/containers/0/env/-", "value": {"name": "MY_ENVIRONMENT", "value": "accept"}}
Run Code Online (Sandbox Code Playgroud)

我将如何设置我的 kustomize 配置来完成此任务?到目前为止我已经尝试过以下操作:

kustomize.yaml

apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
bases:
  - ../base
patchesStrategicMerge:
  - foo.yaml
Run Code Online (Sandbox Code Playgroud)

接受/foo.yaml

Kubernetes:
  deploymentPatches:
    - patch: |-
      - {"op": "add", "path": "/spec/template/spec/containers/0/env/-", "value": {"name": "MY_ENVIRONMENT", "value": "accept"}}
Run Code Online (Sandbox Code Playgroud)

Eir*_*k H 16

我遇到的问题在战略合并补丁文档中有解释;

在标准 JSON 合并补丁中,JSON 对象始终被合并,但列表始终被替换。通常这不是我们想要的。

为了解决这个问题,Strategy Merge Patch 使用 API 对象的 go struct 标签来确定哪些列表应该合并,哪些列表不应该合并。

这就是为什么它可以使用patchesStrategicMerge.

但是,我尝试附加项目的对象和列表并未以这种方式设置,因此只是被替换。

由于我无法更改设置,因此我的解决方案是求助于patchesJson6902.

补丁.yaml

- op: add
  path: /spec/Kubernetes/deploymentPatches/-
  value:
    patch: |-
      - op: add
        path: /spec/template/spec/containers/0/env/-
        value:
          name: MY_ENVIRONMENT
          value: accept
Run Code Online (Sandbox Code Playgroud)

自定义.yaml

apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
bases:
  - ../base
patchesJson6902:
- target:
    group: mygroup
    version: v1
    kind: myobject
    name: myname
  path: patch.yaml
Run Code Online (Sandbox Code Playgroud)