与Zookeeper的Docker Swarm - 没有选出的主集群管理器

时间:2016-12-10 14:20:31

标签: docker apache-zookeeper docker-swarm

我的任务是使用Zookeeper作为dicovery后端构建一个生产就绪的Swarm集群。我为此目的使用了官方文档,https://docs.docker.com/swarm/install-manual/。关于后端发现,我使用了这个:https://docs.docker.com/swarm/discovery/。现在我有一个问题。当我尝试与swarm通信时,我有这样的错误:没有选出的主集群管理器。

这是我的设置:

我在Ubuntu 16.04上使用docker Client / Server版本1.12.3运行,并且zookeeper 3.4.9在与我的swarm管理器相同的主机中启动。我使用具有一个群管理器和一个群工作者的双节点架构

在每个节点上安装Docker Engine之后

$ nohup docker daemon -H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock &

现在在群体经理上:

$ docker run -d -p 4000:4000 swarm manage -H :4000 --replication --advertise <swarm-manager-ip>:4000 zk://<swarm-manager-ip>/swarm

关于群工:

$ docker run -d swarm join --advertise=<swarm-worker-ip>:2375 zk://<swarm-manager-ip>/swarm

现在,当我试图查看一切是否良好时,我按下面的命令,结果如下。

$ docker -H <swarm-manager-ip>:4000 ps -a
Error response from daemon: No elected primary cluster manager

当我这样做时:

$ docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                              NAMES
91c3864ba6ee        swarm               "/swarm manage -H :40"   17 hours ago        Up 19 minutes       2375/tcp, 0.0.0.0:4000->4000/tcp   swarm-master

我可以看到swarm master,当我尝试查看swarm节点的日志时,我可以看到:

$ docker logs 91c3864ba6ee
time="2016-12-09T20:29:39Z" level=info msg="Initializing discovery without TLS" 
time="2016-12-09T20:29:39Z" level=info msg="Listening for HTTP" addr=":4000" proto=tcp 
time="2016-12-09T20:29:39Z" level=info msg="Leader Election: Cluster leadership lost" 
2016/12/09 20:29:40 Failed to connect to <swarm-manager-ip>:2181: dial tcp <swarm-manager-ip>:2181: i/o timeout
time="2016-12-09T20:29:40Z" level=error msg="zk: could not connect to a server" 
time="2016-12-09T20:29:40Z" level=error msg="zk: could not connect to a server" 
time="2016-12-09T20:29:40Z" level=error msg="Discovery error: zk: could not connect to a server" 
2016/12/09 20:29:42 Failed to connect to <swarm-manager-ip>:2181: dial tcp <swarm-manager-ip>:2181: i/o timeout
time="2016-12-09T20:29:42Z" level=error msg="Discovery error: zk: could not connect to a server" 
2016/12/09 20:29:44 Failed to connect to <swarm-manager-ip>:2181: dial tcp <swarm-manager-ip>:2181: i/o timeout
time="2016-12-09T20:29:44Z" level=error msg="Discovery error: zk: could not connect to a server" 
time="2016-12-09T20:29:44Z" level=error msg="Discovery error: Unexpected watch error" 
2016/12/09 20:29:46 Failed to connect to <swarm-manager-ip>:2181: dial tcp <swarm-manager-ip>:2181: i/o timeout
2016/12/09 20:29:48 Failed to connect to <swarm-manager-ip>:2181: dial tcp <swarm-manager-ip>:2181: i/o timeout
time="2016-12-09T20:29:50Z" level=info msg="Leader Election: Cluster leadership lost" 
2016/12/09 20:29:50 Failed to connect to <swarm-manager-ip>:2181: dial tcp <swarm-manager-ip>:2181: i/o timeout
time="2016-12-09T20:29:50Z" level=error msg="zk: could not connect to a server" 
time="2016-12-09T20:29:50Z" level=error msg="zk: could not connect to a server" 

但是一个简单的telnet命令告诉我,我的zookeeper主机正在工作。那么当swarm尝试连接到zookeeper发现后端时,如何进行i / o超时?

1 个答案:

答案 0 :(得分:1)

正如评论中所提到的,自Swarm mode以来,有一个名为1.12的新版本嵌入了Docker。它包含一个内置的高可用分布式对象存储,因此您不必自己设置外部KV存储。

现在关于你第一版Swarm的问题,有一条引起了我的注意:

2016/12/09 20:29:50 Failed to connect to <swarm-manager-ip>:2181: dial tcp <swarm-manager-ip>:2181: i/o timeout

对我而言,似乎zookeeper没有在你的机器上运行,或者你没有指向正确的端口。

首先检查zookeeper是否在您的计算机上运行:

ps aux | grep zookeeper

您应该看到一个进程正在运行。

如果没有,请确保在zookeeper安装的zoo.cfg目录中创建一个conf文件,指定正确的端口,例如:

tickTime=2000
dataDir=/var/zookeeper
clientPort=2181

您可以查看This Tutorial来引导动物园管理员。

在此之后,您可以运行zkStart.sh脚本来启动您的zookeeper实例,swarm现在应该能够正确连接并注册Leader密钥。

如果仍然无效,请尝试降级到zookeeper 3.4.6,因为这是自切换到Docker Swarm Mode以来最后一个已知的受支持版本。