我有一个ECS群集,由不同AZ中的2个实例组成。我运行的众多服务之一是SMTP中继。我想在此服务前使用网络负载均衡器,以便轻松配置其他应用程序以使用中继。
一旦我掌握了一切,我就面临以下问题:
如果容器出现在实例'A'上,则只有实例'B'能够访问它,反之亦然,否则超时。因此,网络负载均衡器似乎阻止访问位于同一实例上的服务。
这里有什么我想念的吗?是否有人意识到这一点并有解决方法?
更新 将服务扩展到2个实例时,它开始起作用。我现在倾向于认为它与可用区有关。
答案 0 :(得分:2)
我遇到了类似的问题。
这是我的设置:
执行测试之下:
从私有子网中的实例发起的查询。“
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相同的子网)时也是如此。
<强>结论强>:
因此,到目前为止,我的结论是,如果请求的源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/