OpenvSwitch实现多主机间通信
2019-01-24 本文已影响0人
aneirin
单个主机上容器之间如果要实现网络互通比较容易实现,一种常见做法是把需要通信的容器网络接口桥接到相同的主机网络接口,这样容器就处在相同的广播域,它们的网络地址是由Docker来负责分配管理,所以会获得同一网段的IP地址,网络互通所需的条件全部满足。
当容器处在不同的主机,情况就大不相同,因为主机的网络环境隔离了容器的网络环境,此时要实现网络互通,就需要做更多的工作。本文依赖OpenvSwitch实现多主机容器间网络通信。
1,使用GRE接口
实验拓扑如下:
gre-ovs.png
用比较通俗的说法解释上图,Host 1上的Container 1连接交换机docker0,docker0连接路由器ovs-br,Host 2上的Container2同理。然后两台路由器ovs-br通过GRE隧道相连。用隧道的原因是容器间的流量必须承载在Host 1和Host 2的网络之上。
配置Host 1:
docker run -d --name container1 centos /bin/bash -c "while true; do sleep 3600; done" #启动测试容器
ovs-vsctl add-br ovs-br #添加桥接设备ovs-br
ip link add veth0 type veth peer name veth1 #创建veth设备对
ovs-vsctl add-port ovs-br veth1 #veth1接入ovs-br
brctl addif docker0 veth0 #veth0接入docker0
ip link set veth1 up #启动veth1
ip link set veth0 up #启动veth0
#配置GRE隧道,接口为gre0,remote_ip为Host 2的主机IP
ovs-vsctl add-port ovs-br gre0 -- set interface gre0 type=gre options:remote_ip= 10.1.48.2
配置Host 2(为了避免和Host 1上Container 1上的IP地址冲突,可以启动两个容器,将第二个启动的容器作为Container2)
docker run -d --name container2 centos /bin/bash -c "while true; do sleep 3600; done"
ovs-vsctl add-br ovs-br
ip link add veth0 type veth peer name veth1
ovs-vsctl add-port ovs-br veth1
brctl addif docker0 veth0
ip link set veth1 up
ip link set veth0 up
ovs-vsctl add-port ovs-br gre0 -- set interface gre0 type=gre options:remote_ip= 10.1.48.3
配置完毕后,进入Container 1,ping测试Container 2发现是可以ping通的。
2,使用VxLAN接口
拓扑如下
vxlan-ovs.png
这次直接把docker自带的网桥docker0去掉,因为它本不是必需的。
ovs-vsctl add-br ovs-br
ifconfig ovs-br 192.168.8.1/24
# 在ovs-br开一个VxLAN类型的端口vxlan,remote_ip为Host 2的eth0 IP地址
ovs-vsctl add-port ovs-br vxlan -- set interface vxlan type=vxlan options:remote_ip=10.1.48.36
#启动一个容器,不使用默认网桥设备
docker run --net=none --privileged=true -it ubuntu
# ovs-docker是一个ovs的docker辅助脚本,如果通过源码编译安装OpenvSwitch,这个脚本会一并安装
# 将ovs-br上的接口eth0与容器a8706151885d绑定
ovs-docker add-port ovs-br eth0 a8706151885d
#在Container 1内执行
ifconfig eth0 192.168.8.2/24
Host 2上的配置类似,ovs-br的IP地址设置为192.168.8.4,容器内eth0的IP地址配置为192.168.8.3
配置完毕后,在Host 1的容器里面 ping测试Host 2上的容器,发现是通的。ping测试的同时,在Host 2的网卡eth0抓下包,可以看到VxLAN的身影,如下图所示:
关于VxLAN的详情,可参考https://tools.ietf.org/html/rfc7348