我认为罪魁祸首是看起来没有在端口7946上侦听的主人。netstat
表明7946正在侦听节点,而不是主节点。当我检查节点的syslogs时,我看到以下错误
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模式集群;一个主人和两个工人。这是 swarm模式,不要与1.12之前的 docker swarm 混淆。
我使用docker-machine创建了所有服务。每台机器都使用Docker 1.12.3运行Ubuntu 15.10。
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
外部组件(例如云负载平衡器)可以访问群集中任何节点的PublishedPort上的服务,无论该节点当前是否正在运行服务任务。群集中的所有节点都将入口连接到正在运行的任务实例。
但是当我尝试卷曲没有运行任务的节点时,我得到了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
我的问题排查:
更新1
我用
初始化了swarmdocker 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
答案 0 :(得分:3)
我现在能够解决这个问题,但我不知道最初是什么造成的。覆盖网络(端口7946)没有监听swarm-master-01。我用netstat -nlt想出了这个。我搜索了系统日志,发现这些错误与系统日志中的端口有关。
netstandard1.2
出于某种原因,docker拒绝打开此端口并再次收听。以下是我为避免这个问题所做的事情(虽然不可取):
现在除了swarm-master-01之外,所有机器都按预期工作。一个任务是在swarm-node-01上运行,curl通过将流量转发到适当节点上的适当容器来对所有节点起作用。但是,swarm-master-01拒绝侦听覆盖网络,并且curl对此节点不起作用。我只能通过从群集中完全删除swarm-master-01,重新启动docker守护程序并再次作为主服务器加入它来修复它。现在7946正在听那台机器。