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 以无参数启动。

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


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调度程序,但无济于事。

4

2 回答 2

0

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

您的 VPC 子网是什么?和ECS实例使用的一样吗?

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

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

您能否确认您有一个有效且有效且映射正确的安全组?

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

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

于 2018-03-01T10:33:14.193 回答
0

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

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

Distributed.core - 信息 - 从 172.31.35.94:49023 到调度程序的连接

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

所以,我发现的唯一选择是在awsvpc 网络模式下192.168.0.0/24运行所有​​任务,在这种情况下,ECS 会为每个容器分配一个私有 IP 形式。问题在于您无法再连接到散景仪表板,因为容器 IP 地址现在是私有的。

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


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

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

运行调度程序的容器中的日志应类似于以下内容在此处输入图像描述

于 2018-02-19T16:21:45.820 回答