如何用Terraform Helm provider覆盖默认Chart值配置内部负载均衡器
实现方案
Istio官方Gateway Helm Chart原生支持通过Values配置覆盖Service的注解、属性等参数,不需要手动修改渲染后的Kubernetes清单,直接在现有helm_release资源块中追加对应配置,即可将默认公网负载均衡器替换为内网负载均衡器。
切换内网LB的核心逻辑,是给Chart自动创建的LoadBalancer类型Service添加对应云服务商的内网LB注解,不同云厂商的注解键存在差异,常见环境的对应注解如下:
- 阿里云ACK:
service.beta.kubernetes.io/alibaba-cloud-loadbalancer-address-type: "intranet" - 腾讯云TKE:
service.kubernetes.io/qcloud-loadbalancer-internal-subnetid: "<内网子网ID>"、service.kubernetes.io/loadbalance-type: "Internal" - AWS EKS:
service.beta.kubernetes.io/aws-load-balancer-internal: "true" - GCP GKE:
cloud.google.com/load-balancer-type: "Internal" - Azure AKS:
service.beta.kubernetes.io/azure-load-balancer-internal: "true"
配置方式
你可以直接在原有helm_release资源中添加set块,将对应注解传入service.annotations配置路径,修改后的完整资源代码参考如下(示例为AWS EKS环境,替换为你所用云厂商的注解即可):
resource "helm_release" "istio-ingress" { repository = local.istio_charts_url chart = "gateway" name = "istio-ingress-gateway" namespace = kubernetes_namespace.istio_system.metadata.0.name version = ">= 1.12.1" timeout = 500 cleanup_on_fail = true force_update = false depends_on = [helm_release.istiod] # 新增内网LB注解配置 set { name = "service.annotations.service\\.beta\\.kubernetes\\.io/aws-load-balancer-internal" value = "true" } # 如需指定内网LB绑定的子网,可追加对应配置,例: # set { # name = "service.annotations.service\\.beta\\.kubernetes\\.io/aws-load-balancer-subnets" # value = "subnet-xxxxxx,subnet-yyyyyy" # } }
注意事项:因为注解键本身包含
.符号,在set块中写注解键时,需要用双反斜杠对.做转义,否则会被Helm Provider识别为多层级配置路径,导致传值不生效。如果不想处理转义逻辑,也可以把自定义配置写到独立的Values文件中,通过
helm_release的values参数加载文件,这种写法不需要转义特殊字符,适合配置项较多的场景。
Values文件传入的参考写法:
- 新建
istio-gateway-values.yaml配置文件:
service: annotations: service.beta.kubernetes.io/aws-load-balancer-internal: "true" # 其余自定义配置可按需追加
- 在Terraform资源中引用该文件:
resource "helm_release" "istio-ingress" { # 此处省略原有固定配置项 values = [ file("${path.module}/istio-gateway-values.yaml") ] }
配置执行terraform apply后,Helm会自动更新Istio Ingress对应的Service资源,云厂商侧会自动完成公网LB到内网LB的替换,不需要手动重建相关工作负载。
内容的提问来源于stack exchange,提问作者Nitin G
相关产品推荐
相关产品推荐

