上一节已经讲了有4种方法可以打通docker跨主机之间的通信。
本文介绍第二种常用的办法:
使用openvswitch打通网络是一种主流的虚拟化技术:
其优点是:
- 灵活
- 对现有物理网络没要求
- 业界主流
缺点是:
- 软件封装导致性能下降
- 复杂度相对较高
- 排错难度高
网络图:
可以看出,针对每个主机ovs创建了一个br0网桥,将docker容器的网卡桥接在br0上面。此时,相当于br0代替了原先docker0网桥的作用,实现主机内容器的互通以及对外网的访问。
针对每个主机,为br0创建了一个ovs port和ovs interface(type 为gre),并设置gre的remote_ip为其它物理主机。实现br0的跨主机连通。则相关的容器也就可以连通了。
补充:
目前来看,基于ovs的跨主机容器通信有两种模式:
1、GRE
2、vxlan
vxlan方式的一个优势是:如果将gre或vxlan比作“网线”的话,对于两台以上主机,比如hostA、hostB和hostC,host之上的container互通只要两根“网线”就行。假设hostA连着hostB,hostB连着hostC,那么hostC上的container自然可以通过hostB找到hostA上的container。而对于GRE方式,则三台主机必须两两连接,此时为集群中添加一台主机则非常麻烦。
环境准备:
两台装有docker的centos7机器,尽量保证docker的版本相同
* 192.168.0.124
* 192.168.0.121
实验:
1、 centos默认没有ovs的rpm包,因此需要自己下载源码包制作。
wget http://openvswitch.org/releases/openvswitch-2.5.0.tar.gz
2、安装必要的依赖环境。一个Base源就搞定了。
yum -y install openssl-devel gcc make python-devel openssl-devel kernel-devel graphviz
kernel-debug-devel autoconf automake rpm-build redhat-rpm-config libtool
3、解压
tar xf openvswitch-2.5.0.tar.gz .
4、创建编译目录
mkdir -p ~/rpmbuild/SOURCES
5、编译:
cp openvswitch-2.5.0.tar.gz rpmbuild/SOURCES/
rpmbuild -bb --without check ~/openvswitch-2.5.0/rhel/openvswitch.spec
6、查看编译好的rpm包:
[root@localhost ~]# ls rpmbuild/RPMS/x86_64/
openvswitch-2.5.0-1.x86_64.rpm openvswitch-debuginfo-2.5.0-1.x86_64.rpm
7、安装openvswitch
rpm -i openvswitch-2.5.0-1.x86_64.rpm
8、拷贝到另一台机器也安装该软件
9、启动服务:
systemctl start openvswitch
10、安装网桥管理工具
yum install bridge-utils -y
11、配置网络,添加br0网桥到docker0。
[root@localhost ~]# ovs-vsctl add-br br0
12、使得容器流量通过ovs流经tunnel,两台主机操作下面的命令是remote_ip写对方主机
[root@localhost ~]# ovs-vsctl add-port br0 gre1 -- set interface gre0 type=gre option:remote_ip=192.168.0.121
13、绑定br0到docker0
[root@localhost ~]# brctl addif docker0 br0
14、
[root@localhost ~]# ip link set dev br0 up
[root@localhost ~]# ip link set dev docker0 up
[root@localhost ~]# iptables -t nat -F ; iptables -F
15、两台主机均执行上述配置,注意IP地址。
16、添加路由:
192.168.0.124添加:
ip route add 172.17.0.0/16 dev docker0
192.168.0.121添加:
ip route add 172.20.0.0/16 dev docker0
17、测试:
分别两台主机运行一个容器。
docker run -it --rm busybox
/ # ping 172.17.0.2
PING 172.17.0.2 (172.17.0.2): 56 data bytes
64 bytes from 172.17.0.2: seq=0 ttl=63 time=0.945 ms
docker run -it --rm busybox
/ # ping 172.20.0.2
PING 172.20.0.2 (172.20.0.2): 56 data bytes
64 bytes from 172.20.0.2: seq=0 ttl=63 time=0.973 ms
64 bytes from 172.20.0.2: seq=1 ttl=63 time=0.508 ms
18、同理要是不通,检查防火墙
闭上眼待琉璃 发布了36 篇原创文章 · 获赞 3 · 访问量 7988 私信 关注