通过Terraform部署Helm Chart时无法正常传递Service注解的问题
问题根因
- 注解值类型不匹配:Kubernetes要求注解的值必须是字符串类型,你配置中传入的
true默认被Helm解析为布尔值,触发报错ReadString: expects " or n, but found t,导致注解配置直接失效。 - 转义逻辑兼容问题:通过
set块传递包含点的注解键时,转义符处理不当容易导致键被解析为多层嵌套结构,无法被识别为完整的注解名称。 - 额外笔误:配置中
volumeClaimTemplate.reosources.requests.storage拼写错误,reosources应为resources。
修复方案
方案1:修改原有set配置(最小改动)
在两个注解的set配置中新增type = "string"强制指定值类型为字符串,修正后的配置如下:
{ name = "service.annotations.service\\.beta\\.kubernetes\\.io/azure-load-balancer-internal" value = "true" type = "string" }, { name = "service.annotations.service\\.beta\\.kubernetes\\.io/azure-load-balancer-internal-subnet" value = "somesubnet" type = "string" }
方案2:用values传递配置(更易维护,无需处理转义)
直接通过yamlencode传递完整的values结构,避免转义问题,在helm_release资源中新增values块即可:
resource "helm_release" "helm" { provider = helm.general for_each = local.helm_general name = each.value.name chart = each.value.chart namespace = format(each.value.namespace) dynamic "set" { iterator = item for_each = each.value.set == null ? [] : [for s in each.value.set : s if !startswith(s.name, "service.annotations")] content { name = item.value.name value = item.value.value } } # 新增values块传递注解配置 values = [ yamlencode({ service = { type = "LoadBalancer" annotations = { "service.beta.kubernetes.io/azure-load-balancer-internal" = "true" "service.beta.kubernetes.io/azure-load-balancer-internal-subnet" = "somesubnet" } } }) ] depends_on = [kubernetes_namespace.general] }
修改完成后重新apply,Service就会正确带上内网负载均衡注解,被分配指定子网下的私有IP。
内容的提问来源于stack exchange,提问作者thclpr
相关产品推荐
相关产品推荐

