如何在Kustomize中用单一配置统一注入Istio环境特定值?
用Kustomize统一管理Istio资源的环境特定主机地址
当然可以避免重复维护多个补丁文件,以下两种方案能帮你用单一数据源管理环境特定的主机地址,并自动同步到所有需要的Istio资源中:
方案一:直接在资源清单中用变量 + ConfigMap存值
这个方案无需编写补丁文件,直接在Istio资源里用变量占位,通过Kustomize的vars和configMapGenerator自动替换成对应环境的值。
步骤1:改造基础资源清单
把Gateway和VirtualService里的主机地址替换成$(HOST_ADDRESS)变量:
# gateway.yaml apiVersion: networking.istio.io/v1alpha3 kind: Gateway metadata: name: foo spec: selector: istio: bar servers: - port: number: 443 name: https protocol: HTTPS tls: mode: SIMPLE credentialName: secret hosts: - $(HOST_ADDRESS)
# virtualservice.yaml apiVersion: networking.istio.io/v1alpha3 kind: VirtualService metadata: name: bazz spec: hosts: - $(HOST_ADDRESS) gateways: - foo http: - match: - uri: prefix: /api/v1 route: - destination: host: blarg port: number: 80
步骤2:在base目录的kustomization.yaml中配置变量与默认值
# base/kustomization.yaml resources: - gateway.yaml - virtualservice.yaml # 生成存储主机地址的ConfigMap,这里是默认值 configMapGenerator: - name: env-config literals: - host=test.acme.com # 定义变量,关联到ConfigMap的host字段 vars: - name: HOST_ADDRESS objref: kind: ConfigMap name: env-config apiVersion: v1 fieldref: fieldpath: data.host
步骤3:在环境overlay中覆盖值
比如生产环境的overlay配置:
# overlays/prod/kustomization.yaml bases: - ../../base # 替换ConfigMap中的主机地址,覆盖默认值 configMapGenerator: - name: env-config literals: - host=prod.acme.com behavior: replace
执行kustomize build overlays/prod就能得到替换好生产地址的资源清单,所有用到$(HOST_ADDRESS)的地方都会自动更新。
方案二:用单补丁文件批量修改多个资源
如果不想修改基础资源清单,可以写一个包含多目标的JSON6902补丁,结合变量替换实现统一修改。
步骤1:创建批量补丁文件
# patches/host-update.yaml - target: group: networking.istio.io version: v1alpha3 kind: Gateway name: foo patch: |- - op: replace path: /spec/servers/0/hosts/0 value: $(HOST) - target: group: networking.istio.io version: v1alpha3 kind: VirtualService name: bazz patch: |- - op: replace path: /spec/hosts/0 value: $(HOST)
步骤2:在kustomization.yaml中配置变量与补丁引用
# base/kustomization.yaml resources: - gateway.yaml - virtualservice.yaml configMapGenerator: - name: env-config literals: - host=test.acme.com vars: - name: HOST objref: kind: ConfigMap name: env-config apiVersion: v1 fieldref: fieldpath: data.host # 引用补丁文件,对两个目标资源生效 patchesJson6902: - path: patches/host-update.yaml
同样,在环境overlay中只需替换ConfigMap的host值,就能批量更新所有目标资源的主机地址。
注意:使用Kustomize 4.x及以上版本时,需通过KUSTOMIZE_ENABLE_SUBSTITUTE_PLACEHOLDERS=true环境变量开启enableSubstitutePlaceholders特性。
内容的提问来源于stack exchange,提问作者Boon
相关产品推荐
相关产品推荐

