【问题标题】:Docker swarm mode load balancing not working as describedDocker swarm 模式负载平衡未按描述工作
【发布时间】:2017-03-23 11:13:57
【问题描述】:

更新

我认为罪魁祸首是似乎没有在端口 7946 上监听的主节点。netstat 表明 7946 正在节点上监听,但不是主节点。当我检查节点的系统日志时,我看到以下错误

level=error msg="Failed to join memberlist [10.0.0.12] on retry: 1 error(s) occurred:\n\n* Failed to join 10.0.0.12: dial tcp 10.0.0.12:7946: getsockopt: connection refused"

原帖

我在 AWS 中运行一个三节点 Swarm Mode 集群;一名师傅和两名工人。这是 swarm 模式,不要与 1.12 之前的 docker swarm 混淆。

我使用 docker-machine 创建了所有服务。每台机器都运行 Ubuntu 15.10 和 Docker 1.12.3。

Linux swarm-master-01 4.2.0-42-generic #49-Ubuntu SMP Tue Jun 28 21:26:26 UTC 2016 x86_64 x86_64 x86_64 GNU/Linux

使用主节点,我创建了一个具有以下内容的服务

docker service create --replicas 1 --name myapp -p 3000 myapp

当我运行 docker service ps myapp 时,我得到以下输出

ID                         NAME     IMAGE         NODE             DESIRED STATE  CURRENT STATE            ERROR
02awst8p9pezgpkfzqgz8z79t  myapp.1  myapp:latest  swarm-node-01    Running        Running 19 minutes ago

正在运行的任务部署到 swarm-node-01。

我检查了公开发布的自动选择端口

$ docker service inspect myapp | jq .[].Endpoint.Ports[].PublishedPort
30000

根据documentation:

外部组件(例如云负载平衡器)可以访问集群中集群中任何节点的 PublishedPort 上的服务,无论该节点当前是否正在运行该服务的任务。 swarm 中的所有节点将入口连接路由到正在运行的任务实例。

但是当我尝试卷曲没有运行任务的节点时,我得到connection refused。

$ curl $(docker-machine ip swarm-node-01):30000/stats
{"uptime":"2016-11-09T14:48:35Z","requestCount":7,"statuses":{"200":7},"pid":1,"open_db_conns":0}

$ curl $(docker-machine ip swarm-node-02):30000/stats
curl: (7) Failed to connect to [the IP] port 30000: Connection refused

注意:我清理了 node-02 的 IP


我的疑难解答:

  • 节点都正确连接到集群
  • 将服务扩展到 5 个(本质上将任务部署到每个节点)使 curl 在每个节点上工作,因为任务被部署到每个节点。

更新 1

我用

初始化了 swarm
docker swarm init --advertise-addr 10.0.0.12:2377 --listen-addr 10.0.0.12:2377

我从节点检查了系统日志,发现以下错误

level=error msg="Failed to join memberlist [10.0.0.12] on retry: 1 error(s) occurred:\n\n* Failed to join 10.0.0.12: dial tcp 10.0.0.12:7946: getsockopt: connection refused"

我检查了入口端口是否正在侦听,但似乎没有

ubuntu@swarm-master-01:~$ sudo lsof -i :7946
ubuntu@swarm-master-01:~$ cat < /dev/tcp/10.0.0.12/7946
-bash: connect: Connection refused
-bash: /dev/tcp/10.0.0.12/7946: Connection refused
ubuntu@swarm-master-01:~$ cat < /dev/tcp/0.0.0.0/7946
-bash: connect: Connection refused
-bash: /dev/tcp/0.0.0.0/7946: Connection refused

【问题讨论】:

  • 你运行的是什么版本的 Docker?能否连接到节点 2 并检查netstat -lnt 以查看端口是否正在侦听?
  • 你用什么命令来发起和加入swarm?您使用的是什么操作系统?
  • 我用我做过的其他事情更新了帖子
  • netstat -lnt 显示 7946 正在侦听节点,而不是主节点。节点系统日志显示 level=error msg="Failed to join memberlist [10.0.0.12] on retry: 1 error(s) occurred:\n\n* Failed to join 10.0.0.12: dial tcp 10.0.0.12:7946: getsockopt: connection refused"
  • 加入什么命令?什么操作系统? 30000 端口在监听吗?

标签: docker docker-swarm


【解决方案1】:

我现在能够解决这个问题,但我不知道最初是什么原因造成的。覆盖网络(端口 7946)没有在 swarm-master-01 上监听。我用 netstat -nlt 解决了这个问题。我搜索了系统日志,发现这些错误与系统日志中的端口有关。

Nov  8 20:28:20 ubuntu docker[23092]: time="2016-11-08T20:28:20.171385360Z" level=warning msg="2016/11/08 20:28:20 [ERR] memberlist: Failed TCP fallback ping: read tcp 10.0.0.85:54016->10.0.0.13:7946: i/o timeout"
Nov  9 18:26:17 swarm-node-01 docker[714]: time="2016-11-09T18:26:17.573441271Z" level=warning msg="2016/11/09 18:26:17 [ERR] memberlist: Failed to send indirect ping: write udp [::]:7946->10.0.0.38:7946: use of closed network connection"

出于某种原因,docker 拒绝打开此端口并继续侦听。这是我为规避问题所做的(尽管不受欢迎):

  1. 使用名为 swarm-master-02 的 docker-machine 创建了另一个节点
  2. 将 swarm-master-02 作为主节点加入集群
  3. 将master-01降级,将master-02设置为leader
  4. 在每个节点上重新启动了 docker 守护进程(可能没有必要)

现在所有机器都按预期工作,除了 swarm-master-01。一项任务在 swarm-node-01 上运行,curl 通过将流量转发到适当节点上的适当容器来针对所有节点工作。但是,swarm-master-01 拒绝在覆盖网络上侦听,并且 curl 不适用于该节点。我只能通过将 swarm-master-01 从集群中完全删除、重新启动 docker 守护程序并再次将其作为 master 加入来修复 swarm-master-01。现在 7946 正在那台机器上监听。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-10-12
    • 1970-01-01
    • 2017-11-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-19
    相关资源
    最近更新 更多