#DDBMS#冗余docker网络(进化版)


环境准备:html

vmware中配置四台ubuntu server 14.04(你能够只安装一个系统,使用克隆功能克隆出另外三台ubuntu),配置好SSHlinux

每台机器配置两个网卡,像openstack同样,分Internal和External IP。这里我让eth0(NAT)做为 External,eth1(host-only)做为Internal。git

拓扑图以下:github

  


安装OVS:docker

具体安装教程参考这里:http://www.sdnlab.com/3166.htmlshell

附上个人OVS启动脚本:bootstrap

ovs_launch
#!/bin/bash
#launch the ovs
ovsdb-server -v --remote=punix:/usr/local/var/run/openvswitch/db.sock --remote=db:Open_vSwitch,Open_vSwitch,manager_options --private-key=db:Open_vSwitch,SSL,private_key --certificate=db:Open_vSwitch,SSL,certificate --bootstrap-ca-cert=db:Open_vSwitch,SSL,ca_cert --pidfile --detach
#init the database
ovs-vsctl --no-wait init
#launch the main process
ovs-vswitchd --pidfile --detach
#print the version infomation
ovs-vsctl --version
echo 
echo 'OpenVswitch have been launched successfully!'

保存并放置该脚本ubuntu

chmod +x ovs_launch
mv ovs_launch /usr/local/bin



安装pipework工具:bash

git clone https://github.com/jpetazzo/pipework
cp ~/pipework/pipework /usr/local/bin/



安装docker最新的版本:https://docs.docker.com/installation/ubuntulinux/网络


pull一个镜像:

docker pull ubuntu



建立挂载容器用的br0和br1网桥:

brctl addbr br0
ip link set dev br0 up
ip addr add 192.168.2.1/24 dev br0
brctl addbr br1
ip link set dev br1 up
ip addr add 192.168.3.1/24 dev br1



在每台host上配置OVS(每次开机先执行ovs_launch):

ovs-vsctl add-br ovs0
ovs-vsctl set bridge ovs0 stp_enable=true
ovs-vsctl add-port ovs0 br0
ovs-vsctl add-port ovs0 br1




建立host1tohost2的vxlan或gre隧道(这里我用的是gre):

ovs-vsctl add-port ovs0 gre0 -- set interface gre0 type=gre options:remote_ip=10.20.10.71


建立host2tohost1的gre隧道:

ovs-vsctl add-port ovs0 gre0 -- set interface gre0 type=gre options:remote_ip=10.20.10.70




建立host2tohost3的隧道:

ovs-vsctl add-port ovs0 gre1 -- set interface gre1 type=gre options:remote_ip=10.20.10.72


建立host3tohost2的隧道:

ovs-vsctl add-port ovs0 gre1 -- set interface gre1 type=gre options:remote_ip=10.20.10.71




建立host3tohost4的隧道:

ovs-vsctl add-port ovs0 gre2 -- set interface gre2 type=gre options:remote_ip=10.20.10.73


建立host4tohost3的隧道:

ovs-vsctl add-port ovs0 gre2 -- set interface gre2 type=gre options:remote_ip=10.20.10.72




建立host4tohost1的隧道:

ovs-vsctl add-port ovs0 gre3 -- set interface gre3 type=gre options:remote_ip=10.20.10.70


建立host1tohost4的隧道:

ovs-vsctl add-port ovs0 gre3 -- set interface gre3 type=gre options:remote_ip=10.20.10.73


(注意,两台主机间的互通隧道名相同,且每一个OVS上不能出现重名的隧道)



启动容器并测试:

host1:

docker run -itd --name=test1 ubuntu
pipework br0 test1 192.168.2.11/24




host2:

docker run -itd --name=test1 ubuntu
pipework br0 test1 192.168.2.12/24




host3:

docker run -itd --name=test1 ubuntu
pipework br1 test1 192.168.3.11/24



host4:

docker run -itd --name=test1 ubuntu
pipework br1 test1 192.168.3.12/24



进入容器进行测试,你会发现,不管哪一个容器,只要挂在同一个br网桥(同一网段),它们都是互通的。固然,若是你用192.168.2.11 ping 192.168.3.11那是绝对不行的(除非你不把br0和br1挂在ovs0上,此时route会进行路由,这种状况下能够互通)。

关于如何进入容器进行测试,能够参考个人博客:http://my.oschina.net/hochikong/blog/369036


此时,你就创建了一个冗余的docker容器网络。


总结:

关于网络的HA,你能够采起简单的星型拓扑,不过星型拓扑只适合小规模的集群。我采起的手段是启用全部OVS的STP(生成树协议,必须在挂载br0或br1以前就启用),再把交换机连成环,能够实现当一个主机断开,对于其余主机的的影响能降到最低(环已经断了时,STP会从新配置一条链路,致使网络中断数秒,这一点要靠docker中的分布式应用方案去解决)。你能够写一个程序实现调度功能。


另外,我是手动分配ip地址的,若是有分布式的dhcp服务,pipework也能够支持dhcp为容器分配ip地址(参考这里的2.1节)

docker在本地默认状况下会挂载在docker0上,你不关闭docker0网桥,用了pipework后,容器就有两个ip地址(你必须为容器配置一个默认网桥,不然外部的访问者将没法经过port来访问docker容器中的服务,所以我没删掉默认的docker0,也没更改/etc/default/docker的配置)。pipework默认为容器配置一个名为eth1的NIC,你能够在pipework的源码中根据需求修改该名称。


在这个方案中,分布式应用须要经过容器的eth1互相沟通。


主机的internal ip用于维护者进行管理,external ip用于对外提供服务。


若是想容器ping得通外网,就必须配置DNAT这类东西。



做者:Hochikong




参考:

http://blog.163.com/digoal%40126/blog/static/163877040201411602548445/

http://www.infoq.com/cn/articles/docker-network-and-pipework-open-source-explanation-practice

http://hiaero.net/beginning-openvswitch/

https://docs.docker.com/installation/ubuntulinux/

http://www.sdnlab.com/3166.html

相关文章
相关标签/搜索