【工作问题】docker swarm新worker node与原有node无法通讯

问题描述

线上有三台服务器,组成一个manager, 两个worker的docker swarm集群。

在把两台新的线上机器加入到集群时遇到以下问题:

  1. 打到新机器的服务无法注册到部署到原有机器上的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

你可能感兴趣的:(【工作问题】docker swarm新worker node与原有node无法通讯)