環境準備: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/