Docker使用overlay网络遇到的问题

一般我们使用Overlay网络都是涉及到多台主机中的Docker容器通信问题。

Docker Overlay 一切准备就绪后,使用docker-compose 启动容器。

在一个业务服务的容器日志里面发现无法连接的Zookeeper,错误是:

1
java.net.NoRouteToHostException: No route to host

在容器中尝试ping 10.0.0.3 容器,发现不通:

1
2
3
4
PING zookeeper (10.0.0.3) 56(84) bytes of data.
From 85789ac6e6a8 (10.0.0.8) icmp_seq=1 Destination Host Unreachable
From 85789ac6e6a8 (10.0.0.8) icmp_seq=2 Destination Host Unreachable
From 85789ac6e6a8 (10.0.0.8) icmp_seq=3 Destination Host Unreachable

刚开始查询了一些资料后,以为是防火墙(CentOS7)问题,于是查看了防火墙状态:

1
firewall-cmd --state

结果防火墙压根没开:

1
not running

由于之前没有详细查看docker overlay网络的使用限制,一直以为只要docker的版本保持在1.9.1+就可以了。后来又查了下,发现还有一个限制:内核版本大于等于3.16。于是赶紧查看了下内核版本:

1
2
# uname -r
3.10.0-514.10.2.el7.x86_64

果然内核版本低了,于是开始升级内核。

导入elrepo的key,然后安装elrepo的yum源:

1
2
sudo rpm -import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org
sudo rpm -Uvh http://www.elrepo.org/elrepo-release-7.0-2.el7.elrepo.noarch.rpm

列出可用的内核相关包:

1
yum --disablerepo="*" --enablerepo="elrepo-kernel" list available

lt为长期维护版本,mt为稳定版本,可以看到最新的稳定版本为:

1
5.2.10-1.el7.elrepo

开始升级内核(以后可以直接执行这句):

1
sudo yum -y --enablerepo=elrepo-kernel install kernel-ml.x86_64 kernel-ml-devel.x86_64 

升级完后需要重启一下:

1
reboot

再次查看内核:

1
2
uname -r
3.10.0-514.10.2.el7.x86_64

WTF,为什么还是老的?原来是启动的时候还是默认选择了老的内核,这里需要重新设置一下启动时的默认内核:

首先查看当前都有哪些启动项:

1
2
3
4
cat /boot/grub2/grub.cfg |grep menuentry

menuentry 'CentOS Linux (5.2.10-1.el7.elrepo.x86_64) 7 (Core)' --class centos --class gnu-linux --class gnu --class os --unrestricted $menuentry_id_option 'gnulinux-3.10.0-514.6.2.el7.x86_64-advanced-07151862-c2b9-45dc-bf7a-af8d2a6fa6c1' {
menuentry 'CentOS Linux (3.10.0-514.10.2.el7.x86_64) 7 (Core)' --class centos --class gnu-linux --class gnu --class os --unrestricted $menuentry_id_option 'gnulinux-3.10.0-514.6.2.el7.x86_64-advanced-07151862-c2b9-45dc-bf7a-af8d2a6fa6c1' {

设置默认选项(需要升级为root用户):

1
grub2-set-default 'CentOS Linux (5.2.10-1.el7.elrepo.x86_64) 7 (Core)'

再次重启,重启后查看内核:

1
2
uname -r
5.2.10-1.el7.elrepo.x86_64

OK,内核成功升级,再次启动Docker试试(别忘了启动服务发现,我这里是ETCD):

ETCD启动:

1
./etcd --name docker-node3 --initial-advertise-peer-urls http://10.208.10.17:2380 --listen-peer-urls http://10.208.10.17:2380 --listen-client-urls http://10.208.10.17:2379,http://127.0.0.1:2379 --advertise-client-urls http://10.208.10.17:2379 --initial-cluster-token etcd-cluster --initial-cluster docker-node1=http://10.208.10.14:2380,docker-node2=http://10.208.10.16:2380,docker-node3=http://10.208.10.17:2380 --initial-cluster-state new &

Docker 启动:

1
sudo /usr/bin/dockerd -H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock --cluster-store=etcd://10.208.10.14:2379 --cluster-advertise=10.208.10.14:2375 &

当所有主机都完成上述操作时,发现容器间总算可以互通了。

其他问题:

1
error locating sandbox id c43437e6300a0c6ea20d2d9f95bbe318e557d1eedfa585ab5218345eeef32a36: sandbox c43437e6300a0c6ea20d2d9f95bbe318e557d1eedfa585ab5218345eeef32a36 not found 
1
could not get network sandbox (oper true): failed get network namespace ""

最好删除之前创建的network和container,否则可能出现其他问题。

不同主机上的容器间使用hostname或者container name通信好像有问题,可以使用docker swarm来解决。

参考资料:

https://www.centos.bz/2017/08/upgrade-centos-7-6-kernel-to-4-12-4/

Docker使用overlay网络遇到的问题

https://jingzhouzhao.github.io/archives/1c99e54f.html

作者

太阳当空赵先生

发布于

2019-08-27

更新于

2022-02-22

许可协议

评论