文档章节

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

Hochikong
 Hochikong
发布于 2015/02/18 16:46
字数 1105
阅读 315
收藏 5
点赞 0
评论 0


环境准备:

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


© 著作权归作者所有

共有 人打赏支持
Hochikong
粉丝 18
博文 108
码字总数 59961
作品 1
广州
程序员
化敌为友,Docker 宣布拥抱 Kubernetes

在 DockerCon EU 2017 大会上,Docker 官方宣布支持 Kubernetes。过去几年,Kubernetes 得到了包括Google、Huawei、Microsoft、IBM、AWS、Rancher、Redhat、CoreOS 等企业的一致认可。前几日...

达尔文 ⋅ 2017/10/20 ⋅ 9

从分布式数据库结构入手讲解其前世今生

由于分布式数据库克服了集中式数据库的许多缺点,并且自然地适应于许多单位地理上分散而逻辑上统一的组织结构,因此,20多年以来从理论到实践都得到了迅速发展,并取得了决定性成果。   分...

Oscarfff ⋅ 2016/06/10 ⋅ 0

Docker 切出 Moby 背后的真实原因分析

本文来自:开源之道 | 作者:适兕 事件起因 上周 Docker 公司在其技术会议 DockerCon 会议上宣布了新的项目:LinuxKit 和 Moby,一时之间在开发技术圈引起轩然大波,而在本土则是一篇知乎上的...

王练 ⋅ 2017/04/25 ⋅ 12

#DDBMS#构建一个简单的docker网络

拓扑图如下: host1:10.20.10.70 host2:10.20.10.71 分别在主机1和主机2上创建一个ovs交换机: ovs-vsctl add-br ovs0ip link set ovs0 up 分别为ovs0添加一个port(br0在同一网段): ovs-...

Hochikong ⋅ 2015/02/15 ⋅ 0

Docker 2015年度回顾

Docker从2013年开源,即将经历三年的不断完善与优化。2015年是Docker开源项目突飞猛进的一年,在这一年的时间里,Docker先后发布了v1.5, v1.6, v1.7, v1.8, v1.9 等5个大版本以及7个修订版。...

dockerer ⋅ 2016/01/06 ⋅ 0

分布式数据库概述

原文出处:振河 一、前言 随着传统的数据库技术日趋成熟、计算机网络技术的飞速发展和应用范围的扩充,数据库应用已经普遍建立于计算机网络之上。这时集中式数据库系统表现出它的不足:数据按...

振河 ⋅ 2016/03/06 ⋅ 0

#DDBMS#技术测试一——docker使用自定义网桥

试验目标:使docker接入自定义的网桥而非默认的docker0网桥。 过程: 安装bridge-utils apt-get install bridge-utils 先关闭docker service docker stop 关闭docker0网桥 ifconfig docker0...

Hochikong ⋅ 2015/01/18 ⋅ 2

程序员10月书讯

10月也是13本新书,有特别推荐3本,还有体验设计和平面设计3本,有纯技术类4本,还有数学和科普3本,涉猎甚广,本月的新书将从下周开始陆续上市了,敬请期待。 1.《决胜UX:互联网产品用户体...

图灵教育 ⋅ 2016/10/17 ⋅ 0

黑天鹅启示录

早就听说过“黑天鹅”这本书,但一直都没在意,直到后来,读了“思考的快与慢”与“人类简史”发现它们都提到了黑天鹅这本书的观点,这才有了阅读的兴趣。 作者观点犀利,论述精彩,引例刀走...

scottcgi ⋅ 2017/12/09 ⋅ 0

Kubernetes Containerd集成进入GA阶段

在之前的博客Containerd给Kubernetes带来更多的容器运行选项[1],我们介绍了Kubernetes containerd integration的内部测试版。经历了6个月的开发,正式版推出了!现在,你可以在生产环境的K...

m2l0zgssvc7r69efdtj ⋅ 05/29 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

Nginx服务架构初探(四):nginx服务器的rewrite功能

nginx服务器的rewrite功能 1.nginx后端服务器组的配置 1>upstream name {…} name是给服务器组限的组名 2>server address [parameters]; address为服务器地址 parame......

余温灬未存 ⋅ 今天 ⋅ 0

layer.prompt使文本框为空的情况下也能点击确定

最近一直在使用layui,但是用到弹出层layer.prompt时,如果文本框是空的话点击确定没有反应,不能向下执行。 但是我又需要空值,看看我原来的代码。 123456789 layer.prompt...

孟飞阳 ⋅ 今天 ⋅ 0

Linux普通文件压缩工具gzip、Bzip2、xz

第六章 文件压缩和打包 6.1 压缩打包介绍 Linux环境常见压缩文件类型: .zip,.gz,.bz2,.xz, .tar.gz,.tar.bz2,.tar.xz 压缩打包的目的 方便文件传输 节省磁盘空间 减少传输花费的时间 ...

弓正 ⋅ 今天 ⋅ 0

移动弹窗基础知识浅析——IOS弹窗体系

摘要: 最为常见的【弹窗】反而是最“捉摸不定”的东西。各种类型的弹窗傻傻分不清楚,不知道在什么场景下应该用哪种弹窗。尤其是遇到“二次确认”等场景…… 因此,打算从头整理移动弹窗的基...

阿里云云栖社区 ⋅ 今天 ⋅ 0

zabbix短信报警统计以及报表展示

一、需求 由于我们的业务报警比较频繁,之前是针对每个报警进行具体处理,但是有时还会重复出现,或者后续处理有时忘记跟进等,因此进行报警短信的统计,可以针对一些问题与业务跟进,明确后...

o翡翠谷o ⋅ 今天 ⋅ 0

JNI 输出LOG

1、导入log头文件。在你使用的 .c/ .cpp 文件中,导入 log.h 头文件。 #include<android/log.h> 2、在android.mk 加上 LOCAL_LDLIBS := -llog 或 LOCAL_SHARED_LIBRARIES := liblog 3、定义L......

国仔饼 ⋅ 今天 ⋅ 0

主线程pthread_exit 作用

#include <iostream>#include <pthread.h>#include <unistd.h>using namespace std;#define NUM_THREADS 10void* say_hello(void* args){ int i = *((int*)args);/......

xxdd ⋅ 今天 ⋅ 0

崛起于Springboot2.X之Mybatis-xml方式操作mysql数据库(3)

序言:当第一篇讲道Mybatis的时候,只要使用过mybatis的java程序员100%都会知道这种方式,因为这是最广泛最全面的编写sql操作mysql数据库的方式,高级sql的编写往往通过xml方式,接下来进入正...

木九天 ⋅ 今天 ⋅ 1

移动弹窗基础知识浅析——IOS弹窗体系

摘要: 最为常见的【弹窗】反而是最“捉摸不定”的东西。各种类型的弹窗傻傻分不清楚,不知道在什么场景下应该用哪种弹窗。尤其是遇到“二次确认”等场景…… 因此,打算从头整理移动弹窗的基...

猫耳m ⋅ 今天 ⋅ 0

spring elasticsearch 2.4 date 日期

1.mappingPUT user_behavior { "mappings": { "user_behavior": { "properties": { "date": { "type": "createDate", ......

xiaomin0322 ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部