基于Apache Mesos集群搭建高并发高可用的Jenkins-CI架构

基于Apache Mesos集群搭建高并发高可用的Jenkins-CI架构_第1张图片

一. 持续集成的价值

首先讲一下持续集成的优势。过去公司做测试可能需要十几个、二十几个插件,集成一次往往需要一两个小时,费力费时,而且容易出错,且一旦配置出错的话调试排错会更久。因此,一次集成测试一周才会做一次,测试bug要到下一周才能更新,再做测试,这个周期会很漫长。而且持续集成的意义就在于减少风险,和重复的过程,最终提高工作效率。

Jenkins是目前持续集成领域应用最为广泛的工具,通过Jenkins,项目可以进行自动化的静态检查、编译、打包、分发、和部署,通过持续不断的集成代码,减少项目风险和重复过程,提高工作效率。

另外,docker作为新的容器化的技术代表,能够保持跨环境的一致性,在微服务中可以更快速的交付和部署

二. 什么是Apache Mesos

Apace Mesos作为一种分布式系统内核,可理解为一个集群管理器

Mesos计算框架是一个开源的集群管理平台,它提供了高效的、高可靠的、跨应用的资源隔离和共享,在其之上可以运行Hapoop、Spark、JBoss、Ruby On Reails等应用框架,支持多种资源的计划分配。
其中主要的一个目的就是有效的利用和共享计算资源,避免资源的浪费

通过底层计算资源(物理机、虚拟机、云等)的CPU、内存、存储以及机器上的其他资源进行抽象,对抽象后的资源进行统一的管理调度,提供跨分布式应用或框架的资源隔离和共享,非常有效的提高了分布式应用
基于Apache Mesos集群搭建高并发高可用的Jenkins-CI架构_第2张图片
图中只展示了Hadoop和MPI两种类型,其它类型的应用程序也有相应的Framework

Mesos实现了两级调度架构,可以管理多种类型的应用程序。

  • 第一级调度是Master的守护进程,管理Mesos集群中所有节点上运行的Slave守护进程。集群由物理服务器或虚拟服务器组成,用于运行应用程序的任务,比如Hadoop和MPI作业。

  • 第二级调度由被称作Framework的“组件”组成。Framework包括调度器(Scheduler)和执行器(Executor)进程,其中每个节点上都会运行执行器。Mesos能和不同类型的Framework通信,每种Framework由相应的应用集群管理

三. Jenkins CI 传统的两种模式

什么是Jenkins

Jenkins是Java开发的一种持续集成的工具,我们在它的基础上做了一些重复的工作,比如源码管理、代码扫描、编译打包、版本发布、测试、部署等,以及调用外部接口。Jenkins支持很多插件,可以很方便地选择使用适合自己团队的插件工具。

问题
Jenkins为我们提供了便利,当然Jenkins本身也有它自己的问题

第一种:Jenkins CI本地单点模式

传统的Jenkins CI采用的是独占模式,每个人都可以申请一台VM,预装好Jenkins,他的优点在于独立、隔离,你在上面执行任务不会影响到其他人,其他人的任务也不会影响到你。

但缺点是;

  • 一台VM往往有4个CPU,16G内存,这样对资源造成很大的浪费,大部分的时间你申请的VM都处于闲置状态;
  • 任务大多是需要排队的,如果每个任务都自己建一套Jenkins的话,资源会非常浪费

第二种:Jenkins Master/Slave UI统一模式

另外一种Master/Slave模式,通过tomcat+Jenkins实现统一的UI入口界面,但是你提交的任务是提交到Slave群上,这样的好处是大家共享Slave集群资源,不必每个人独占VM,VM的数量肯定大幅下降
但缺点是

  • Master/Slave配置不灵活,Master需要知道所有的Slave节点的信息,而且不能做到资源自动化的增加和回收。
  • 由于大公司里面需要进行编译的工程或者对象非常庞大,因此需要大量的物理节点作为slave,而且这些环节相对固定,可能很难适应其他项目的编译测试,一旦salve节点遭到破坏,需要人为的进行修复甚至重建,非常麻烦

利用Apache Mesos就可以很好的解决以上两种模式的缺点。让资源最大力度的优化,同时配置也灵活且自动化

四. Jenkins on Mesos弹性高可用模式

