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

如何在Kustomize Base中用Replacements替代已弃用的Vars功能?

用Kustomize Replacements替代Vars拆分Base/Overlay后失效的解决方法

我正尝试用Replacements替代已弃用的Vars功能,但拆分Base和Overlay后替换逻辑失效。以下是具体场景和解决方法:


单文件正常运行示例

resource.yaml

---
apiVersion: v1
kind: FooBar
metadata:
  labels:
    my.label.io/name: NAME_PLACEHOLDER
  name: NAME_PLACEHOLDER
  namespace: NAMESPACE_PLACEHOLDER
spec:
  foo: bar

kustomization.yaml

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

resources:
- resource.yaml

replacements:
- source:
    fieldPath: metadata.name
    kind: FooBar
    name: NAME_PLACEHOLDER
  targets:
  - fieldPaths:
    - metadata.labels.[my.label.io/name]
    select:
      kind: FooBar
      name: NAME_PLACEHOLDER

namespace: my-final-namespace
patches:
- target:
    kind: FooBar
    name: NAME_PLACEHOLDER
  patch: |-
    - op: replace
      path: /metadata/name
      value: my-final-name

预期输出(kubectl kustomize .结果)

apiVersion: v1
kind: FooBar
metadata:
  labels:
    my.label.io/name: my-final-name
  name: my-final-name
  namespace: my-final-namespace
spec:
  foo: bar

拆分Base/Overlay后替换失效

Base目录配置

Base下的kustomization.yaml:

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

resources:
- resource.yaml

replacements:
- source:
    fieldPath: metadata.name
    kind: FooBar
    name: NAME_PLACEHOLDER
  targets:
  - fieldPaths:
    - metadata.labels.[my.label.io/name]
    select:
      kind: FooBar
      name: NAME_PLACEHOLDER

Overlay目录配置

Overlay下的kustomization.yaml:

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

resources:
- ../base/

namespace: my-final-namespace
patches:
- target:
    kind: FooBar
    name: NAME_PLACEHOLDER
  patch: |-
    - op: replace
      path: /metadata/name
      value: my-final-name

实际输出(替换未生效)

apiVersion: v1
kind: FooBar
metadata:
  labels:
    my.label.io/name: NAME_PLACEHOLDER
  name: my-final-name
  namespace: my-final-namespace
spec:
  foo: bar

问题根源与解决方法

问题出在Kustomize执行顺序:Base中的Replacements在Overlay的Patches之前执行,此时metadata.name还是NAME_PLACEHOLDER,替换完成后Overlay的Patch才修改name,但Base的Replacements不会重新触发。

要实现Base保留替换逻辑、Overlay仅修改单个值的需求,推荐以下方案:

方案:通过ConfigMap传递值(无需重复编写替换逻辑)

利用configMapGenerator在Overlay中定义最终名称,Base中的Replacements从ConfigMap取值,自动同步到目标字段:

  1. 修改Base的kustomization.yaml:
---
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization

resources:
- resource.yaml

replacements:
- source:
    fieldPath: data.name
    kind: ConfigMap
    name: app-name-config # 固定ConfigMap名称
  targets:
  - fieldPaths:
    - metadata.name
    - metadata.labels.[my.label.io/name]
    select:
      kind: FooBar
      name: NAME_PLACEHOLDER
  1. 修改Overlay的kustomization.yaml:
---
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization

resources:
- ../base/

namespace: my-final-namespace

# 生成存储最终名称的ConfigMap
configMapGenerator:
- name: app-name-config
  literals:
  - name=my-final-name
  options:
    disableNameSuffixHash: true # 禁用哈希后缀,保证名称固定

# 可选:如果不需要保留ConfigMap,添加补丁删除它
patches:
- target:
    kind: ConfigMap
    name: app-name-config
  patch: |-
    - op: remove
      path: /

验证输出

执行kubectl kustomize overlay/会得到预期结果:

apiVersion: v1
kind: FooBar
metadata:
  labels:
    my.label.io/name: my-final-name
  name: my-final-name
  namespace: my-final-namespace
spec:
  foo: bar

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 20:18:26