3

我有一个 ECS 集群,由不同 AZ 中的 2 个实例组成。我运行的众多服务之一是 SMTP 中继。我想在这个服务前面使用一个网络负载均衡器来轻松配置其他应用程序以使用中继。

一切就绪后,我遇到了以下问题:

如果容器存在于实例“A”上,则只有实例“B”能够访问它,反之亦然,否则它会超时。因此,网络负载均衡器似乎阻止了对同一实例上的服务的访问。

我在这里缺少什么吗?有人知道这一点并有解决方法吗?

更新: 将服务扩展到 2 个实例时,它开始工作。我现在倾向于相信它与可用区有关。

4

2 回答 2

5

我遇到了类似的问题。

这是我的设置:

  • 一个 VPC 分布在 3 个可用区。
  • 3 个公有子网(每个 AZ 一个)
  • AZ-a 公有子网中的 1 个实例
  • 3 个私有子网(每个 AZ 一个)
  • 1 个 NLB 分布在 3 个私有子网上。
  • 一个 ECS 实例集群。每个私有子网中有 1 个实例。(AZ-a 中的实例-a,AZ-b 中的实例-b,AZ-c 中的实例-c)
  • 每个实例上运行的服务;总共 3 个健康服务分布在注册到 NLB 的 3 个私有子网上。
  • 用于将“myservice.example.com”映射到 NLB DNS 名称的路由 53 别名记录。

下面执行的测试:

从私有子网中的实例发起的查询。”

Test1:从实例-a(在 AZ-a 中)查询“myservice.example.com”。

结果1:查询在其私有 IP 之一上命中 NLB。如果 IP 与 instance-a 位于同一子网中,则查询将超时。如果 IP 在不同的子网中,则查询将成功。

Test2:与Test1相同,但从 instance-b 查询(在 AZ-b 中)。

结果 2:查询在其私有 IP 之一上命中 NLB。如果 IP 与 instance-b 位于同一子网中,则查询将超时。如果 IP 在不同的子网中,则查询将成功。

与从 instance-c 发起的查询类似的结果。

从公有子网 AZ-a 中的实例发起的查询

Test3 : 从 AZ-a 公有子网中的实例,查询“myservice.example.com”。

结果 3:查询在其私有 IP 之一上命中 NLB。无论命中哪个私有 IP,查询总是成功。

从私有子网 AZ-a 中的额外实例 (instance-a2) 发起的查询

Test4:我在 AZ-a 的私有子网中启动了一个额外的实例 (instance-a2)。然后,从 instance-a2 查询“myservice.example.com”。重要提示:此实例不运行任何服务,因此 NLB 永远无法选择路由任何请求。

Result4 : 查询一直成功!即使击中私有子网 A 中的目标(与实例 a2 相同的子网)。

结论

  • 使用Test1Test2,当从托管目标服务的实例进行查询时,我可能会遇到与 Laurent Jalber Simard 相同的问题。
  • 根据Test3,问题似乎并非来自与目标服务来自同一 AZ 的请求。
  • 使用Test4,如果查询来自与托管目标服务的实例不同的实例,则似乎无法重现该问题;即使它们在同一个子网中。

因此,我目前的结论是,如果请求的源 ip和 NLB 选择的目标的目标 ip相同,NLB 就会超时。

我在 AWS NLB 文档中找不到此问题/限制,到目前为止,Google 搜索中没有任何内容。有没有人得出相同的结论?

于 2017-12-30T11:25:21.860 回答
2

解决方案 如果您想将容器保持在同一个实例上并使用 NLB,您需要在任务定义中使用“awsvpc”networkMode,并将目标组类型更改为“ip”(而不是按实例 ID)。

说明 NLB 不支持请求的发夹。当您通过实例 ID 注册目标时,会保留客户端的源 IP 地址。当您尝试从后端连接到 NLB 时,会创建一个环回,并且 NLB 不允许这样做,因为源地址和目标地址相同并且连接超时。如果实例是通过实例 ID 注册的内部负载均衡器的客户端,则仅当请求被路由到不同的实例时,连接才会成功。

一些额外信息:https ://aws.amazon.com/premiumsupport/knowledge-center/target-connection-fails-load-balancer/

于 2020-06-03T11:58:44.707 回答