为什么要把Jenkins CI运行到Apache Mesos上?

Mesos 是Apache下的一个开源的统一资源和管理与调度平台,它被称为分布式系统的内核,是集群管理软件,用以有效利用计算资源,构建一个高可用\容错的\可伸缩的系统
Marathon 是注册到Apache Mesos上的管理长时应用的framework,如果把Mesos比作数据中心的kernel的话,Marathon就是init或者upstart的daemon
why

  • 1、把Jenkins运行到Apache Mesos上,或者说利用Apache Mesos想Jenkins提供slave资源,最主要的目的时,利用Mesos的弹性资源分配来提高资源利用率。通过配置Jenkins-on-Mesos插件,Jenkins master可以在作业构建时根据实际需要动态的想Mesos申请slave节点,并在构建完成的一段时间后将节点归还给Mesos
  • 2、同时,Marathon会对发布到它之上的应用程序进行健康检查,从而在应用程序由于某些原因以为崩掉后自动重启该应用。这样,选择利用Marathon管理Jenkins Master保证了该构建体系的全局高可用。而且,Jenkins Master本身也通过Marathon部署运行在Mesos资源池内,进一步实现了资源共享,提高资源利用率

对于使用者来说,就像一台超级计算机,之前你的架构可能是将不同的应用部署在不同的集群上,比如,为了Jenkins CI,你搭建了一个集群,为了Jira系统,你搭建了另外一个集群上,为Hadoop,又搭建了新的集群。

Mesos的目的就是将所有这些集群的资源整合起来,而你的这些应用通过Mesos部署在这个大的集群上,就像你在一台超级计算机上安装了不同软件一样。

Jenkins master

基于Apache Mesos集群搭建高并发高可用的Jenkins-CI架构_第3张图片
首先我们把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 slave

基于Apache Mesos集群搭建高并发高可用的Jenkins-CI架构_第4张图片
Jenkins Master做的是调度,Jenkins Slave则是真正执行构建任务的地方。

  • Jenkins Master会在Mesos Master上注册一个它自己的Framework,如果有任务需要构建的话,Jenkins Master 会通知 Jenkins Framework 调用 Mesos Master构建一个任务。
  • 之后Mesos Master 再调用 Mesos Slave去起一个Jenkins Slave的节点去构建任务,它是实时的,用户资源可能被分配到各个机器上,在不同的机器上并行存在。
  • 此外,Jenkins还具备动态调度功能,也就是说,当任务运行完后一定时间,资源会再返还给Mesos,实现合理地利用整个集群的资源,提高集群的资源利用率。

Jenkins on Mesos整体流程

基于Apache Mesos集群搭建高并发高可用的Jenkins-CI架构_第5张图片
这张图是Mesos整体的调度流程。

  • 第一步,它的集群有三个Mesos Slave节点资源,资源上报到Mesos Master,Mesos Master收集到这些资源之后把这些资源再提供给Marathon
  • Marathon如果要发任务,它确认一个Offer1,Offer1足够任务来运行,就拒绝其他的Offer,并把这个任务发送给Mesos Master,之后Mesos Master去找Slave1起Marathon的任务。这是Marathon的任务启动过程。
  • Mesos本身可以和多框架进行通信,Jenkins Master要跑一个任务,Mesos Master同样提供资源给Jenkins,提供的资源包括了Marathon 任务使用剩下的资源,比如Task1 确认的 Offer1没有用完和没有使用的资源,Mesos也会它提供给Jenkins。而Jenkins也会选择,比如Jenkins选择了Offer3,拒绝了其他的Offer,把Jenkins的任务再通过Mesos Master去Mesos Slave中起起来。

五. 结论基于Apache Mesos集群搭建高并发高可用的Jenkins-CI架构_第6张图片

上图就是CI平台一些Job List,左下角是Mesos各个Slave的节点,每一个节点上都有任务,这些任务都是并行的。

因为我们的服务模块比较多,可能一个模块一天提交十几次,这么多的模块在一天提交几十次或者上百次的情况也出现过。手动更新、构建的话是非常难做到的。

现在,做成Jenkins 分布式执行Job的模式,一天构建成千上万次也没有问题,它会把构建的任务均匀的分布在主机资源里。

你可能感兴趣的:(Devops,jenkins,devops)