首先讲一下持续集成的优势。过去公司做测试可能需要十几个、二十几个插件,集成一次往往需要一两个小时,费力费时,而且容易出错,且一旦配置出错的话调试排错会更久。因此,一次集成测试一周才会做一次,测试bug要到下一周才能更新,再做测试,这个周期会很漫长。而且持续集成的意义就在于减少风险,和重复的过程,最终提高工作效率。
Jenkins是目前持续集成领域应用最为广泛的工具,通过Jenkins,项目可以进行自动化的静态检查、编译、打包、分发、和部署,通过持续不断的集成代码,减少项目风险和重复过程,提高工作效率。
另外,docker作为新的容器化的技术代表,能够保持跨环境的一致性,在微服务中可以更快速的交付和部署
Apace Mesos作为一种分布式系统内核,可理解为一个集群管理器
Mesos计算框架是一个开源的集群管理平台,它提供了高效的、高可靠的、跨应用的资源隔离和共享,在其之上可以运行Hapoop、Spark、JBoss、Ruby On Reails等应用框架,支持多种资源的计划分配。
其中主要的一个目的就是有效的利用和共享计算资源,避免资源的浪费
通过底层计算资源(物理机、虚拟机、云等)的CPU、内存、存储以及机器上的其他资源进行抽象,对抽象后的资源进行统一的管理调度,提供跨分布式应用或框架的资源隔离和共享,非常有效的提高了分布式应用
图中只展示了Hadoop和MPI两种类型,其它类型的应用程序也有相应的Framework
Mesos实现了两级调度架构,可以管理多种类型的应用程序。
第一级调度是Master的守护进程,管理Mesos集群中所有节点上运行的Slave守护进程。集群由物理服务器或虚拟服务器组成,用于运行应用程序的任务,比如Hadoop和MPI作业。
第二级调度由被称作Framework的“组件”组成。Framework包括调度器(Scheduler)和执行器(Executor)进程,其中每个节点上都会运行执行器。Mesos能和不同类型的Framework通信,每种Framework由相应的应用集群管理
Jenkins是Java开发的一种持续集成的工具,我们在它的基础上做了一些重复的工作,比如源码管理、代码扫描、编译打包、版本发布、测试、部署等,以及调用外部接口。Jenkins支持很多插件,可以很方便地选择使用适合自己团队的插件工具。
问题
Jenkins为我们提供了便利,当然Jenkins本身也有它自己的问题
传统的Jenkins CI采用的是独占模式,每个人都可以申请一台VM,预装好Jenkins,他的优点在于独立、隔离,你在上面执行任务不会影响到其他人,其他人的任务也不会影响到你。
但缺点是;
另外一种Master/Slave模式,通过tomcat+Jenkins实现统一的UI入口界面,但是你提交的任务是提交到Slave群上,这样的好处是大家共享Slave集群资源,不必每个人独占VM,VM的数量肯定大幅下降
但缺点是
利用Apache Mesos就可以很好的解决以上两种模式的缺点。让资源最大力度的优化,同时配置也灵活且自动化
Mesos 是Apache下的一个开源的统一资源和管理与调度平台,它被称为分布式系统的内核,是集群管理软件,用以有效利用计算资源,构建一个高可用\容错的\可伸缩的系统
Marathon 是注册到Apache Mesos上的管理长时应用的framework,如果把Mesos比作数据中心的kernel的话,Marathon就是init或者upstart的daemon
why
对于使用者来说,就像一台超级计算机,之前你的架构可能是将不同的应用部署在不同的集群上,比如,为了Jenkins CI,你搭建了一个集群,为了Jira系统,你搭建了另外一个集群上,为Hadoop,又搭建了新的集群。
Mesos的目的就是将所有这些集群的资源整合起来,而你的这些应用通过Mesos部署在这个大的集群上,就像你在一台超级计算机上安装了不同软件一样。
首先我们把Jenkins的Master通过Marathon发布,Marathon 去调用 Mesos Master,之后Mesos Master再去Slave节点起Jenkins的Master。这个机制保证了Jenkins Master的高可用,Marathon会监控Jenkins Master的健康状态,当Jenkins Master出现崩溃挂掉,Marathon会自动再启动一个Jenkins Master的任务。
Jenkins Master使用Mesos整个大的资源池,Mesos的资源池是一个资源共享的状态,资源利用率也会更高一些。
Jenkins Master做的是调度,Jenkins Slave则是真正执行构建任务的地方。
上图就是CI平台一些Job List,左下角是Mesos各个Slave的节点,每一个节点上都有任务,这些任务都是并行的。
因为我们的服务模块比较多,可能一个模块一天提交十几次,这么多的模块在一天提交几十次或者上百次的情况也出现过。手动更新、构建的话是非常难做到的。
现在,做成Jenkins 分布式执行Job的模式,一天构建成千上万次也没有问题,它会把构建的任务均匀的分布在主机资源里。