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

环境准备:

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

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

拓扑图如下:

安装OVS:

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

附上我的OVS启动脚本:

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!‘

保存并放置该脚本

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

安装pipework工具:

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 br0
ovs-vsctl add-port 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

时间: 2024-07-30 23:55:44

#DDBMS#冗余docker网络(进化版)的相关文章

分享:进化版动漫更新提醒(微信及软件)

微信版动漫更新提醒,搜索公众平台: 微伍网 1;,然后在里面找动漫更新提醒当你关注的动漫 更新时,微信马上发信息提醒你关注的动漫已更新到哪集 动漫更新提醒pc端: 当你的软件在后台运行的时候,你关注的动漫在网络上有更新的话,马上发信息和音乐给你,提醒你看最新的动漫.提示音乐跟图片都是可以替换的. 欢迎测试使用,qq:645310824 保留一切权利,版权所有--YongHao Hu 分享:进化版动漫更新提醒(微信及软件)

Docker网络和容器的通信

Docker的本地网络实现其实就是利用了Linux上的网络命名空间和虚拟网络设备(特别是veth pair). 基本原理 直观上看,要实现网络通信,机器需要至少一个网络接口(物理接口或虚拟接口)与外界相通,并可以收发数据包:此外,如果不同子网之间要进行通信,需要额外的路由机制. Docker中的网络接口默认都是虚拟的接口.虚拟接口的最大优势就是转发效率极高.这是因为Linux通过在内核中进行数据复制来实现虚拟接口之间的数据转发,即发送接口的发送缓存中的数据包将被直接复制到接收接口的接收缓存中,而

记一次KUBERNETES/DOCKER网络排障

昨天周二晚上,临下班的时候,用户给我们报了一个比较怪异的Kubernetes集群下的网络不能正常访问的问题,让我们帮助查看一下,我们从下午5点半左右一直跟进到晚上十点左右,在远程不能访问用户机器只能远程遥控用户的情况找到了的问题.这个问题比较有意思,我个人觉得其中的调查用到的的命令以及排障的一些方法可以分享一下,所以写下了这篇文章. 问题的症状 用户直接在微信里说,他们发现在Kuberbnetes下的某个pod被重启了几百次甚至上千次,于是开启调查这个pod,发现上面的服务时而能够访问,时而不能

docker网络

一. Docker 中的网络功能介绍 默认情况下,容器可以建立到外部网络的连接,但是外部网络无法连接到容器. Docker 允许通过外部访问容器或容器互联的方式来提供网络服务 外部访问容器: 容器中可以运行一些网络应用,要让外部也可以访问这些应用,可以通过  -P  或  -p  参数来指定端口映射.(当使用–P(大写)标记时,Docker 会随机映射一个随机的端口到内部容器开放的网络端口.) 注意:-P使用时需要指定--expose选项或dockerfile中用expose指定容器要暴露的端口

docker网络访问(三)

docker网络访问 ifconfig查看网卡,启动docker的时候,docker会帮我们创建一个docker0的网桥. 1.随机映射 docker run -P 2.指定映射 -p hostPort:containerPort -p ip:hostPort:containerPort -p ip::containerPort -p hostPort:containerPort:udp -p hostPort:containerPort -p hostPort:containerPort (多

docker网络配置方法总结

docker启动时,会在宿主主机上创建一个名为docker0的虚拟网络接口,默认选择172.17.42.1/16,一个16位的子网掩码给容器提供了65534个IP地址.docker0只是一个在绑定到这上面的其他网卡间自动转发数据包的虚拟以太网桥,它可以使容器和主机相互通信,容器与容器间通信.问题是,如何让位于不同主机上的docker容器可以通信.如何有效配置docker网络目前来说还是一个较复杂的工作,因而也涌现了很多的开源项目来解决这个问题,如flannel.Kubernetes.weave.

Docker 网络之pipework 工具(2)将Docker容器配置到本地网络环境中

为了使本地网络中的机器和Docker容器更方便的通信,我们经常会有将Docker容器配置到和主机同一网段的需求.这个需求其实很容易实现,我们只要将Docker容器和主机的网卡桥接起来,再给Docker容器配上IP就可以了.下面我们来操作一下,我主机A地址为192.168.1.107/24,网关为192.168.1.1,需要给Docker容器的地址配置为192.168.1.150/24.在主机A上做如下操作:安装pipework下载地址:wgethttps://github.com/jpetazz

Docker—网络模式

Docker网络实现原理: Docker 中的网络接口默认都是虚拟的接口.虚拟接口的优势之一是转发效率较高. Linux 通过在内核中进 行数据复制来实现虚拟接口之间的数据转发,发送接口的发送缓存中的数据包被直接复制到接收接口的接收缓存中.对于本地系统和容器内系统看来就像是一个正常的以太网卡,只是它不需要真正同外部网络设备通信,速度要快很多:Docker 容器网络利用此技术,它在本地主机和容器内分别创建一个虚拟接口,并让它们彼此连通 (这样的一对接口叫做 veth pair ) Docker 创

Docker网络详解及pipework源码解读与实践

Docker作为目前最火的轻量级容器技术,有很多令人称道的功能,如Docker的镜像管理.然而,Docker同样有着很多不完善的地方,网络方面就是Docker比较薄弱的部分.因此,我们有必要深入了解Docker的网络知识,以满足更高的网络需求.本文首先介绍了Docker自身的4种网络工作方式,然后通过3个样例 -- 将Docker容器配置到本地网络环境中.单主机Docker容器的VLAN划分.多主机Docker容器的VLAN划分,演示了如何使用pipework帮助我们进行复杂的网络设置,以及pi