您可以捐助,支持我们的公益事业。

1元 10元 50元





认证码:  验证码,看不清楚?请点击刷新验证码 必填



  求知 文章 文库 Lib 视频 iPerson 课程 认证 咨询 工具 讲座 Modeler   Code  
会员   
 
   
 
 
     
   
 订阅
  捐助
构建一个高可用及自动发现的Docker基础架构
 
作者 刘天斯 来源:http://blog.liuts.com/post/242/ 火龙果软件  发布于 2014-12-05
  1114  次浏览      27
 

Docker的发展前景一片大好。但在企业当中,如何选择适合自己的Docker构建方案?下面详细介绍如何使用Haproxy+etcd+confd构建一个高可用及自动发现的Docker基础架构。

Docker的生态日趋成熟,开源社区也不断孵化出优秀的周边项目,覆盖网络、监控、维护、部署、开发等方面。帮助开发、运维人员快速构建、运营Docker服务环境,其中也不乏有大公司的影子,如Google、IBM、Redhat,甚至微软也宣称后续将提供Docker在Windows平台的支持。Docker的发展前景一片大好。但在企业当中,如何选择适合自己的Docker构建方案?可选的方案有kubernetes与CoreOS(都已整合各类组件),另外一种方案为Haproxy+etcd+confd,采用松散式的组织结构,但各个组件之间的通讯是非常严密的,且扩展性更强,定制也更加灵活。下面详细介绍如何使用Haproxy+etcd+confd构建一个高可用及自动发现的Docker基础架构。

一、架构优势

约定由Haproxy+etcd+confd+Docker构建的基础服务平台简称“HECD” 架构,整合了多种开源组件,看似松散的结构,事实上已经是一个有机的整体,它们互相联系、互相作用,是Docker生态圈中最理想的组合之一,具有以下优势:

  • 自动、实时发现及无感知服务刷新; 
  • 支持任意多台Docker主宿机; 
  • 支持多种APP接入且打散至不分主宿机; 
  • 采用Etcd存储信息,集群支持可靠性高; 
  • 采用Confd配置引擎,支持各类接入层,如Nginx; 
  • 支持负载均衡、故障迁移; 
  • 具备资源弹性,伸缩自如(通过生成、销毁容器实现); 

二、架构说明

在HECD架构中,首先管理员操作Docker Client,除了提交容器(Container)启动与停止指令外,还通过REST-API方式向Etcd(K/V)存储组件注册容器信息,包括容器名称、主宿机IP、映射端口等。Confd配置组件会定时查询Etcd组件获取最新的容器信息,根据定义好的配置模板生成Haproxy配置文件Haproxy.cfg,并且自动reload haproxy服务。用户在访问业务服务时,完全没有感知后端APP的上线、下线、切换及迁移,达到了自动发现、高可用的目的。详细架构图见图1-1。

图1-1 平台架构图

为了方便大家理解各组件间的关系,通过图1-2进行架构流程梳理,首先管理员通过Shell或API操作容器,下一步将容器信息注册到Etcd组件,Confd组件会定时查询Etcd,获取已经注册到Etcd中容器信息,最后通过Confd的模板引擎生成Haproxy配置,整个流程结束。

图1-2架构流程图

了解架构流程后,我们逐一对流程中各组件进行详细介绍。

1、Etcd介绍

Etcd是一个高可用的 Key/Value 存储系统,主要用于分享配置和服务发现。

  • 简单:支持 curl 方式的用户 API (HTTP+JSON) 
  • 安全:可选 SSL 客户端证书认证 
  • 快速:单实例可达每秒 1000 次写操作 
  • 可靠:使用 Raft 实现分布式

2、Confd介绍

Confd是一个轻量级的配置管理工具。通过查询Etcd,结合配置模板引擎,保持本地配置最新,同时具备定期探测机制,配置变更自动reload。

3、Haproxy介绍

