使用Load Balancer在AWS ECS上尝试dask.distributed集群时出现连接错误

时间:2016-10-05 06:40:59

标签: amazon-web-services amazon-ecs dask elastic-load-balancer

我们正尝试在AWS上使用ECS启动一个dask集群。我们目前的设置:

  • 两个服务 - 一个dask-scheduler服务和一个dask-worker服务,每个服务都有一个任务定义。每个服务都有一个任务(将来dask-worker任务可以扩展)。
  • dask-scheduler映射端口8786,8787和& 9786从容器到主机。 dask-worker任务不映射任何端口。
  • 经典的负载均衡器位于dask-scheduler前面,并侦听TCP上的这三个端口。即使我们只有一个dask-scheduler任务,负载均衡器也会在调度程序重启时提供静态地址。
  • dask-worker以负载均衡器的arg启动。 dask-scheduler以no args启动。

不幸的是,我运气不好。我收到这些日志消息:


06:10:24
distributed.core - INFO - Connection from 172.31.35.94:49003 to Scheduler

06:10:24
distributed.core - INFO - Lost connection: ('172.31.35.94', 49003)

06:10:24
distributed.core - INFO - Close connection from 172.31.35.94:49003 to Scheduler

06:10:54
distributed.core - INFO - Connection from 172.31.35.94:49009 to Scheduler

06:10:54
distributed.core - INFO - Lost connection: ('172.31.35.94', 49009)

06:10:54
distributed.core - INFO - Close connection from 172.31.35.94:49009 to Scheduler

06:11:07
distributed.core - INFO - Connection from 172.31.35.94:49018 to Scheduler

06:11:07
distributed.core - INFO - Connection from 172.31.35.94:49019 to Scheduler

06:11:07
distributed.scheduler - INFO - Receive client connection: 941a5c1a-8ac2-11e6-a74c-0242ac110001

06:11:24
distributed.core - INFO - Connection from 172.31.35.94:49023 to Scheduler

06:11:24
distributed.core - INFO - Lost connection: ('172.31.35.94', 49023)

06:11:24
distributed.core - INFO - Close connection from 172.31.35.94:49023 to Scheduler

06:11:54
distributed.core - INFO - Connection from 172.31.35.94:49033 to Scheduler

06:11:54
distributed.core - INFO - Lost connection: ('172.31.35.94', 49033)

06:11:54
distributed.core - INFO - Close connection from 172.31.35.94:49033 to Scheduler

我认为这是负载均衡器的问题。当我使用静态IP运行相同的设置时,它工作正常。

任何想法为什么这应该是一个问题?我尝试使用--no-nanny模式运行,我尝试将负载均衡器地址传递给调度程序上的--host,但无济于事。

2 个答案:

答案 0 :(得分:0)

我一直在努力解决同样的问题,这就是我发现的。

您必须在awsvpc网络模式下运行ECS任务,以便ECS为其启动的每个docker容器分配唯一的IP地址。如果查看错误消息,您可以看到工作人员正在从docker内部的地址进行连接

  

distributed.core - INFO - 从172.31.35.94:49023到Scheduler的连接

运行AWS 实例的网络上不存在172.31.35.94 ip,它是docker的内部 - 但是docker容器在不同的机器上运行,因此调度程序无法找到该地址的工人。我还没有找到一种方法告诉dask-worker运行容器的aws实例的外部地址。

因此,我找到的唯一选项是在awsvpc network mode中运行所有任务,在这种情况下,ECS会为每个分配192.168.0.0/24形式的私有IP容器。这样做的问题是您无法再连接到散景仪表板,因为容器IP地址现在是私有的。

因此,您需要另外运行一些NAT服务来隧道从公共网络到您的调度程序的流量。

您需要创建一个安全组(让我们称之为dask)并打开该安全组上的dask端口(8786和短暂端口),至少为容器运行的子网打开在,然后使用该安全组启动调度程序和工作程序任务。

请注意,在下面的日志中,工作人员正在从35000以上的动态端口进行连接,这意味着安全组必须使这些端口至少在子网内保持打开状态。您可以选择将每个工作程序配置为使用--worker-port从特定端口进行连接,然后仅打开该端口。

运行调度程序的容器中的日志应类似于以下enter image description here

答案 1 :(得分:0)

这绝对是阻止实例与ECS之间通信的网络问题。要使负载均衡器运行状况检查通过,您的dask-scheduler安全组必须允许指定端口上的入站流量。确认以下项目:

你的VPC子网是什么?是否与ECS实例使用的相同?

使用动态IP,您可以确认第2层或第3层的工作人员调度程序的端到端通信吗?

如果你对服务端口进行卷曲,你会得到有效的回复吗?

您能否确认您拥有一个有效且正常工作的安全组,并且映射正确?

最后容器代理服务运行正常吗?

EC2文档中提供了最佳AWS ECS任务和AWS Git Developer实例网络设计指南。