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

1元 10元 50元





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



  求知 文章 文库 Lib 视频 iPerson 课程 认证 咨询 工具 讲座 Modeler   Code  
会员   
 
   
 
 
     
   
 订阅
  捐助
持续交付系列(二):使用Docker、Mesos实现持续交付
 
来源:OPEN经验库 发布于 2015-5-14
   次浏览      
 

本文主要介绍Mesos和Marathon的搭建以及如何完成整个持续交付过程,以及后续还可以做哪些改进和加强。整个系统搭建完成后,应用代码的改变会 自动触发Jenkins构建流程,几秒钟后,改变就会通过Jenkins、Docker Hub和Marathon传递到Mesos中部署上线,是不是很酷?

第一部分( 中文翻译)我们介绍了如何Docker化一个Node.js应用,如何使用Fig部署Jenkins和Docker Registry,以及如何实现Node.js应用的持续集成。

本文是第二部分,将继续介绍Mesos和Marathon的搭建以及如何完成整个持续交付过程。

如果你不了解Mesos或者Marathon,可以参考如下文章: 文章1、 文章2和 文章3。

现在,我们有了功能性开发和持续集成的环境,可以开始搭建Mesos集群了。

如下是包含系统所有部分的fig.yml文件。在之前配置好的Jenkins和Docker Registry基础之上,我们还有Mesos master、Mesos slave、Mesosphere Marathon和负责内部Mesos通信的Zookeeper。

# Zookeeper: -p 2181:2181 -p 2888:2888 -p 3888:3888
zookeeper:
image: jplock/zookeeper:3.4.5
ports:
- "2181"
master:
image: redjack/mesos-master:0.21.0
hostname: master
links:
- zookeeper:zookeeper
environment:
- MESOS_ZK=zk://zookeeper:2181/mesos
- MESOS_QUORUM=1
- MESOS_WORK_DIR=/var/lib/mesos
- MESOS_LOG_DIR=/var/log
ports:
- "5050:5050"
marathon:
#image: garland/mesosphere-docker-marathon
image: mesosphere/marathon
links:
- zookeeper:zookeeper
ports:
- "8080:8080"
# this image does not respect MARATHON_ env variables, so adding the params via command
command: --master zk://zookeeper:2181/mesos --zk zk://zookeeper:2181/marathon
slave:
image: redjack/mesos-slave:0.21.0
links:
- zookeeper:zookeeper
- master:master
environment:
- MESOS_MASTER=zk://zookeeper:2181/mesos
- MESOS_EXECUTOR_REGISTRATION_TIMEOUT=5mins
- MESOS_CONTAINERIZERS=docker,mesos
- MESOS_ISOLATOR=cgroups/cpu,cgroups/mem
- MESOS_LOG_DIR=/var/log
volumes:
- /var/run/docker.sock:/run/docker.sock
- /usr/bin/docker:/usr/bin/docker
- /sys:/sys:ro
- mesosslace-stuff:/var/log
expose:
- "5051"
jenkins:
image: containersol/jenkins_with_docker
links:
- marathon:marathon
volumes:
- jenkins-stuff:/var/jenkins_home
- .:/var/jenkins_data
- /var/run/docker.sock:/var/run/docker.sock
- /usr/bin/docker:/usr/bin/docker
ports:
- "8081:8080"
registry:
image: registry
environment:
- STORAGE_PATH=/registry
volumes:
- registry-stuff:/registry
ports:
- "5000:5000"

fig.yml不多做解释。所有环境参数都是参考Docker Hub上对应镜像的使用介绍。

Mesos slave容器还使用了挂载socket的技巧,不过不需要做别的,因为slave是用root用户运行的,有访问socket的权限。

要注意Jenkins容器连接到了Marathon。这就要求能够从Jenkins容器发送请求到Marathon容器里。我们在下一章介绍部署的时候会详细说明。

现在重启系统,可以看到系统开始运行:

