AWS Load Balancer Controller创建公网LB误绑私有子网求助
AWS Load Balancer Controller 公网LB误关联私有子网的原因与根治方法
常见原因
- 控制器缓存未同步:AWS Load Balancer Controller会缓存AWS资源元数据(包括子网标签),如果后续修改了子网标签但控制器未及时刷新缓存,就会沿用旧标签逻辑选择子网,导致误选私有子网。
- EIP的AZ匹配逻辑漏洞:当指定
aws-load-balancer-eip-allocations注解时,控制器需要匹配EIP所在AZ的子网。若私有子网与EIP同AZ,且控制器未严格区分elb和internal-elb标签,就可能误将私有子网纳入绑定范围。 - 旧版本控制器逻辑bug:部分早期版本的控制器在处理
internet-facing类型LB时,存在逻辑漏洞——只要子网带有kubernetes.io/cluster/<cluster_name>标签就会被纳入候选池,忽略了kubernetes.io/role/elb的过滤条件。
根治方法
1. 强制刷新控制器缓存
重启控制器Pod,让它重新拉取最新的AWS资源元数据,避免缓存过期导致的判断错误:
kubectl rollout restart deployment aws-load-balancer-controller -n kube-system
重启后,可给LB服务添加临时注解(如dummy: "true")再删除,触发控制器重新 reconcile 服务配置,自动修正LB的子网关联。
2. 直接指定目标子网(最可靠)
在LB服务的注解中明确指定要使用的公网子网ID,彻底跳过控制器的自动选择逻辑,从根源避免误选:
service.beta.kubernetes.io/aws-load-balancer-subnets: subnet-xxxxxx,subnet-yyyyyy
将subnet-xxxxxx和subnet-yyyyyy替换为你的公网子网ID即可。
3. 校验并修复子网标签一致性
确保子网标签完全符合规范,避免标签冲突:
- 私有子网仅保留
kubernetes.io/cluster/<cluster_name>: shared和kubernetes.io/role/internal-elb: 1,绝对不能有kubernetes.io/role/elb标签 - 公网子网仅保留
kubernetes.io/cluster/<cluster_name>: shared和kubernetes.io/role/elb: 1,绝对不能有kubernetes.io/role/internal-elb标签
用AWS CLI快速验证标签:
aws ec2 describe-subnets --filters "Name=tag:kubernetes.io/cluster/<cluster_name>,Values=shared" --query 'Subnets[*].{SubnetId:SubnetId,Tags:Tags}'
4. 升级控制器到最新稳定版
若使用旧版本控制器,建议升级到官方最新稳定版,修复已知的子网选择逻辑bug:
# 以Helm升级为例 helm upgrade aws-load-balancer-controller eks/aws-load-balancer-controller \ -n kube-system \ --set clusterName=<cluster_name> \ --set serviceAccount.create=false \ --set serviceAccount.name=aws-load-balancer-controller
内容的提问来源于stack exchange,提问作者Jesus Iniesta
相关产品推荐
相关产品推荐