HAProxy是提供高可用性、负载均衡以及基于TCP和HTTP应用的代理,支持虚拟主机,它是免费、快速并且可靠的一种解决方案。(来源百科) 

三、架构部署

平台环境基于Centos6.5+Docker1.2构建,其中Etcd的版本为etcd version 0.5.0-alpha,Confd版本为confd 0.6.2,Haproxy版本为HA-Proxy version 1.4.24。下面对平台的运行环境、安装部署、组件说明等进行详细说明,环境设备角色表如下:

1、组件安装

1.1 Docker安装

SSH终端登录192.168.1.22服务器,执行以下命令:

1.2 Haproxy、confd安装

SSH终端登录192.168.1.20服务器,执行以下命令: 

1.3 Etcd安装   

SSH终端登录192.168.1.21服务器,执行以下命令: 

2、组件配置   

2.1 Etcd配置

由于etcd是一个轻量级的K/V存储平台,启动时指定相关参数即可,无需配置。 

由于etcd具备多机支持,参数“-peer-addr”指定与其它节点通讯的地址;参数“-addr”指定服务监听地址;参数“-data-dir”为指定数据存储目录。    

由于etcd是通过REST-API方式进行交互,常见操作如下:   

1) 设置(set) key操作 

2) 获取(get) key信息

3) 删除key信息 

更多操作API见https://github.com/coreos/etcd/blob/master/Documentation/api.md。 

2.2 Confd+Haproxy配置  

由于Haproxy的配置文件是由Confd组件生成,要求Confd务必要与haproxy安装在同一台主机上,Confd的配置有两种,一种为Confd资源配置文件,默认路径为“/etc/confd/conf.d”目录,另一种为配置模板文件,默认路径为“/etc/confd/templates”。具体配置如下:    

创建配置文件目录 

(1)配置资源文件   

详细见以下配置文件,其中“src”为指定模板文件名称(默认到路径/etc/confd/templates中查找);“dest”指定生成的Haproxy配置文件路径;“keys”指定关联Etcd中key的URI列表;“reload_cmd”指定服务重载的命令,本例中配置成haproxy的reload命令。    

【/etc/confd/conf.d/ haproxy.toml】 

(2)配置模板文件  

Confd模板引擎采用了Go语言的文本模板,更多见http://golang.org/pkg/text/template/,具备简单的逻辑语法,包括循环体、处理函数等,本示例的模板文件如下,通过range循环输出Key及Value信息。   

【/etc/confd/templates/haproxy.cfg.tmpl】 

(3)模板引擎说明  

本小节详细说明Confd模板引擎基础语法与示例,下面为示例用到的KEY信息。

1、base   

作为path.Base函数的别名,获取路径最后一段。 

{{ with get "/app/servers/prickly_blackwell"}} 

server {{base .Key}} {{.Value}} check 

{{end}}

2、get

返回一对匹配的KV,找不到则返回错误。   

{{with get "/app/servers/prickly_blackwell"}} 

key: {{.Key}} 

value: {{.Value}} 

{{end}}

3、gets  

{{range gets "/app/servers/*"}} 

{{.Key}} {{.Value}} 

{{end}} 

4、getv

返回一个匹配key的字符串型Value,找不到则返回错误。  

{{getv "/app/servers/cocky_morse"}}

5、getvs

返回所有匹配key的字符串型Value,找不到则返回错误。

{{range getvs "/app/servers/*"}} 

value: {{.}} 

{{end}} 

6、split

对输入的字符串做split处理,即将字符串按指定分隔符拆分成数组。 

{{ $url := split (getv "/app/servers/cocky_morse") ":" }} 

host: {{index $url 0}} <

port: {{index $url 1}}

7、ls

返回所有的字符串型子key,找不到则返回错误。 

{{range ls "/app/servers/"}} 

subkey: {{.}} 

{{end}}

8、lsdir

返回所有的字符串型子目录,找不到则返回一个空列表。 

{{range lsdir "/app/"}} 

