EKS部署ALB Ingress报错无法自动发现子网问题咨询
EKS部署Ingress触发子网自动发现失败报错排查方案
问题现象
在AWS EKS集群中部署Ingress资源时触发报错:ingress Failed build model due to couldn't auto-discover subnets: unable to discover at least one subnet
已完成前置校验
- 已确认Deployment部署文件中填写的集群名称准确无误
- 已在Ingress资源定义中配置如下注解:
alb.ingress.kubernetes.io/scheme: internal alb.ingress.kubernetes.io/target-type: ip kubernetes.io/ingress.class: alb kubernetes.io/role/internal-elb: 1 alb.ingress.kubernetes.io/subnets: subnet-xxxx, subnet-yyy, subnet-zzz kubernetes.io/cluster/<ClusterName>: owned
注:上述注解中
<ClusterName>已替换为实际集群名称,校验无误
- 当前使用EKS私有子网,子网为独立创建,已按官方要求配置对应子网标签,仍复现报错
根因排查与解决方案
按优先级从高到低排查以下问题点:
- 修正子网注解的格式错误
当前配置的alb.ingress.kubernetes.io/subnets字段值存在格式问题:子网ID之间的英文逗号后不能加多余空格,现有错误写法subnet-xxxx, subnet-yyy, subnet-zzz会导致控制器解析子网ID时把空格带入字符串,匹配不到真实存在的子网。将该字段值修改为subnet-xxxx,subnet-yyy,subnet-zzz即可解决该类解析错误。 - 校验AWS Load Balancer Controller的IAM权限
确认集群内运行的AWS Load Balancer Controller所绑定的IRSA IAM角色,已包含ec2:DescribeSubnets、ec2:DescribeRouteTables、ec2:DescribeVpcs的操作权限。权限缺失时,即使注解中硬编码子网ID,控制器也无法调用AWS API校验子网元数据,触发子网发现失败报错。 - 校验子网标签的精确匹配性
逐个子网核对标签键值,确保完全符合要求,无拼写、大小写偏差:- 内部ALB使用的私有子网必须携带标签
kubernetes.io/role/internal-elb=1,标签值为字符串格式的1 - 所有关联子网必须携带
kubernetes.io/cluster/<实际集群名称>=owned或shared标签,标签键中的集群名大小写必须和EKS控制台展示的集群名完全一致 - 确认子网关联的路由表存在有效路由(私有ALB场景下需存在指向NAT网关的路由,公网ALB场景需存在指向互联网网关的路由),控制器会校验子网的路由配置有效性
- 内部ALB使用的私有子网必须携带标签
- 校验控制器版本兼容性
若EKS集群版本为1.24及以上,使用v2.4以下版本的AWS Load Balancer Controller会存在子网发现逻辑兼容问题,将控制器升级到v2.5及以上稳定版本即可修复该类偶发报错。 - 重载控制器配置生效
完成上述修改后,执行命令kubectl rollout restart deployment -n kube-system aws-load-balancer-controller重启控制器Pod,待Pod全部处于Running状态后重新应用Ingress资源即可。
内容的提问来源于stack exchange,提问作者Rohit kumar
相关产品推荐
相关产品推荐

