基于openvswitch的不同宿主机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代码   收藏代码
  1. yum -y install wget openssl-devel kernel-devel  
  2.   
  3. yum groupinstall "Development Tools"  
  4.   
  5. cd ~  
  6.   
  7. wget http://openvswitch.org/releases/openvswitch-2.3.0.tar.gz  
  8.   
  9. tar -xvf openvswitch-2.3.0.tar.gz   
  10.   
  11. mkdir -p ~/rpmbuild/SOURCES  
  12.   
  13. sed 's/openvswitch-kmod, //g' openvswitch-2.3.0/rhel/openvswitch.spec > openvswitch-2.3.0/rhel/openvswitch_no_kmod.spec  
  14.   
  15. cp openvswitch-2.3.0.tar.gz rpmbuild/SOURCES/  
  16.   
  17. rpmbuild -bb --without check ~/openvswitch-2.3.0/rhel/openvswitch_no_kmod.spec  
  18.   
  19. yum localinstall ~/rpmbuild/RPMS/x86_64/openvswitch-2.3.0-1.x86_64.rpm  
  20.   
  21. mkdir /etc/openvswitch  
  22.   
  23. setenforce 0  
  24.   
  25. systemctl start openvswitch.service  
  26.   
  27. systemctl status openvswitch.service -l  
  28.   
  29. systemctl enable openvswitch.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代码   收藏代码
  1. ovs-vsctl add-br obr0  
  2.   
  3. ovs-vsctl add-port obr0 gre0 -- set Interface gre0 type=gre options:remote_ip=172.16.230.105  
  4.   
  5. brctl addbr kbr0  
  6.   
  7. brctl addif kbr0 obr0  
  8.   
  9. ip link set dev docker0 down  
  10.   
  11. ip link del dev docker0  

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

Java代码   收藏代码
  1. DEVICE=kbr0  
  2. ONBOOT=yes  
  3. BOOTPROTO=static  
  4. IPADDR=172.17.1.1  
  5. NETMASK=255.255.255.0  
  6. GATEWAY=172.17.1.0  
  7. USERCTL=no  
  8. TYPE=Bridge  
  9. IPV6INIT=no  

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

C代码   收藏代码
  1. 172.17.2.0/24 via 172.16.230.109 dev eth0  

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

 

server2配置

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

Java代码   收藏代码
  1. ovs-vsctl add-port obr0 gre0 -- set Interface gre0 type=gre options: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代码   收藏代码
  1. ExecStart=/usr/bin/docke daemon --registry-mirror=https://u2ljumtr.mirrortaliyuncs.com -H fd:// -b kbr0  

        启动一个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

猜你喜欢

转载自m635674608.iteye.com/blog/2337423