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
相关产品推荐
相关产品推荐

