美文网首页
OpenvSwitch实现多主机间通信

OpenvSwitch实现多主机间通信

作者: aneirin | 来源:发表于2019-01-24 10:46 被阅读0次

单个主机上容器之间如果要实现网络互通比较容易实现,一种常见做法是把需要通信的容器网络接口桥接到相同的主机网络接口,这样容器就处在相同的广播域,它们的网络地址是由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的身影,如下图所示:

ovs-pcap.png
关于VxLAN的详情,可参考https://tools.ietf.org/html/rfc7348

相关文章

  • OpenvSwitch实现多主机间通信

    单个主机上容器之间如果要实现网络互通比较容易实现,一种常见做法是把需要通信的容器网络接口桥接到相同的主机网络接口,...

  • docker容器跨主机通信-openvswitch

    概述 容器比较火,单机的容器创建和使用比较容易,但是为了搭建集群,需要跨主机部署,那么跨主机的容器网络通信就需要解...

  • 网络安全编程基础 之 网络编程

    套接字编程 套接字(Socket)是用来实现主机和主机之间通信的一个接口。通过它可以完成主机间的通信操作,它屏蔽了...

  • Python Socket 网络编程

    Socket 是进程间通信的一种方式,它与其他进程间通信的一个主要不同是:它能实现不同主机间的进程间通信,我们网络...

  • docker跨主机通信方式二 OpenvSwitch

    目前市面上跨主机通信第三方主流的解决方法有flannel, weave, Pipework, OpenvSwitc...

  • day23-基础网络知识

    1.什么是网络? 实现主机之间通信交流 2.两台计算机之间如何实现通信? 01 实现主机之间通信交流需要...

  • Docker 网络进阶

    单主机通信:none host bridge joined 多主机通信:overlay macv...

  • docker整合consul实现跨主机容器间的通信

    docker整合consul实现跨主机容器间的通信 一、Consul的准备 1 安装consul linux安装:...

  • 利用OpenVSwitch构建多主机Docker网络

    【编者的话】当你在一台主机上成功运行Docker容器后,信心满满地打算将其扩展到多台主机时,却发现前面的尝试只相当...

  • ❖ Socket通信

    要实现所有的网络协议,就需要编程来让不同主机之间接收和发送通信。而实现主机之间通信的编程方式,就是采用socket...

网友评论

      本文标题:OpenvSwitch实现多主机间通信

      本文链接:https://www.haomeiwen.com/subject/jmxyjqtx.html