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

问题描述 投票:1回答:2

我们正尝试在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以没有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,但无济于事。

amazon-web-services amazon-ecs dask elastic-load-balancer
2个回答
0
投票

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

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

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

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


0
投票

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

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

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

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

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

最后容器代理服务运行良好吗?

有关EC2文档的最佳AWS ECS任务和AWS Git Developer实例网络设计指南。

© www.soinside.com 2019 - 2024. All rights reserved.