场景见上图,需要仔细理解下:

两台物理机器host1和host2,网口eth0通过交换机互联。host1的ip是192.168.122.43,host2的ip是192.168.122.189。

两台机器都起了ovs,在ovs的Bridge(br0)上有两个端口,br0和gre0,gre0通过GRE隧道通联。

两台机器也都起了Linux的Bridge(docker0),注意,ovs的Bridge(br0)和linux的Bridge(docker0),两个不同。

docker平台跑在linux自带的Bridge(docker0)上,docker0挂接ovs的Bridge(br0)的端口br0,相当于两个软交换机串联起来。

可以直接把docker运行在ovs的Bridge(br0)上,那就是另外一篇文章了。本篇这么搞是为了docker的架构通用性,毕竟普通场合docker一般都跑在linux自带的网桥上,至于下面再串接什么,接不接ovs,都可以再改,至少上层结构是通用的。

Container分配的地址段是172.16.42.xxx,通过gre隧道,就可以达到不同主机的虚机间可以跨主机互相通讯的效果。

在host1和host2上运行脚本,注意交换两台的REMOTEIPBRIDGEADDRESS:

#!/bin/sh
REMOTE_IP=192.168.122.189  
BRIDGE_ADDRESS=172.16.42.1/24  
BRIDGE_NAME=docker0

#启动Linux下的Bridge -- docker0
ip link set $BRIDGE_NAME down  
brctl delbr $BRIDGE_NAME  
ovs-vsctl --if-exists del-br br0  
brctl addbr $BRIDGE_NAME  
ip a add $BRIDGE_ADDRESS dev $BRIDGE_NAME  
ip link set $BRIDGE_NAME up

#启动ovs的Bridge -- br0 和gre0
ovs-vsctl add-br br0  
ovs-vsctl add-port br0 gre0 -- set interface gre0 type=gre options:remote_ip=$REMOTE_IP  
brctl addif $BRIDGE_NAME br0  
ip link set br0 up  

分别在两台机器上ping对方的私有地址,172.16.42.1和42.2,能ping通就表示成功了。

说明一下,以上的脚本分为两个部分,一部分是启动linux的网桥,一部分是启动ovs的网桥和gre。ovs配置会自动保存,但是linux的部分机器一重启就会消失。那么怎么固定下来呢?手动编辑即可:

#vi /etc/sysconfig/nework-script/ifcfg-docker0 
---------------
DEVICE=docker0  
ONBOOT=yes  
BOOTPROTO=static  
IPADDR=172.16.42.1  
NETMASK=255.255.255.0  
TYPE=Bridge  
---------------

#vi /etc/sysconfig/nework-script/ifcfg-br0
---------------
DEVICE=br0  
DEVICETYPE=ovs  
TYPE=OVSPort  
ONBOOT=yes  
BOOTPROTO=none  
BRIDGE=docker0  
---------------

有个要点,Linux下的网桥是以网卡形式出现的,而ovs中的网桥和port可以以网卡形式出现,或者不出现只用ovs-vsctl查看,以网卡形式出现的能用ifconfig命令来查看

查看一下情况:

#brctl show
bridge name    bridge id       STP enabled interfaces  
docker0        8000.92518689f143   no      br0

#ovs-vsctl show
d4683999-6f1a-4974-b73e-a93bd239021d  
    Bridge "br0"
        Port "br0"
            Interface "br0"
                type: internal
        Port "gre0"
            Interface "gre0"
                type: gre
                options: {remote_ip="172.16.8.106"}
    ovs_version: "2.3.1"

最后是docker部分的启动,docker是运行在lxc的引擎之上:

#docker run \
-n=false \
-lxc-conf="lxc.network.type = veth" \
-lxc-conf="lxc.network.ipv4 = 172.16.42.20/24" \
-lxc-conf="lxc.network.ipv4.gateway = 172.16.42.1" \
-lxc-conf="lxc.network.link = docker0" \
-lxc-conf="lxc.network.name = eth0" \
-lxc-conf="lxc.network.flags = up" \
-i -t centos:latest /bin/bash
comments powered by Disqus