我的任务是使用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超时?
答案 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
以来最后一个已知的受支持版本。