基于openvswitch的不同宿主机docker容器网络互联

2017-12-30 12:09:18来源:oschina作者:xiaomin0322人点击

分享
基于openvswitch的不同宿主机docker容器网络互联 博客分类: docker

场景:同一台宿主机的docker容器之间网络是联通的,但是不同宿主机之间的docker容器之间不能直接通信。在使用docker容器为不同宿主机部署分部署服务的时候,必须要实现不同宿主机的docker容器之间的网络互通,保证服务调用端能够直接访问服务。



软件版本:


centos:7.1


docker版本:1.11.1


openvswitch :2.3.0



测试虚拟机:


server1 : 172.16.230.105


server2 : 172.16.230.109



安装openvswitch



分别在server1和server2上安装openvswitch 。 openvswtich不能直接安装,需要在本地重新打包后安装。安装过程参考如下:



C代码
收藏代码

yum-yinstallwgetopenssl-develkernel-develyumgroupinstall"DevelopmentTools"cd~wgethttp://openvswitch.org/releases/openvswitch-2.3.0.tar.gztar-xvfopenvswitch-2.3.0.tar.gzmkdir-p~/rpmbuild/SOURCESsed's/openvswitch-kmod,//g'openvswitch-2.3.0/rhel/openvswitch.spec>openvswitch-2.3.0/rhel/openvswitch_no_kmod.speccpopenvswitch-2.3.0.tar.gzrpmbuild/SOURCES/rpmbuild-bb--withoutcheck~/openvswitch-2.3.0/rhel/openvswitch_no_kmod.specyumlocalinstall~/rpmbuild/RPMS/x86_64/openvswitch-2.3.0-1.x86_64.rpmmkdir/etc/openvswitchsetenforce0systemctlstartopenvswitch.servicesystemctlstatusopenvswitch.service-lsystemctlenableopenvswitch.service



在server配置ovs bridge 和 路由


在配置bridge之前需要首先规划好docker ip地址的分配,保证docker容器的ip地址够用。 此安装过程中docker地址分配方式为:


server1 docker : 172.17.1.0 / 24 , server2 docker : 172.17.2.0 /24 ,在server1和server2中各自可以同时运行253个docker实例。


server1 和server2中docker容器ip地址掩码为255.255.255.0 , 因此,server1和server2的ip地址属于不同的网段,他们之间如果要通信,需要配置gateway 。



server1配置


修改/proc/sys/net/ipv4/ip_forward的值为1,运行ip转发。虽然现在修改了此值,但是后边启动服务的时候,ip_forward的值又成了0 或着 这个值不允许通过vim命令直接修改, 可以通过sftp工具,直接替换该文件。


创建网桥kbr0,并删除docker0网桥。



Java代码
收藏代码

ovs-vsctladd-brobr0ovs-vsctladd-portobr0gre0--setInterfacegre0type=greoptions:remote_ip=172.16.230.105brctladdbrkbr0brctladdifkbr0obr0iplinksetdevdocker0downiplinkdeldevdocker0

配置kbr0网卡信息:vim /etc/sysconfig/network-scripts/ifcfg-kbr0



Java代码
收藏代码

DEVICE=kbr0
ONBOOT=yes
BOOTPROTO=static
IPADDR=172.17.1.1
NETMASK=255.255.255.0
GATEWAY=172.17.1.0
USERCTL=no
TYPE=Bridge
IPV6INIT=no

配置路由信息:/etc/sysconfig/network-scripts/route-eth0 ,用于转发到其它宿主机上docker容器,其中eth0为真实的网卡设备名称,需要根据虚拟机网卡配置。



C代码
收藏代码

172.17.2.0/24via172.16.230.109deveth0

重启网络:systemctl restartnetwork.service , 如果重启失败可以通过 cat /var/log/messages | grep network 查看错误日志。



server2配置


server2和server1的配置步骤相同,不同的配置为:



Java代码
收藏代码

ovs-vsctladd-portobr0gre0--setInterfacegre0type=greoptions:remote_ip=172.16.230.109

/etc/sysconfig/network-scripts/ifcfg-kbr0 中IPADDR=172.17.2.1 GATEWAY=172.17.2.0


/etc/sysconfig/network-scripts/route-eth0 中172.17.1.0/24 via 172.16.230.105 dev eth0



设置docker容器网桥


直接修改/etc/systemd/system/docker.service ,添加参数 -b kbr0 , 重启docker服务。



C代码
收藏代码

ExecStart=/usr/bin/dockedaemon--registry-mirror=https://u2ljumtr.mirrortaliyuncs.com-Hfd://-bkbr0

启动一个docker容器之后,查看ip地址是否在kbr0的ip地址范围内。




配置完成之后可以看到已经存在kbr0网桥


可能出现问题:


1. Bringing up interface kbr0: Error: Connection activation failed: Connection 'Bridge kbr0' is not available on the device kbr0 at this time


解决: 重启服务器


2./etc/sysconfig/network-scripts/ifcfg-kbr0中必须带着DEVICE=kbr0


3.不同宿主机的docker容器之间执行ping命令时 ,需要关闭防火墙


4. 网桥查看命令 brctl show ,需要安装yum install bridge-utils



参考地址:


http://ylw6006.blog.51cto.com/470441/1606239/


http://www.bubuko.com/infodetail-1006745.html


weave跨主机互连:http://blog.csdn.net/wangtaoking1/article/details/45244525




http://lpyyn.iteye.com/blog/2308714

微信扫一扫

第七城市微信公众平台