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补丁支持精确的列表追加操作,完美匹配需求:
- 创建
patch-add-binding.yaml文件:
- op: add path: /spec/bindings/- value: role: roles/iam.workloadIdentityUser members: - serviceAccount:mysten-sui.svc.id.goog[monitoring/test-compactor]
- 修改
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:
- 创建
openapi.yaml文件:
definitions: io.k8s.api.core.v1.IAMPolicySpec: properties: bindings: x-kubernetes-list-type: map x-kubernetes-list-map-keys: ["role"]
- 修改
kustomization.yaml引入schema:
resources: - y1.yaml patchesStrategicMerge: - y2.yaml openapi: path: openapi.yaml
内容的提问来源于stack exchange,提问作者Pavan
相关产品推荐
相关产品推荐

