弹性负载均衡器指向私有子网

4
我已经创建了一个互联网可访问的弹性负载均衡器,将其指向我的VPC中的EC2实例,这与我以前做过的许多次相同。但是,这一次我正在使用私有子网和NAT网关来控制出站流量,并将所有流量通过白名单IP进行通道化。

不幸的是,这个负载均衡器经常出现连接问题,导致各种问题,包括Cloudfront无法可靠地联系到源站点。

这在公共子网下运作良好(事实上,我现在直接将其替换掉了),但在私有子网下却不行。

非常感谢您的任何想法,

Chris

1
一个面向互联网的ALB或经典ELB 不能 放置在私有子网上。负载均衡器后面的实例可以(而且几乎总是应该)位于私有子网中,但永远不应该放置在ELB上。您是这样做的吗?听起来您可能已将ELB或ALB分配给一个公共子网和一个私有子网,这将导致其失败约一半的时间。 - Michael - sqlbot
抱歉,是的,它是一个ALB,即使我将其指向两个私有子网(其中仅一个包含服务器),我仍然遇到相同的问题。唯一可靠地使其正常工作的方法是将其指向两个公共子网。实际上它正在工作,只是偶尔会出现连接挂起10/20秒的情况。 - AffinoChris
1个回答

7
“我唯一可以使它可靠地工作的方法是将其指向两个公共子网。”
这是设计上的要求。
Internet-facing Application Load Balancers (ALB) 和 Classic ELBs 必须专门在公共子网中配置。
这是永远正确的,无论负载均衡器后面的实例是否在私有子网中。
如果将负载均衡器放置在私有子网中,浏览器无法与负载均衡器建立连接,因为负载均衡器子网的默认路由不是 Internet Gateway,所以负载均衡器的回复被错误地路由,导致连接超时。如果负载均衡器位于公共和私有子网的混合中,则超时会变得间歇性,因为某些连接通过公共子网到达负载均衡器(并且正常工作),而其他连接通过私有子网到达负载均衡器(并且不能正常工作)。
负载均衡器不需要位于任何私有子网中,因为 VPC 路由表始终包含一个隐式路由,允许 VPC 中的所有子网相互访问,仅受安全组和网络 ACL 规则的限制。将负载均衡器放置在与实例完全不同的子网中不会产生性能劣势。

问题的解释很好。我还要补充一点,如果您执行 dig <lb-dns>,问题就会变得非常明显 - 这将返回实际负载均衡器的所有IP地址,如果您检查每个IP地址,与私有子网相关的IP地址将无法工作,因为它们是私有IP地址,正如Michael所解释的那样。 - Miroslav Nedyalkov
杰出的解释 @Michael - dev

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接