You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

通过Terraform部署Helm Chart时无法正常传递Service注解的问题

问题根因

  1. 注解值类型不匹配:Kubernetes要求注解的值必须是字符串类型,你配置中传入的true默认被Helm解析为布尔值,触发报错ReadString: expects " or n, but found t,导致注解配置直接失效。
  2. 转义逻辑兼容问题:通过set块传递包含点的注解键时,转义符处理不当容易导致键被解析为多层嵌套结构,无法被识别为完整的注解名称。
  3. 额外笔误:配置中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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 10:48:03