我们正尝试在AWS上使用ECS启动一个dask集群。我们目前的设置:
不幸的是,我运气不好。我收到这些日志消息:
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
,但无济于事。
答案 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
从特定端口进行连接,然后仅打开该端口。
答案 1 :(得分:0)
这绝对是阻止实例与ECS之间通信的网络问题。要使负载均衡器运行状况检查通过,您的dask-scheduler安全组必须允许指定端口上的入站流量。确认以下项目:
你的VPC子网是什么?是否与ECS实例使用的相同?
使用动态IP,您可以确认第2层或第3层的工作人员调度程序的端到端通信吗?
如果你对服务端口进行卷曲,你会得到有效的回复吗?
您能否确认您拥有一个有效且正常工作的安全组,并且映射正确?
最后容器代理服务运行正常吗?
EC2文档中提供了最佳AWS ECS任务和AWS Git Developer实例网络设计指南。