今天分享一下容器跨主机通信的解决方案。容器跨主机的原生解决方案有overlay和macvlan,第三方的解决方案常用的包括 flannel、weave 和 calico。这篇文章主要分享一下我对overlay方案的理解。
overlay的实现是通过不同vxlan形成隧道,把不同主机连接在一起,实现跨主机通信。今天的我们用docker17版本进行实验,共需要3台虚拟机,一台用作配置consul环境,另外两台用作主机之间的通信。
在一台虚拟机上启动consul容器
![](https://i-blog.csdnimg.cn/blog_migrate/c4e5cc9a6ac653df350dd0330eae9ed1.png)
通用192.168.216.51:8500web页面可以查看consul环境
在host1和host2上配置连接consul数据库的信息,/usr/lib/systemd/system/docker.service
![](https://i-blog.csdnimg.cn/blog_migrate/77a820a3e4a6a7bc646d46b31d16e0cd.png)
![](https://i-blog.csdnimg.cn/blog_migrate/4238c56c7289285bbc00eed7ff574ca7.png)
![](https://i-blog.csdnimg.cn/blog_migrate/fbe532dba9f9c4e1a53cfa30e0b29ea8.png)
![](https://i-blog.csdnimg.cn/blog_migrate/366b7f745223554f8c7e26f365875bb4.png)
docker run -itd --name centos1 --network ov_net1 centos:7.6.1810
可以看到容器已经运行起来,为了后续显示容器的网络信息,在容器内安装iproute和net-tools软件包
可以看到容器centos1的网络信息和路由信息
从上图中我们可以看到容器有eth0和eth1两张网卡,eth0的IP为10.0.0.2,eth1的IP为172.18.0.2,容器的默认路由是走eth1,那么eth1是怎么生成的,我们接着往下看
查询docker_gwbridge可以看到相关的网络信息,子网为172.18.0.0/16,网关为172.18.0.1,同时从上一张图中我们可以看到容器的eth1的IP为172.18.0.2。接下来我们查看容器访问www.baidu.com的路由信息,可以看到容器会经过172.18.0.1 和192.168.216.2,其中172.18.0.1即为docker_gwbridge,这说明docker_gwbridge,为所有连接到 ov_net1(overlay)网络的容器提供访问外网的能力。
在host2运行一个 centos容器,名字为centos2,使用 ov_net1网络:
docker run -itd --name centos2 --network ov_net1 centos:7.6.1810
现在测试host1上容器centos1和host2上容器centos2通信情况
通过ip netns可以查看容器的命名空间,ln -s /var/run/docker/netns /var/run/netns创建软连接,可以看到有两个netns,id:1和id:0
查看id:0 netns中网络信息
查看id:1 netns中网络信息,对比容器的网络信息可以确定该命名空间是容器centos1的
查看host1的网络信息
在host1上查看vxlan id是256
在host2上查看vxlan id是256
说明host1和host2的ov_net1通过vxlan id=256实现主机通信。
接下来我们分析一下跨主机通信网络流量走向,图2中可以看到容器centos1的eth0的IP为10.0.0.2,eth0的对端设备是8号---看图1,8号设备是veth0---veth0的master是br0--图1的6号设备vxlan0--host2容器centos2的br0的vxlan0
再看一下容器centos1访问外网的流量走向,看图2的9号设备,对端是10号设备---看到图3,10号设备是vethf85ef---docker_gwbridge---3号设备,ens33---出网
借助的下面的简图可以很好的理解,图中的bbox1和bbox2是不同主机上的容器