美文网首页
07_docker容器跨宿主机通信方法:Openvswitch

07_docker容器跨宿主机通信方法:Openvswitch

作者: 对方不想理你并向你抛出一个异常 | 来源:发表于2018-01-04 16:37 被阅读0次

抛出问题

  上一节使用pipework配置容器间通信,每次创建新的容器时,都要使用pipework为新容器配置网络,能不能容器就有网络并且能互相通信呢?下面使用openvswitch来配置网络解决此问题

openvswitch安装

  • 安装依赖
    yum -y install make gcc openssl-devel autoconf automake rpm-build redhat-rpm-config
    yum -y install python-devel openssl-devel kernel-devel kernel-debug-devel libtool wget
    安装2.5.1,有上面这些依赖就行了,但是安装2.7.0,还需要安装以下依赖
    yum install -y python-six selinux-policy-devel

  • 预处理

mkdir -p ~/rpmbuild/SOURCES  
wget http://openvswitch.org/releases/openvswitch-2.7.0.tar.gz  
cp openvswitch-2.7.0.tar.gz ~/rpmbuild/SOURCES/  
tar -zxf openvswitch-2.7.0.tar.gz 
sed 's/openvswitch-kmod, //g' openvswitch-2.7.0/rhel/openvswitch.spec > openvswitch-2.7.0/rhel/openvswitch_no_kmod.spec  
  • 构建rpm包
    rpmbuild -bb --nocheck ~/openvswitch-2.7.0/rhel/openvswitch_no_kmod.spec
    这一步可能需要几分钟

  • 安装
    yum localinstall ~/rpmbuild/RPMS/x86_64/openvswitch-2.7.0-1.x86_64.rpm

  • 启动openvswitch服务
    setenforce 0
    systemctl start openvswitch.service

环境

  • 两台主机
    server1:192.168.175.214
    server1:192.168.175.215

  • 软件版本:
    centos:7.2
    docker版本:1.12.6
    openvswitch :2.7.0

  • 网络配置架构


如上面的步骤,分别在server1和server2上安装openvswitch 。

配置步骤

  • 在server配置ovs bridge 和 路由
      在配置bridge之前需要首先规划好docker ip地址的分配,保证docker容器的ip地址够用。 此安装过程中docker地址分配方式为:
    1. server1 docker : 172.17.1.0 / 24
    2. 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网桥。

ovs-vsctl add-br obr0  
ovs-vsctl add-port obr0 gre0 -- set Interface gre0 type=gre options:remote_ip=192.168.175.214  
brctl addbr kbr0  
brctl addif kbr0 obr0  
ip link set dev docker0 down  
ip link del dev docker0  
  • 配置kbr0网卡信息:vi /etc/sysconfig/network-scripts/ifcfg-kbr0
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
  • 配置路由信息: vi /etc/sysconfig/network-scripts/route-eth0 , 用于转发到其它宿主机上docker容器,其中eth0为真实的网卡设备名称,需要根据虚拟机网卡配置(你的机器不一定是eth0)。
172.17.2.0/24 via 192.168.175.215 dev eth0
  1. 在server1上添加路由表,使server1能到达server2定义的172.17.2.0/24网段。
  2. 这个千万不要配错了,意思是告诉server1在172.17.2.0/24网段的ip在192.168.175.215的server2上
  • 重启网络:systemctl restart network.service

    1. 如果重启失败可以通过 cat /var/log/messages | grep network 查看错误日志。
    2. 实际中测试,启动网络不一定有用,需要重启主机
  • server2配置
    server2和server1的配置步骤相同,不同的配置为:

    1. ovs-vsctl add-port obr0 gre0 -- set Interface gre0 type=gre options:remote_ip=192.168.175.215
    2. /etc/sysconfig/network-scripts/ifcfg-kbr0IPADDR=172.17.2.1 GATEWAY=172.17.2.0
    3. /etc/sysconfig/network-scripts/route-eth0172.17.1.0/24 via 192.168.175.214 dev eth0
  • 设置docker容器网桥

    1. 直接修改/etc/systemd/system/docker.service ,添加参数 -b kbr0 , 重启docker服务。
    2. 修改vi /etc/sysconfig/docker文件,在OPTIONS末尾添加-b=kbr0
      我们采用第二种方式如下:
  • 重启docker服务
    systemctl restart docker.service

  • 在server1和server2上分别创建容器
    docker run -itd --name=mycs6 docker.io/guyton/centos6 /bin/bash

