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

Terraform部署ingress-nginx Helm Chart失败:无法解析至少一个子网

解决EKS上Terraform部署ingress-nginx时的子网解析失败问题

问题场景

使用Terraform部署ingress-nginx Helm Chart到EKS 1.27集群时,触发报错Failed build model due to unable to resolve at least one subnet,执行kubectl describe svc ingress-nginx-controller -n ingress-nginx可复现该错误,导致Terraform的helm_release资源超时执行失败,服务外部IP长期处于Pending状态(已确认EIP配额充足)。

环境版本

  • Terraform: 1.4.6
  • EKS: 1.27 (eks.2)
  • AWS provider: 4.47
  • Helm provider: 2.10.1
  • Kubernetes provider: 2.21.1

关联Terraform代码

resource "helm_release" "ingress_nginx" {
  depends_on = [kubernetes_namespace.this]

  name      = "ingress-nginx"
  namespace = "ingress-nginx"

  repository = "https://kubernetes.github.io/ingress-nginx/"
  chart      = "ingress-nginx"
  timeout    = 600
  version    = "4.7.0"
}

解决方法

1. 显式指定子网ID或标签

ingress-nginx的AWS负载均衡器默认依赖子网标签(如kubernetes.io/cluster/<集群名称>: shared或owned)识别可用子网,若标签缺失或不匹配,会触发子网解析失败。可通过Helm Values直接指定子网ID:

resource "helm_release" "ingress_nginx" {
  # 保留原有配置...

  set {
    name  = "controller.service.annotations.service\\.beta\\.kubernetes\\.io/aws-load-balancer-subnets"
    value = "subnet-xxxxxx,subnet-yyyyyy" # 替换为集群关联的私有/公有子网ID
  }
}

或通过子网类型标签筛选:

resource "helm_release" "ingress_nginx" {
  # 保留原有配置...

  set {
    name  = "controller.service.annotations.service\\.beta\\.kubernetes\\.io/aws-load-balancer-subnet-type"
    value = "private" # 或"public",根据VPC架构选择
  }
}

2. 确认AWS负载均衡器控制器已正确部署

ingress-nginx的AWS LB依赖AWS Load Balancer Controller(原ALB Ingress Controller),若集群未部署该控制器或权限不足,会导致负载均衡器创建失败,进而触发子网解析错误:

  • 确保控制器已部署到集群
  • 验证控制器的IAM角色拥有弹性负载均衡、EC2子网/实例等相关权限

3. 检查EKS集群VPC配置

确认集群关联的VPC满足以下条件:

  • 存在至少两个可用区的子网(私有/公有均可,需匹配负载均衡器类型)
  • 子网启用IPv4(ingress-nginx默认不支持IPv6,需显式配置)
  • 子网所在可用区有可用的EC2资源

4. 调整负载均衡器类型配置

若默认负载均衡器类型与VPC架构不匹配,可显式指定类型:

resource "helm_release" "ingress_nginx" {
  # 保留原有配置...

  set {
    name  = "controller.service.type"
    value = "LoadBalancer"
  }

  set {
    name  = "controller.service.annotations.service\\.beta\\.kubernetes\\.io/aws-load-balancer-type"
    value = "nlb" # 或"alb",根据需求选择
  }
}

5. 修正Terraform依赖顺序

确保helm_release资源等待EKS集群、AWS负载均衡器控制器等核心组件部署完成后再执行:

resource "helm_release" "ingress_nginx" {
  depends_on = [
    kubernetes_namespace.this,
    aws_eks_cluster.this,
    helm_release.aws_load_balancer_controller # 若使用Helm部署负载均衡器控制器
  ]

  # 保留原有配置...
}

内容的提问来源于stack exchange,提问作者bkalcho

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 13:53:32