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

如何用Kustomize Replacements跨Base替换值?求最佳实践

问题

由于Kustomize中的vars和bases已被弃用,我正在将Kubernetes配置迁移为使用replacements和resources。

此前在/base/secrets/ Base中用vars实现跨Base值替换,配置如下:

apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization

secretGenerator:
- name: test_secret
  env: secret.env

vars:
- name : SECRET_VALUE
  objref:
    kind: Secret
    name: test_secret
    apiVersion: v1
  fieldref:
    fieldpath: metadata.name

该Base被多个服务的Overlay引用:

namespace: test-overlay

bases:
- ../../base/secrets/
- ../../base/service/

现在改用resources和replacements后,希望在/base/secrets/中定义replacements,替换/base/service/中Deployment的指定字段,避免在每个Overlay重复配置。尝试的配置如下:

apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization

secretGenerator:
- name: test_secret
  env: secret.env

replacements:
- source:
    name: test_secret
    kind: Secret
  targets:
  - select:
      kind: Deployment
      name: service
    fieldPaths:
    - spec.template.spec.<field>

使用Kustomize v5.1.0版本,目前仅能在Overlay中定义replacements实现替换,但多个Overlay都需要该配置,复用性差。提供的最小可复现结构:

/base
  /secrets
    kustomization.yaml
  /service
    deployment.yaml
    kustomization.yaml
/overlays
  /test-overlay
    kustomization.yaml

各文件具体配置:

  • /secrets/kustomization.yaml:
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization

secretGenerator:
- name: test_secret
  env: secret.env

replacements:
- source:
    name: test_secret
    kind: Secret
  targets:
  - select:
      kind: Deployment
      name: service
    fieldPaths:
    - spec.template.spec.volumes.name
  • /service/kustomization.yaml及deployment.yaml:
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
    
resources:
- deployment.yaml
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: service
spec:
  template:
    spec:
      volumes:
      - name: placeholder_value
        emptyDir: {}
  • /test-overlay/kustomization.yaml:
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization

namespace: test-overlay

resources:
- ../../base/secrets/
- ../../base/service/

请问如何让replacements在Base中生效以跨Base替换值?此场景的最佳实践是什么?


解决方案

让Base中的replacements跨Base生效的方法

Kustomize的replacements默认只对当前kustomization.yaml所在的资源集合生效,要实现跨Base替换,需要调整资源引用结构:

  1. 创建聚合Base
    在/base/目录下新增一个kustomization.yaml,把secrets和service作为子资源引入,同时将replacements定义在这个聚合Base中:
# /base/kustomization.yaml
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization

resources:
- ./secrets/
- ./service/

replacements:
- source:
    name: test_secret
    kind: Secret
    fieldPath: metadata.name
  targets:
  - select:
      kind: Deployment
      name: service
    fieldPaths:
    - spec.template.spec.volumes.0.name  # 注意:volumes是数组,必须指定索引定位元素
    options:
      create: false
  1. 调整Overlay引用
    修改/overlays/test-overlay/kustomization.yaml,直接引用这个聚合Base:
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization

namespace: test-overlay

resources:
- ../../base/
  1. 清理冗余配置
    删除/base/secrets/kustomization.yaml中的replacements块,避免重复定义。

核心原因

原来的结构中,secrets和service是两个独立的Base,Overlay同时引入它们时,secrets里的replacements无法感知到service的资源(两者属于不同的资源集合)。通过聚合Base将两者纳入同一个资源集合,replacements就能跨资源生效。

此场景的最佳实践

  • 聚合关联Base:把有依赖、需要互相替换的Base统一聚合到父级kustomization.yaml中,集中管理replacements,避免重复配置。
  • 精准定位字段:如果目标字段是数组类型,必须指定索引(比如volumes.0.name),否则Kustomize无法匹配到具体元素。
  • 避免子Base跨域替换:不要在子Base中定义作用于其他子Base的replacements,统一在更高层级的聚合Base中配置,符合Kustomize的资源作用域规则。
  • 配置容错选项:添加options.create: false,可以避免Kustomize在找不到目标资源时报错,提升配置鲁棒性。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 04:16:41