场景见上图,需要仔细理解下:
两台物理机器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上运行脚本,注意交换两台的REMOTEIP和BRIDGEADDRESS:
#!/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