问题描述
线上有三台服务器,组成一个manager, 两个worker的docker swarm集群。
在把两台新的线上机器加入到集群时遇到以下问题:
- 打到新机器的服务无法注册到部署到原有机器上的eureka, 反之,如果eureka打到新机器上,原有机器上的服务也无法注册到eureka.
总之,机器加入swarm cloud做作worker node没问题。
服务部署也没问题。
只有服务结点之间相互调用时的通讯有问题。
com.netflix.discovery.shared.transport.TransportException: Cannot execute request on any known server
新结点加入docker swarm cluster的流程
参考文档:tbd
可能问题
- 布署应用前创建的overlay网络,没有在新结点上生效
docker swarm中部署服务前需要为服务创建新的overlay网络,并在docker-compose-swarm.yml部署文件里指定各个服务都使用这个网络。
猜测加入新结点时,overlay网络己经创建。
删除原有stack服务及网络,重新创建overlay网络,部署服务。
问题没有解决。
- 虚拟机底层平台的问题
搜到以下文章:
https://blog.csdn.net/pyktpykt/article/details/84589235
虽然我们的虚拟机不是基于nsx平台。但是这里我获得到了一个信息:
docker swarm cluster各结点间通信依赖于三个端口2377, 7946,4789
其中:
tcp端口2377为集群管理端口
tcp与udp端口7946为节点之间通讯端口
tcp与udp端口4789为overlay网络通讯端口(overlay网络为二层与三层之间新型通讯技术)
进一步检查了一下这三个端口在新旧机器上的开启情况:
netstat -tulnp|grep 4789
这一端口只在旧机器上开启了,两台新机器上未开启。
最终解决
我们机器上使用的是iptable,所以在iptable里加上以下端口:
iptables -A INPUT -p tcp --dport 2377 -j ACCEPT
iptables -A INPUT -p tcp --dport 7946 -j ACCEPT
iptables -A INPUT -p udp --dport 7946 -j ACCEPT
iptables -A INPUT -p tcp --dport 4789 -j ACCEPT
iptables -A INPUT -p udp --dport 4789 -j ACCEPT
service iptables save
同时需要确保firewalld关闭
systemctl stop firewalld
如果只用了firewalld,做如下配置:
# firewall-cmd --add-port=2377/tcp --permanent
# firewall-cmd --add-port=7946/tcp --permanent
# firewall-cmd --add-port=7946/udp --permanent
# firewall-cmd --add-port=4789/tcp --permanent
# firewall-cmd --add-port=4789/udp --permanent
# firewall-cmd --reload