分享

原创:构建一个冗余的docker容器网络

本帖最后由 hochikong 于 2015-2-18 16:42 编辑

问题导读:
1.OpenVswitch的常用命令有哪些?
2.如何访问不同主机上docker容器的服务?
3.你还能想到什么更好的网络高可用方案吗?



环境准备:
vmware中配置四台ubuntu server 14.04(你可以只安装一个系统,使用克隆功能克隆出另外三台ubuntu),配置好SSH
每台机器配置两个网卡,像openstack一样,分Internal和External IP。这里我让eth0(NAT)作为 External,eth1(host-only)作为Internal。
拓扑图如下:
图像 3.png

安装OVS:
具体安装教程参考这里:http://www.sdnlab.com/3166.html
附上我的OVS启动脚本:
ovs_launch
  1. #!/bin/bash
  2. #launch the ovs
  3. 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
  4. #init the database
  5. ovs-vsctl --no-wait init
  6. #launch the main process
  7. ovs-vswitchd --pidfile --detach
  8. #print the version infomation
  9. ovs-vsctl --version
  10. echo
  11. echo 'OpenVswitch have been launched successfully!'
复制代码
保存并放置该脚本
  1. chmod +x ovs_launch
  2. mv ovs_launch /usr/local/bin
复制代码

安装pipework工具:
  1. git clone https://github.com/jpetazzo/pipework
  2. cp ~/pipework/pipework /usr/local/bin/
复制代码

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

pull一个镜像:
  1. docker pull ubuntu
复制代码

创建挂载容器用的br0和br1网桥:
  1. brctl addbr br0
  2. ip link set dev br0 up
  3. ip addr add 192.168.2.1/24 dev br0
  4. brctl addbr br1
  5. ip link set dev br1 up
  6. ip addr add 192.168.3.1/24 dev br1
复制代码

每台host上配置OVS(每次开机先执行ovs_launch):
  1. ovs-vsctl add-br ovs0
  2. ovs-vsctl set bridge ovs0 stp_enable=true
  3. ovs-vsctl add-port br0
  4. ovs-vsctl add-port br1
复制代码


创建host1tohost2的vxlan或gre隧道(这里我用的是gre):
  1. ovs-vsctl add-port ovs0 gre0 -- set interface gre0 type=gre options:remote_ip=10.20.10.71
复制代码
创建host2tohost1的gre隧道:
  1. ovs-vsctl add-port ovs0 gre0 -- set interface gre0 type=gre options:remote_ip=10.20.10.70
复制代码


创建host2tohost3的隧道:
  1. ovs-vsctl add-port ovs0 gre1 -- set interface gre1 type=gre options:remote_ip=10.20.10.72
复制代码
创建host3tohost2的隧道:
  1. ovs-vsctl add-port ovs0 gre1 -- set interface gre1 type=gre options:remote_ip=10.20.10.71
复制代码


创建host3tohost4的隧道:
  1. ovs-vsctl add-port ovs0 gre2 -- set interface gre2 type=gre options:remote_ip=10.20.10.73
复制代码
创建host4tohost3的隧道:
  1. ovs-vsctl add-port ovs0 gre2 -- set interface gre2 type=gre options:remote_ip=10.20.10.72
复制代码


创建host4tohost1的隧道:
  1. ovs-vsctl add-port ovs0 gre3 -- set interface gre3 type=gre options:remote_ip=10.20.10.70
复制代码
创建host1tohost4的隧道:
  1. ovs-vsctl add-port ovs0 gre3 -- set interface gre3 type=gre options:remote_ip=10.20.10.73
复制代码
(注意,两台主机间的互通隧道名相同,且每个OVS上不能出现重名的隧道)


启动容器并测试:
host1:
  1. docker run -itd --name=test1 ubuntu
  2. pipework br0 test1 192.168.2.11/24
复制代码


host2:
  1. docker run -itd --name=test1 ubuntu
  2. pipework br0 test1 192.168.2.12/24
复制代码


host3:
  1. docker run -itd --name=test1 ubuntu
  2. pipework br1 test1 192.168.3.11/24
复制代码

host4:
  1. docker run -itd --name=test1 ubuntu
  2. 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这类东西。



############################################3
作者:Hochikong










欢迎加入about云群9037177932227315139327136 ,云计算爱好者群,亦可关注about云腾讯认证空间||关注本站微信

没找到任何评论,期待你打破沉寂

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

推荐上一条 /2 下一条