如何使用Kustomize替换HTTPRoute的backendRefs.name字段
Kustomize 5.x Replacements替换HTTPRoute backendRefs.name失败的解决办法
自Kustomize 5.0.0起,vars功能被弃用,迁移至replacements后,仅能成功替换HTTPRoute的metadata.labels.app字段,spec.rules.backendRefs.name字段无法完成替换。
原文件内容
main.yaml
apiVersion: v1 kind: Service metadata: labels: app: foooooooooooooooo name: service --- apiVersion: gateway.networking.k8s.io/v1beta1 kind: HTTPRoute metadata: labels: app: WANT_TO_REPLACE_THIS name: route spec: hostnames: - "*" rules: - backendRefs: - name: WANT_TO_REPLACE_THIS port: 3000 matches: - path: type: PathPrefix value: /path
kustomization.yaml
apiVersion: kustomize.config.k8s.io/v1beta1 kind: Kustomization resources: - main.yaml replacements: - source: kind: Service name: service fieldPath: metadata.labels.app targets: - select: kind: HTTPRoute name: route fieldPaths: - metadata.labels.app - spec.rules.[backendRefs.name=WANT_TO_REPLACE_THIS].backendRefs.[name=WANT_TO_REPLACE_THIS].name
执行kustomize build后的结果
apiVersion: v1 kind: Service metadata: labels: app: foooooooooooooooo name: service --- apiVersion: gateway.networking.k8s.io/v1beta1 kind: HTTPRoute metadata: labels: app: foooooooooooooooo name: route spec: hostnames: - '*' rules: - backendRefs: - name: WANT_TO_REPLACE_THIS port: 3000 matches: - path: type: PathPrefix value: /path
问题原因与解决办法
问题根源
原fieldPath写法不符合Kustomize Replacements的数组筛选语法:rules和backendRefs都是数组类型,错误的嵌套筛选写法无法匹配到目标字段。
修正方案
根据需求选择以下两种写法之一:
1. 替换所有backendRefs的name字段(通配符匹配)
apiVersion: kustomize.config.k8s.io/v1beta1 kind: Kustomization resources: - main.yaml replacements: - source: kind: Service name: service fieldPath: metadata.labels.app targets: - select: kind: HTTPRoute name: route fieldPaths: - metadata.labels.app - spec.rules[*].backendRefs[*].name
2. 精准匹配name为WANT_TO_REPLACE_THIS的backendRef条目
apiVersion: kustomize.config.k8s.io/v1beta1 kind: Kustomization resources: - main.yaml replacements: - source: kind: Service name: service fieldPath: metadata.labels.app targets: - select: kind: HTTPRoute name: route fieldPaths: - metadata.labels.app - spec.rules[*].backendRefs.[name=WANT_TO_REPLACE_THIS].name
修正后执行kustomize build的结果
apiVersion: v1 kind: Service metadata: labels: app: foooooooooooooooo name: service --- apiVersion: gateway.networking.k8s.io/v1beta1 kind: HTTPRoute metadata: labels: app: foooooooooooooooo name: route spec: hostnames: - '*' rules: - backendRefs: - name: foooooooooooooooo port: 3000 matches: - path: type: PathPrefix value: /path
内容的提问来源于stack exchange,提问作者akrsum
相关产品推荐
相关产品推荐

