网络负载均衡器目标组中的 AWS 自动缩放目标

AWS auto scaling targets in target groups for Network Load Balancers

最近开始使用网络负载均衡器,它侦听端口 80 并将流量转发到我的目标组。我的自动缩放组配置为向该目标组添加任何新目标。

但是,我在目标 EC2 实例上的应用程序在端口 8001 而不是 80 上运行。因此我的目标应该在目标组的端口 8001 下注册。自动缩放配置似乎不支持这一点。自动缩放创建的所有新实例都添加为端口 80 的目标,并且无法自动指定应该使用哪个端口(对我来说是 8001)。

有什么实现方法吗?

目标组中的端口定义就是您要查找的端口定义。目标组中的端口是目标接收流量的端口。 listener 上的端口是负载均衡器侦听请求的端口。

因此您应该在监听器上设置端口 80,在目标组上设置端口 8001。

您使用的是哪种应用程序(Web 服务器、应用程序服务器...)?也许 ALB 更适合您,因为它在 OSI 模型的第 7 层工作,因此它能够处理 HTTP headers,例如。

回到你的问题;为了能够将流量转发到在端口 8001 上运行应用程序的 EC2 实例,您必须将目标组上的端口设置为 8001。 Auto-scaling 组对它提供的 EC2 上的 运行 应用程序一无所知,也不知道该应用程序使用的端口。

所以最终的流程是这样的:

LB 在端口 80 上侦听并将流量转发到端口 8001 上的目标组。然后该目标组将流量发送到端口 8001 上的目标(您的 EC2 实例)。

我为此哭了几个小时,这里的答案给了我一个线索,最后,我发现到底发生了什么!

端口的故事可能会变得复杂,但让我们澄清一下。

故事中的四个港口!

重要的是要知道你在这里处理 4 个端口!那么让我们一一命名吧。

(我使用的是 ECS,但这同样适用于管理您的代码到 ELB 的任何其他设备。)

P1:LB 的“侦听”端口

负载均衡器接收流量的端口。通常为 80 或 443。

P2:TG 的端口

目标组设置为工作的端口。 它在创建 TG 时被纳入目标组(如 )并显示在描述中。您以后无法更改它。

但是,您可以在不同的端口上设置目标组的 health-check,但这并不能帮助您获得正常工作的 set-up。

P3:容器的“暴露”端口

这是容器发出并期望接收流量的端口。

P4:应用程序's/host的端口

这是您的代码(比如 Node.js 应用程序)实际监听的端口。

想要没有痛苦?设置 P2 = P3

问题是 P2(TG 的)和 P3(容器的)可能不同。事实上,如果最初将它们设置为任意不同的数字,您甚至不会面临挑战。

应用 <> LB(例如在 ECS 中)

当您将服务的容器注册到 TG 时,没有人询问端口,它可以很好地工作。你只需说将这个容器附加到那个 TG,它就会自动选择这里的“容器”端口 (P3)。

然后,如果您转到 TG 的页面,您会看到它在容器的端口 (P3) 上,该端口与 TG 的 (P2) 不同,但它运行良好,谁在乎呢!

Auto Scaling 来了!

当您使用健康检查添加 Auto Scaling 时,头痛就开始了!

ASG 知道它应该在 TG 上创建实例。但是,它需要在 EC2 实例和 TG 之间分配一个端口。很明显,ASG 不知道其中将包含哪个容器 (P3),因此默认情况下它会选择 TG 的端口 (P2)。这就是疯狂发生的地方!

TL;DR

设置TG的端口==容器的端口。它们可以是任何你想要的,但要使它们匹配。

在容器下方和您的应用程序 (P4) 之间,您可以有一个映射。在 TG 上方(在 LB 上),您有另一个端口映射 (P1)。但是这些 P2 和 P3 必须匹配!

继续,使用容器的端口 (P3) 创建新的 TG,将它们连接到上方 (ELB) 和下方 (Services),希望它能正常工作!

PS。显然,您无法更改服务的 TG!所以还有新服务... :)