Featured image of post 解决swarm跨节点容器不互通

解决swarm跨节点容器不互通

docker swarm

解决过程

有其他部门的同事找到领导,说他们环境的软件跨节点通信存在问题,因为他们会使用容器的ID(也就是容器的hostname)通信,但是发现连不通,他们自己查了一下完全没有思路,遂来求助我。

我连上服务器,程序是通过docker swarm部署的。

  • 节点

我看了节点状态,都是正常的所以2377端口和7946端口就可以不管了,这俩一个是集群管理端口,一个是节点通讯端口。

  • 网络

再看网络,使用了自定义的overlay网络,我看了下docker_gwbridge、ingress和他们自定义的网络分别使用了172.30.1.1/16、172.40.1.1/24、172.50.1.1/16,这其实是一个槽点,但是因为是内网环境,只要没有冲突理论上也没啥问题,然后手搓了一个脚本分别检测了这几个网段,还真是没有冲突。

然后我看了同节点的容器与容器通信,imcp和tcp通信都蛮好的,http也正常。再试了跨节点通信,imcp都不通

到这里只有一个可能,overlay网络的vxlan可能存在问题,外网下载nc工具,测了下4789的udp,竟然也是通的,说实话这个时候我心凉了一大截。

但是我可以确定的是肯定是vxlan存在问题,然后我删掉了他们的service,把自定义overlay网络占用释放掉,然后删除了自定义的overlay网络,使用默认的ingress也试了下,这个也不行,那大概率还是默认的vxlan端口通信有问题。

  1. 没办法了,从节点依次退出集群,主节点退出集群。
  2. 主节点重建swarm集群并且指定vxlan的端口docker swarm init --advertise-addr=<masterIP> --data-path-addr=<masterIP> --data-path-por=6666,再依次加入节点。
  3. 然后重新建立overlay网络: docker network create <networkName> -d overlay --attachable --subnet=172.29.0.1/16 --gateway=172.29.0.1
  4. 再投递service,发现问题就解决了。

问题原因

我猜测是因为云服务商的网络也是基于 vxlan, 占用了 swarm 默认的 4789 端口,如果不指定端口,会导致集群虽然能组建成功,但是 docker 容器之间如果跨节点网络是不通的,对外的表现就是跨节点的容器不能互相访问。