如何在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取值,自动同步到目标字段:
- 修改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
- 修改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
相关产品推荐
相关产品推荐