测试网络情况

  • 在server1的容器中
    查看网络
[root@c778cae8a2e5 /]# ifconfig
eth0      Link encap:Ethernet  HWaddr 02:42:AC:11:01:02  
          inet addr:172.17.1.2  Bcast:0.0.0.0  Mask:255.255.255.0
          inet6 addr: fe80::42:acff:fe11:102/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:8935 errors:0 dropped:0 overruns:0 frame:0
          TX packets:8790 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:32897635 (31.3 MiB)  TX bytes:480339 (469.0 KiB)

lo        Link encap:Local Loopback  
          inet addr:127.0.0.1  Mask:255.0.0.0
          inet6 addr: ::1/128 Scope:Host
          UP LOOPBACK RUNNING  MTU:65536  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:0 (0.0 b)  TX bytes:0 (0.0 b)

[root@c778cae8a2e5 /]

ping外网

[root@c778cae8a2e5 /]# ping www.baidu.com
PING www.a.shifen.com (163.177.151.110) 56(84) bytes of data.
64 bytes from 163.177.151.110: icmp_seq=1 ttl=127 time=9.32 ms
64 bytes from 163.177.151.110: icmp_seq=2 ttl=127 time=9.54 ms
....

ping 宿主机

[root@c778cae8a2e5 /]# ping 192.168.175.214
PING 192.168.175.214 (192.168.175.214) 56(84) bytes of data.
64 bytes from 192.168.175.214: icmp_seq=1 ttl=64 time=0.373 ms
64 bytes from 192.168.175.214: icmp_seq=2 ttl=64 time=0.121 ms
  • 在server2的容器中
    查看网络
[root@59ce329fee7f /]# ifconfig
eth0      Link encap:Ethernet  HWaddr 02:42:AC:11:02:02  
          inet addr:172.17.2.2  Bcast:0.0.0.0  Mask:255.255.255.0
          inet6 addr: fe80::42:acff:fe11:202/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:8913 errors:0 dropped:0 overruns:0 frame:0
          TX packets:8765 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:32831848 (31.3 MiB)  TX bytes:478809 (467.5 KiB)

lo        Link encap:Local Loopback  
          inet addr:127.0.0.1  Mask:255.0.0.0
          inet6 addr: ::1/128 Scope:Host
          UP LOOPBACK RUNNING  MTU:65536  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:0 (0.0 b)  TX bytes:0 (0.0 b)

[root@59ce329fee7f /]#

ping外网

[root@59ce329fee7f /]# ping www.baidu.com
PING www.a.shifen.com (163.177.151.109) 56(84) bytes of data.
64 bytes from 163.177.151.109: icmp_seq=1 ttl=127 time=8.26 ms
64 bytes from 163.177.151.109: icmp_seq=2 ttl=127 time=8.30 ms
......

ping宿主机

[root@59ce329fee7f /]# ping 192.168.175.215
PING 192.168.175.215 (192.168.175.215) 56(84) bytes of data.
64 bytes from 192.168.175.215: icmp_seq=1 ttl=64 time=0.227 ms
64 bytes from 192.168.175.215: icmp_seq=2 ttl=64 time=0.078 ms
......
  • 容器互ping
    在server1上的容器中ping server2中的容器
[root@c778cae8a2e5 /]# ping 172.17.2.2
PING 172.17.2.2 (172.17.2.2) 56(84) bytes of data.
64 bytes from 172.17.2.2: icmp_seq=1 ttl=62 time=1.15 ms
64 bytes from 172.17.2.2: icmp_seq=2 ttl=62 time=0.633 ms
......

在server2上的容器中ping server1中的容器

[root@59ce329fee7f /]# ping 172.17.1.2
PING 172.17.1.2 (172.17.1.2) 56(84) bytes of data.
64 bytes from 172.17.1.2: icmp_seq=1 ttl=62 time=0.329 ms
64 bytes from 172.17.1.2: icmp_seq=2 ttl=62 time=0.618 ms
......

上述证明:容器与容器之间、容器与宿主机、容器与外网都是通的

参考文档

基于openvswitch的不同宿主机docker容器网络互联
OpenvSwitch实现Docker容器跨宿主机互联
利用Openvswitch实现不同物理机中的Docker容器互连

相关文章

网友评论

      本文标题:07_docker容器跨宿主机通信方法:Openvswitch

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