【问题标题】:Docker swarm node unable to detect service from another host in swarmDocker swarm 节点无法检测到来自 swarm 中另一台主机的服务
【发布时间】:2018-02-23 11:03:06
【问题描述】:

我的目标是在一组 3 个 linux (ubuntu) 物理工作站上设置一个 docker swarm,并在其上运行一个 dask 集群。

$ docker --version
Docker version 17.06.0-ce, build 02c1d87

我能够初始化 docker swarm 并将所有机器添加到 swarm。

cordoba$ docker node ls
ID                            HOSTNAME    STATUS    AVAILABILITY MANAGER STATUS
j8k3hm87w1vxizfv7f1bu3nfg     box1        Ready     Active              
twg112y4m5tkeyi5s5vtlgrap     box2        Ready     Active              
upkr459m75au0vnq64v5k5euh *   box3        Ready     Active              Leader

然后我在领导框上运行docker stack deploy -c docker-compose.yml dask-cluster

这里是docker-compose.yml

version: "3"

services:

  dscheduler:
    image: richardbrks/dask-cluster
    ports:
     - "8786:8786"
     - "9786:9786"
     - "8787:8787"
    command: dask-scheduler
    networks:
      - distributed
    deploy:
      replicas: 1
      restart_policy:
        condition: on-failure
      placement:
        constraints: [node.role == manager]

  dworker:
    image: richardbrks/dask-cluster
    command: dask-worker dscheduler:8786
    environment:
      - "affinity:container!=dworker*"
    networks:
      - distributed
    depends_on:
      - dscheduler
    deploy:
      replicas: 3
      restart_policy:
        condition: on-failure

networks:
  distributed:

这里是richardbrks/dask-cluster:

# Official python base image
FROM python:2.7    
# update apt-repository
RUN apt-get update
# only install enough library to run dask on a cluster (with monitoring)
RUN pip install --no-cache-dir \
    psutil \
    dask[complete]==0.15.2 \
    bokeh

当我部署 swarm 时,dworker 节点与 dscheduler 不在同一台机器上 不知道dscheduler 是什么。我 ssh 进入这些节点之一并查看了环境, dscheduler 不在那里。我还尝试 ping dscheduler,并得到“ping:未知主机”。

我认为 docker 应该提供基于内部 dns 的服务发现 这样调用dscheduler 会将我带到dschedler 节点的地址。

我的计算机上是否有一些我缺少的设置?还是我的任何文件丢失了什么?

所有这些代码也位于https://github.com/MentalMasochist/dask-swarm

【问题讨论】:

  • 您能否描述一下您是如何尝试访问其他服务的?你是在 dworker 容器里面做的吗?
  • @herm 是的。我通过 ssh 进入运行 dworker 节点的计算机,使用 docker ps 获取运行容器的 id,然后键入 docker exec -ti <docker id> /bin/bash 进入节点。这就是我尝试 ping dscheduler 的地方。
  • 您混淆了术语。 swarm 中的一个节点是一台计算机。使用 docker exec 你输入一个容器而不是一个节点。你用了错误的名字,但做了正确的事:)
  • 我检查了,你的设置工作正常,我可以在不同的机器上从工作人员远程登录到调度程序

标签: docker docker-swarm dask docker-swarm-mode dask-distributed


【解决方案1】:

根据群里this issue

由于一些网络限制(我认为与虚拟 IPs),ping 工具不适用于覆盖网络。你是 可以使用 dig 等其他工具解析的服务名称?

就我个人而言,我总是可以使用 curl 从一项服务连接到另一项服务。您的设置似乎正确,您的服务应该能够通信。


swarm 不支持 FYI 依赖


更新 2:我认为您没有使用该端口。 Servicename 不能替代端口。您需要使用容器内部知道的端口。

【讨论】:

  • 我在容器中安装并运行了 dig,但是得到了 NXDOMAIN 错误,这意味着它找不到主机。您的问题链接显示了无法连接其他主机上的其他服务的其他一些可能原因。我会阅读这个问题,看看他们的任何建议是否能解决我的问题。另外,感谢您通知我depends_on
  • Tarun Lalwani 确认您的撰写文件是正确的。您用于连接容器的确切命令是什么?对于 curl,它将是: curl dscheduler:8786/path
  • 容器 dworker 应该从 compose 文件中的命令 dask-worker dscheduler:8786 连接到 dscheduler,其中 dscheduler 应该是调度程序的 ip,8786 是端口。这能回答你的问题吗?
  • 是的。你能通过IP到达另一台机器吗?可能端口未打开或防火墙正在干预。
  • 发现问题:我们办公室路由器的固件有问题。一旦我回到之前的固件版本,一切正常。 @herm:感谢您的帮助!
【解决方案2】:

dask 或 docker swarm 没有任何问题。问题是路由器固件不好。在我回到之前版本的路由器固件后,集群运行良好。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多