Docker swarm模式负载平衡未按说明工作 更新

Docker swarm模式负载平衡未按说明工作 更新,docker,docker-swarm,Docker,Docker Swarm,我相信罪魁祸首是船长,他似乎没有在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"

我相信罪魁祸首是船长,他似乎没有在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中运行一个三节点群集模式集群;一个师傅和两个工人。这是群集模式不要与1.12之前的docker swarm相混淆

我用docker机器创建了所有的服务。每台机器都运行Ubuntu15.10和Docker1.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服务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上的服务,无论该节点当前是否正在运行该服务的任务。swarm中的所有节点将入口连接路由到正在运行的任务实例

但是,当我尝试卷曲没有运行任务的节点时,连接被拒绝了

$ 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

我用

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
ubuntu@swarm-master-01:~$sudo lsof-i:7946
ubuntu@swarm-master-01:~$cat
我现在能够避开这个问题,但我不知道最初是什么导致了它。覆盖网络(端口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拒绝打开此端口并继续侦听。以下是我为规避这个问题所做的(尽管不可取):

  • 使用名为swarm-master-02的docker机器创建了另一个节点
  • 将swarm-master-02作为主机加入集群
  • 降级的master-01,将master-02设置为领导者
  • 在每个节点上重新启动docker守护程序(可能没有必要)

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

    你在运行什么版本的Docker?您能否连接到节点2并检查
    netstat-lnt
    以查看端口是否正在侦听?您使用了哪些命令来启动和加入swarm?你用的是什么操作系统?我用我做过的一些其他事情更新了帖子-lnt显示7946正在监听节点,但不是主机。节点系统日志在重试时显示
    level=error msg=“未能加入成员列表[10.0.0.12]:出现1个错误:\n\n*未能加入10.0.0.12:拨号tcp 10.0.0.12:7946:getsockopt:连接被拒绝”
    要加入的命令是什么?什么操作系统?30000端口正在监听吗?