Docker群模式负载平衡不能像所描述的那样工作

时间:2016-11-09 15:23:22

标签: docker docker-swarm

更新

我认为罪魁祸首是看起来没有在端口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

根据documentation

  

外部组件(例如云负载平衡器)可以访问群集中任何节点的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

我的问题排查:

  • 节点都正确连接到群组
  • 将服务扩展到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

1 个答案:

答案 0 :(得分:3)

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

netstandard1.2

出于某种原因,docker拒绝打开此端口并再次收听。以下是我为避免这个问题所做的事情(虽然不可取):

  1. 使用名为swarm-master-02
  2. 的docker-machine创建另一个节点
  3. 将swarm-master-02作为主人加入集群
  4. 降级master-01,将master-02设为领导者
  5. 在每个节点上重新启动docker守护程序(可能没有必要)
  6. 现在除了swarm-master-01之外,所有机器都按预期工作。一个任务是在swarm-node-01上运行,curl通过将流量转发到适当节点上的适当容器来对所有节点起作用。但是,swarm-master-01拒绝侦听覆盖网络,并且curl对此节点不起作用。我只能通过从群集中完全删除swarm-master-01,重新启动docker守护程序并再次作为主服务器加入它来修复它。现在7946正在听那台机器。