docker容器跨主机通信-openvswitch

概述

容器比较火,单机的容器创建和使用比较容易,但是为了搭建集群,需要跨主机部署,那么跨主机的容器网络通信就需要解决了。我找到一些方案,先说下openvswitch的方案。

部署

1.环境准备
首先准备3台机器,我这边直接使用虚拟机了。ip分别为192.168.1.4,192.168.1.5,192.168.1.6系统为ubuntu 18.04
2.安装docker
curl -sSL https://get.daocloud.io/docker | sh
3.为了保证每个主机的docker网络不一样,所以需要修改docker的配置信息。信息分别为

cat /etc/docker/daemon.json
{ "bip": "172.17.4.1/24" }
{ "bip": "172.17.5.1/24" }
{ "bip": "172.17.6.1/24" }

4.重启docker使其生效

systemctl restart docker
ip a s docker0

5.安装openvswitch

apt-get install openvswitch-switch

6.创建ovs bridge

ovs-vsctl add-br br0 
ifconfig 

7.设置gre端口,这里显示的是192.168.1.4的。192.168.1.5的需要把对应的ip改为1.4

ovs-vsctl add-port br0 gre0 -- set interface gre0 type=gre option:remote_ip=192.168.1.5
brctl addif docker0 br0 
ip link set dev br0 up 
ip link set dev docker0 up 
ip route add 172.17.0.0/16 dev docker0

8.启动容器测试

docker run -d -n test1 nginx

9.ping虚拟机测试

root@i-2vrkt8l5:~# docker inspect test1|grep IPAddress
            "SecondaryIPAddresses": null,
            "IPAddress": "172.17.5.2",
                    "IPAddress": "172.17.5.2",
root@i-2vrkt8l5:~# docker exec -it test1 bash
root@4fa7f65caa88:/# ping 172.17.4.2
PING 172.17.4.2 (172.17.4.2): 56 data bytes
64 bytes from 172.17.4.2: icmp_seq=0 ttl=63 time=0.946 ms

发现已经可以访问了。

解释

其实这里就是通过ovs创建了gre隧道,通过gre来处理跨主机的数据包,但是你会发现如果相和第三台主机通信的话,就需要在其中一台上新搭建一个点对点的隧道,使所有机器是一个形成一个闭环。
在192.168.1.4上新创建隧道:

ovs-vsctl add-br br1
ovs-vsctl add-port br1 gre1 -- set interface gre1 type=gre option:remote_ip=192.168.1.6
brctl addif docker0 br1
ip link set dev br1 up

这样192.168.1.6去ping192.168.1.5上的容器时,需要经过192.168.1.4。

这里会有一定的问题,不仅是性能上,而且如果192.168.1.4down了,那么网络都无法正常通信了。所以这个方式可能会有一定的缺点。

推荐阅读更多精彩内容