AWS Network Load Balancer不允许从其源实例到其源实例的流量

时间:2017-11-13 20:00:25

标签: amazon-web-services amazon-ec2 amazon-elb nlb

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

一旦我掌握了一切,我就面临以下问题:

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

这里有什么我想念的吗?是否有人意识到这一点并有解决方法?

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

2 个答案:

答案 0 :(得分:2)

我遇到了类似的问题。

这是我的设置:

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

执行测试之下:

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

Test1 :来自instance-a(在AZ-a中),查询“myservice.example.com”。

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

Test2 :与 Test1 相同,但是来自实例-b的查询(在AZ-b中)。

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

与从instance-c。

启动的查询类似的结果

从公有子网AZ-a

中的实例发起的查询

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

Result3 :查询在其中一个私有IP上命中NLB。无论遇到哪个私有IP,查询总是成功。

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

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

Result4 :查询一直成功!即使在命中私有子网A中的目标(与实例-a2相同的子网)时也是如此。

<强>结论

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

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

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

答案 1 :(得分:0)

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

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

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