$ fig up
Creating cddemo_registry_1...
Recreating cddemo_zookeeper_1...
Creating cddemo_master_1...
Creating cddemo_slave_1...
Recreating cddemo_marathon_1...
Creating cddemo_jenkins_1...

容器启动非常快,但是要等所有服务都上线大概花了30秒(在MacBook Air上的Ubuntu虚拟机里)。

Mesos在http://localhost:5050。如下截图里可以看到一个活动的slave。该slave在本次配置下没有暴露任何端口。

从http://localhost:8080可以访问Marathon。

部署

最后一步是将我们用Marathon在Mesos上新构建的Docker镜像部署好。

首先需要创建配置文件将应用安排到Marathon上,如下app_marathon.json:

{
"id": "app",
"container": {
"docker": {
"image": "localhost:5000/containersol/nodejs_app:latest",
"network": "BRIDGE",
"portMappings": [
{"containerPort": 8000, "servicePort": 8000}
]
}
},
"cpus": 0.2,
"mem": 512.0,
"instances": 1
}

这里也有一些需要注意的地方。比如,没有提到健康检查,需要告诉Marathon应用运行和不运行的时间。

一旦我们发布了这个JSON文件,就可以在deploy.sh里添加最新的脚本,移除最近运行的应用,并且用新的镜像重新部署它。当然有更好的升级策略,不过不在这里讨论。

#!/bin/bash

if [ -z "${1}" ]; then
version="latest"
marathon="localhost"
else
version="${1}"
marathon=${MARATHON_PORT_8080_TCP_ADDR}
fi

# destroy old application
curl -X DELETE -H "Content-Type: application/json" http://${marathon}:8080/v2/apps/app 

# I know this one is ugly. But it works for now.
sleep 1

# these lines will create a copy of app_marathon.json and update the image version
cp -f app_marathon.json app_marathon.json.tmp
sed -i "s/latest/${version}/g" app_marathon.json.tmp

# post the application to Marathon
curl -X POST -H "Content-Type: application/json" http://${marathon}:8080/v2/apps -d@app_marathon.json.tmp

最后一步是将deploy.sh添加到Jenkins的配置中并运行构建。

成功构建之后,可以看到应用运行在Marathon上:

从http://localhost:31000可以访问我们自己的应用:

现在可以试着改变应用并且触发Jenkins去构建build。几秒钟后,这个改变就会通过Jenkins、Docker Hub和Marathon传递到Mesos里!

改进

要想改进这个系统有两个大方向:添加更多的功能以及提升搭建质量(deepening the quality of the setup)。可能的扩展有很多,我们只列了几个例子:

将HelloWorld示例扩展为一个标准Web应用

多语言支持

多层次的自动化测试(单元测试、系统测试、性能测试等等。)

用Git hook自动触发Jenkins build

部署到公有云里,比如GCE、AWS等

在多主机上运行

HAProxy搭建

用Jmeter实现负载模拟下的自动扩展

部署一个基于微服务的系统

使用Flocker做持久化存储

使用Weave作为网络容器

使用Consul实现自动服务发现

添加系统监控

添加集中式日志

我的下一步想使系统可以面向外部用户,添加HAProxy和自动扩展的能力,如下图所示:

最后的话

一开始搭建这个系统主要是想帮助开发和运维人员学习如何在持续交付领域使用Docker和Mesos。在几个月的过程中我发现完整的系统很复杂,很难解释,更难搭建和使用。

我们请 Marta marszal创建了本文的图表,以让文章更容易理解。

如果有改进本示例系统的建议,请一定告诉我们。

   
次浏览       
 
相关文章

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

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

云计算原理与应用
云计算应用与开发
CMMI体系与实践
基于CMMI标准的软件质量保证
最新活动计划
LLM大模型应用与项目构建 12-26[特惠]
QT应用开发 11-21[线上]
C++高级编程 11-27[北京]
业务建模&领域驱动设计 11-15[北京]
用户研究与用户建模 11-21[北京]
SysML和EA进行系统设计建模 11-28[北京]

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

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

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