You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Kustomize在K8s中执行Strategic Merge时出现覆盖而非合并问题求助

解决Kustomize Strategic Merge补丁覆盖IAMPolicy bindings的问题

问题场景

尝试使用Kustomize的Strategic Merge补丁合并两个IAMPolicy资源的bindings条目,但当前操作结果是补丁中的bindings直接覆盖了原资源的内容,无法保留两个独立的bindings条目。

原文件内容

y1.yaml

apiVersion: iam.cnrm.cloud.google.com/v1beta1
kind: IAMPolicy
metadata:
  name: storage-admin-policy
  namespace: cnrm-system
spec:
  resourceRef:
    apiVersion: iam.cnrm.cloud.google.com/v1beta1
    kind: IAMServiceAccount
    name: storage-admin
    namespace: cnrm-system
  bindings:
    - role: roles/iam.workloadIdentityUser
      members:
        - serviceAccount:mysten-sui.svc.id.goog[monitoring/thanos-compactor]

y2.yaml

apiVersion: iam.cnrm.cloud.google.com/v1beta1
kind: IAMPolicy
metadata:
  name: storage-admin-policy
  namespace: cnrm-system
spec:
  resourceRef:
    apiVersion: iam.cnrm.cloud.google.com/v1beta1
    kind: IAMServiceAccount
    name: storage-admin
    namespace: cnrm-system
  bindings:
    - role: roles/iam.workloadIdentityUser
      members:
        - serviceAccount:mysten-sui.svc.id.goog[monitoring/test-compactor]

原kustomization.yaml

resources:
- y1.yaml

patchesStrategicMerge:
- y2.yaml

期望合并结果

apiVersion: iam.cnrm.cloud.google.com/v1beta1
kind: IAMPolicy
metadata:
  name: storage-admin-policy
  namespace: cnrm-system
spec:
  resourceRef:
    apiVersion: iam.cnrm.cloud.google.com/v1beta1
    kind: IAMServiceAccount
    name: storage-admin
    namespace: cnrm-system
  bindings:
    - role: roles/iam.workloadIdentityUser
      members:
        - serviceAccount:mysten-sui.svc.id.goog[monitoring/test-compactor]
    - role: roles/iam.workloadIdentityUser
      members:
        - serviceAccount:mysten-sui.svc.id.goog[monitoring/thanos-compactor]

解决方案

核心原因

Strategic Merge补丁对列表的合并逻辑依赖于资源定义的合并键(merge key)。CNRM的IAMPolicy资源未为bindings字段指定合并键,Kustomize默认会用补丁中的列表完全覆盖原资源的列表,而非追加条目。

方法1:使用JSON6902补丁(推荐)

JSON6902补丁支持精确的列表追加操作,完美匹配需求:

  1. 创建patch-add-binding.yaml文件:
- op: add
  path: /spec/bindings/-
  value:
    role: roles/iam.workloadIdentityUser
    members:
      - serviceAccount:mysten-sui.svc.id.goog[monitoring/test-compactor]
  1. 修改kustomization.yaml,替换为JSON6902补丁配置:
resources:
- y1.yaml

patches:
- path: patch-add-binding.yaml
  target:
    group: iam.cnrm.cloud.google.com
    version: v1beta1
    kind: IAMPolicy
    name: storage-admin-policy
    namespace: cnrm-system

方法2:直接合并到单个文件(简单直接)

如果不需要拆分配置,可直接在y1.yaml中写入所有需要的bindings,跳过补丁操作:

apiVersion: iam.cnrm.cloud.google.com/v1beta1
kind: IAMPolicy
metadata:
  name: storage-admin-policy
  namespace: cnrm-system
spec:
  resourceRef:
    apiVersion: iam.cnrm.cloud.google.com/v1beta1
    kind: IAMServiceAccount
    name: storage-admin
    namespace: cnrm-system
  bindings:
    - role: roles/iam.workloadIdentityUser
      members:
        - serviceAccount:mysten-sui.svc.id.goog[monitoring/thanos-compactor]
    - role: roles/iam.workloadIdentityUser
      members:
        - serviceAccount:mysten-sui.svc.id.goog[monitoring/test-compactor]

方法3:自定义合并行为(进阶,不适用相同role场景)

若需长期用Strategic Merge处理这类资源,可通过自定义OpenAPI schema指定合并键,但此方法会合并相同role的members列表,无法保留两个相同role的独立bindings:

  1. 创建openapi.yaml文件:
definitions:
  io.k8s.api.core.v1.IAMPolicySpec:
    properties:
      bindings:
        x-kubernetes-list-type: map
        x-kubernetes-list-map-keys: ["role"]
  1. 修改kustomization.yaml引入schema:
resources:
- y1.yaml

patchesStrategicMerge:
- y2.yaml

openapi:
  path: openapi.yaml

内容的提问来源于stack exchange,提问作者Pavan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 06:39:37