subdir: {{.}} 

{{end}}

(4)启动confd及haproxy服务

下面为启动Confd服务命令行,参数“interval”为指定探测etcd的频率,单位为秒,参数“-node”为指定etcd监听服务主地址,以便获取容器信息。 

3、容器配置

前面HECD架构说明内容,有讲到容器的操作会即时注册到etcd组件中,是通过curl命令进行REST-API方式提交的,下面详细介绍通过SHELL及Python-api两种方式的实现方法,支持容器启动、停止的联动。 

3.1、SHELL实现方法

实现的原理是通过获取“Docker run ***”命令输出的Container ID,通过“docker inspect Container ID”得到详细的容器信息,分析出容器服务映射的外部端口及容器名称,将以“/app/servers/容器名称”作为Key,“主宿机: 映射端口”作为Value注册到etcd中。其中Key信息前缀(/app/servers)与“/etc/confd/conf.d/haproxy.toml”中的keys参数是保持一致的。 

【docker.sh】 

docker.sh使用方法:

 1) 启动一个容器

 # ./docker.sh run yorko/webserver:v3(镜像)   

 2) 停止一个容器

 # ./docker.sh stop berserk_hopper(容器名)

3.2、Docker-py API实现方法

通过Python语言调用Docker-py的API实现容器的远程操作(创建、运行、停止),并结合python-etcd模块对etcd进行操作(set、delete),达到与SHELL方式一样的效果,很明显,Docker-py方式更加容易扩展,可以无缝与现有运营平台对接。

为兼顾到远程API支持,需对docker启动文件“exec”处进行修改,详细见如下:

# vi /etc/init.d/docker 

启动容器的程序如下:

【docker_run.py】 

停止容器的程序如下:

【docker_stop.py】 

注意:由于容器是无状态的,尽量让其以松散的形式存在,映射端口选项要求使用“-P”参数,即使用随机端口的模式,减少人手干预。 

四、业务上线

HECD架构已部署完毕,接下来就是让其为我们服务,案例中使用的镜像“yorko/webserver:v3”为已经构建好的LAMP平台。类似的镜像也可以在docker-pub中下载到,开始跑起,运行dockery.sh创建两个容器:

访问Haproxy监控地址:http://192.168.1.20/admin-status,刚创建的容器已经添加到haproxy中,见图1-3。 

图1-3 Haproxy监控后台截图 

1)观察Haproxy的配置文件(更新部分):

2)访问php测试文件http://192.168.1.20/info.php

图1-4 php测试文件截图

从图1-4可以看出,获取的服务器端IP为容器本身的IP地址(172.17.0.11),在System环境变量处输出容器名为“598cf10a50a2”的信息。 

   
1114 次浏览       27
 
相关文章

云计算的架构
对云计算服务模型
云计算核心技术剖析
了解云计算的漏洞
 
相关文档

云计算简介
云计算简介与云安全
下一代网络计算--云计算
软浅析云计算
 
相关课程

云计算原理与应用
云计算应用与开发
CMMI体系与实践
基于CMMI标准的软件质量保证
最新活动计划
DeepSeek在软件测试应用实践 4-12[在线]
DeepSeek大模型应用开发实践 4-19[在线]
UAF架构体系与实践 4-11[北京]
AI智能化软件测试方法与实践 5-23[上海]
基于 UML 和EA进行分析设计 4-26[北京]
业务架构设计与建模 4-18[北京]

专家视角看IT与架构
软件架构设计
面向服务体系架构和业务组件的思考
人人网移动开发架构
架构腐化之谜
谈平台即服务PaaS
更多...   
相关培训课程

云计算原理与应用
Windows Azure 云计算应用

摩托罗拉 云平台的构建与应用
通用公司GE Docker原理与实践
某研发中心 Openstack实践
知名电子公司 云平台架构与应用
某电力行业 基于云平台构建云服务
云计算与Windows Azure培训
北京 云计算原理与应用