理论是灰色的,实践之树长青🌲 ——恩格斯
最近做Docker swarm相关的毕设项目,在worker节点机器上通过docker swarm join,打算将该节点加入Swarm集群时,报Timeout错误,错误如下:
Error response from daemon: Timeout was reached before node joined. The attempt to join the swarm will continue in the background. Use the "docker info" command to see the current swarm status of your node.
Google了几乎所有的解决方案,都是失败的!
失败方案一:关闭防火墙
关闭manger节点和work节点的防火墙都未有效!!
失败方案二:端口未开放
docker swarm join命令如下:
docker swarm join --token SWMTKN-1-419ico69g3t8zlsi2j1w44zo4ecavteo2vyyia13hsscmzd9ct-6rscpxcl7h46cesitk1jlosnl managerIP:2377
查看2377端口是否开放:
root@hecs-x-medium-2-linux-20210315093138:~# netstat -tulp | grep docker
tcp6 0 0 [::]:2377 [::]:* LISTEN 11374/dockerd
tcp6 0 0 [::]:7946 [::]:* LISTEN 11374/dockerd
udp6 0 0 [::]:7946 [::]:* 11374/dockerd
可以看到端口是开放的,这时候去work节点查看telnet命令是否能够连接manger节点成功:
root@host2:~# telnet managerIP 2377
Trying managerIP...
telnet: Unable to connect to remote host: Connection timed out
这时候考虑到telnet命令不能连接成功,那就试一试ping是否通呢?接下来我在两个work节点去ping了一下manger节点:发现都ping不通IP!!!!
既然节点之间都不能ping通,那swarm命令执行失败就能够理解了。
成功方案
在使用ping之后就能想到是不是服务器的安全组设置的是否有问题了??
manager的入规则是不是没有添加ping和telent协议,相关端口是否没有准入??
带着疑惑去查看服务器的安全组规则。
看到以上的入方向规则,发现ping命令使用的ICMP协议根本没有打开,所以没有ping通也就说的通了!!
添加ICMP协议之后的安全组规则如下:
在添加完ICMP协议之后,ping命令就通了!!
那现在我们可以去添加telnet的准入规则,这样的话是不是就意味着我们的swarm join命令也就能通呢?
添加telent协议如下,考虑到之后使用其他协议也会出现这样的问题,所以我在这里添加了所有协议的准入规则:
在添加完安全组规则之后去尝试使用telnet命令连接manager节点服务器:
root@host2:~# telnet managerIP 2377
Trying managerIP...
Connected to managerIP.
Escape character is '^]'.
连接成功!!!
那我们就期待一下swarm join是否成功呢??
重新执行swarm join命令:
root@host1:~# docker swarm join --token SWMTKN-1-419ico69g3t8zlsi2j1w44zo4ecavteo2vyyia13hsscmzd9ct-6rscpxcl7h46cesitk1jlosnl managerIP:2377
This node joined a swarm as a worker.
加入manager节点成功,当前节点作为worker节点使用!!!
总结
在使用服务器的过程中,一定要时刻注意服务器的相关配置,避免踩没必要的坑!!!
欢迎大家一起关注交流学习哈!
个人GitHub:https://github.com/SpecialAll