使用 Elastic Beanstalk 和 NAT 进行多区域负载平衡

Posted

技术标签:

【中文标题】使用 Elastic Beanstalk 和 NAT 进行多区域负载平衡【英文标题】:Multi-Zone Load Balancing with Elastic Beanstalk and NAT 【发布时间】:2021-08-13 21:35:12 【问题描述】:

我一直在尝试设置 Elastic Beanstalk,以便跨多个可用区的所有实例在外部看起来都具有相同的静态 IP 地址。为此,我按照此处的说明进行操作:

https://aws.amazon.com/premiumsupport/knowledge-center/elastic-beanstalk-static-IP-address/

我也遵循了这里的先决条件:

https://aws.amazon.com/premiumsupport/knowledge-center/nat-gateway-vpc-private-subnet/

我创建了一个演示环境 (php) 并安装了示例应用程序 - 只是为了进行概念验证。只要我只使用一个可用区(负载均衡器在公共子网中,并且每个实例还有另外两个私有子网 - 但都在同一个可用区中),一切都可以正常工作。当我尝试修改 Elastic Beanstalk 以使某些实例位于不同的可用区时,我的结果好坏参半。有时我能够让应用程序加载到我的浏览器中,而其他时候它只是超时。我尝试了启用/禁用跨区域负载平衡的各种组合,无论哪种方式我都得到相同的结果。

当我查看负载均衡器时,所有实例都显示“In Service”,并且 Elastic Beanstalk 报告“OK”状态。当我运行 VPC 可达性分析器时,它显示每个实例都可以从 Internet 网关访问。

这是我设置的配置:

可用区 us-east-1c

子网 1(公共):此子网将流量路由到 Internet 网关。这是负载平衡器所在的子网。 子网 2(专用):此子网不会将任何内容路由到 Internet 网关。相反,它将所有出站流量路由到 NAT(也位于公共子网中)。 子网 3(私有):此子网与子网 2 相同(使用相同的路由表)。

可用区 us-east-1b

子网 4(私有):此子网与子网 2 相同(使用相同的路由表)。

可用区 us-east-1d

子网 5(私有):此子网与子网 2 相同。

所以我看到的是,只要我只将实例部署到子网 2 和 3,一​​切正常。一旦我尝试在子网 4 或 5 中添加实例,应用程序就会开始变得断断续续。有时有效,有时无效。

我还应该指出,我正在尝试通过引用负载均衡器的 URL 以及为环境自动生成的 Elastic Beanstalk URL 来在我的浏览器中加载此应用程序。两种情况下的行为是相同的。

我做错了什么?

【问题讨论】:

我有几个问题。它是哪个负载均衡器?应用程序还是网络?我过去曾遇到过这样的问题,但我的应用程序负载均衡器位于私有子网中。我将它部署在一个公共子网中,目标组具有私有子网的实例。一旦 tg 健康检查通过,我的请求就开始通过了。另外,您是否检查了请求是否进入服务器? 这是一个经典的负载均衡器,我找到了解决方案。我创建了另外两个公共子网 - 一个在 us-east-1b 中,一个在 us-east-1d 中。现在我在每个可用区都有一个公共子网。我将负载均衡器部署到所有这些公共子网,然后一切都开始工作了。因此,为了让负载均衡器与私有子网中的实例进行通信,似乎需要将其部署到同一可用区中的公有子网中。 【参考方案1】:

我能够通过在每个可用区中创建一个公共子网并将负载平衡器部署到每个公共子网来解决这个问题。之后,一切正常。

【讨论】:

以上是关于使用 Elastic Beanstalk 和 NAT 进行多区域负载平衡的主要内容,如果未能解决你的问题,请参考以下文章

Elastic Beanstalk、Docker 和持续集成

Elastic Beanstalk 防止文件覆盖

使用 Cloudflare 将 HTTPs 添加到 Elastic Beanstalk

Elastic Beanstalk 和 Dockerfile ARG 指令

Cloudformation 协助 Elastic Beanstalk 和 Application Load Balancer

AWS 和 Elastic Beanstalk