专栏名称: 分布式实验室
最专业的Docker文章,最权威的Docker新闻。关注容器生态圈的发展。
目录
相关文章推荐
51好读  ›  专栏  ›  分布式实验室

基于Jenkins与Apache Mesos构建弹性高可用的持续集成环境

分布式实验室  · 公众号  · 后端  · 2017-07-27 07:45

正文

Jenkins是目前持续集成领域应用最为广泛的工具,通过Jenkins,项目可以进行自动化的编译、打包、分发与部署,通过持续不断的集成,减少了项目风险和重复过程,最终提高工作效率;Docker做为新的容器化的技术代表,能够保持跨环境的一致性,可以实现更快速地交付和部署;Apache Mesos做为一种分布式系统内核,可理解为一个集群管理器,通过对底层计算资源(物理机、虚拟机、云等)的CPU、内存、存储以及机器上的其他资源进行抽象,对抽象后的资源进行统一的管理调度,提供跨分布式应用或框架的资源隔离和共享,非常有效的提高了分布式集群的资源利用率,使机器计算资源变得弹性可扩展。


Mesos通过对运行在其上的Framework按照role进行分组和设置权重的方式,保证高优先级的任务优先获得资源。另外Mesos有非常完善的failover机制,可以做到无缝升降级和容灾处理。Mesos Master服务通过ZooKeeper保证高可用,周期性健康检查失败Mesos Agent会被自动下线,Agent恢复之前不会再被分配任务,Agent短暂性失联也不会影响正在运行的任务,而对于与Mesos Master失联的Framework,指定时间内(Mesos Framework failover_timeout)重新注册Mesos Master也不会影响正在运行的任务。


传统的以实体机或虚拟机做为Jenkins slave方式,存在部署构建环境复杂、构建环境单点、不一致、作业构建时资源竞争以及资源利用不均衡等诸多问题。而Mesos通过Docker Container做隔离,将构建依赖打包到Docker Image中,保证了构建环境的一致性。Jenkins Master可以在构建作业构建动态Mesos资源申请做为slave节点,并在构建完成后将资源归还给Mesos(也可以一直保留)。Jenkins、Docker以及Mesos的结合,从根本上解决了传统slave构建环境单点、构建环境一致性、作业构建资源竞争以及利用不均衡等问题。


本文主要介绍基于Jenkins与Mesos快速搭建一套弹性的、高可用的持续集成环境。


:Mesos已在FreeWheel公司用了一年时间,目前有超过90% Jenkins作业(CI总作业数约为13000个)通过Mesos提供的资源进行构建,平均每天构建近3000次,作业并发构建量高点时超过100个。


安装配置


前提准备


版本信息:


Mesos版本:1.3.0
操作系统版本:Red Hat 7
ZooKeeper版本: 3.4.6


机器信息:


3台Mesos Master:
Mesos Master1: 192.168.0.91
Mesos Master2: 192.168.0.93
Mesos Master3: 192.168.0.127

10台Mesos Agent:
Mesos Agent1: 192.168.16.190
Mesos Agent2: 192.168.16.191
Mesos Agent3: 192.168.16.192
... ...
Mesos Agent10: 192.168.16.194


Docker


Docker安装请参见官网:https://docs.docker.com/engine/installation/linux/docker-ce/centos/


: 配置中需加 "-H unix:///var/run/docker.sock",对于CentOS或Red Hat,推荐Docker Storage Driver采用DeviceMapper的direct-lvm模式。


Jenkins安装配置


Jenkins安装配置请参见官网:https://jenkins.io/doc/book/getting-started/installing/


:JDK 1.8的默认垃圾回收算法ParallelGC会导致Jenkins周期性的hang(表现为几分至十几分钟主页无法打开),需将垃圾回收算法替换为 Concurrent Mark Sweep(CMS)或Garbage First(G1)以此减少GC延迟。


另外 :对于Jenkins的JVM调优、容灾以及高可用等我司具备一定经验和教训,有需要了解的同学可留言交流。


Mesos安装配置


方式1:源码编译安装


安装过程请参见官网:http://mesos.apache.org/gettingstarted


方式2:YUM安装


安装Mesos依赖过程请参见官网:http://mesos.apache.org/gettingstarted


添加yum源:


sudo rpm -Uvh http://repos.mesosphere.com/el/7/noarch/RPMS/mesosphere-el-repo-7-3.noarch.rpm


安装最新版本:


sudo yum -y install mesos


或指定版本安装:

yum list mesos --showduplicates |sort -r


:Jenkins Master也需要安装Mesos,但无需启动Mesos服务。


ZooKeeper安装


请参见官网:https://zookeeper.apache.org/doc/trunk/zookeeperStarted.html


Mesos Master ZooKeeper配置


1、 /etc/mesos/zk文件内容为ZooKeeper地址,示例如下:


zk://192.168.0.91:2181,192.168.0.93:2181,192.168.0.127:2181/mesos


2、3个ZooKeeper节点中/etc/zookeeper/conf/myid 分别配置1、2、3


3、将3个ZooKeeper节点中的/etc/zookeeper/conf/zoo.cfg,分别增加如下配置:


server.1=192.168.0.91:2888:3888
server.2=192.168.0.93:2888:3888
server.3=192.168.0.127:2888:3888


配置Mesos Master


Mesos Master节点配置信息如下,各文件内容请按照实际情况填写:


/etc/mesos-master/quorum:配置为2
/etc/mesos-master/advertise_ip
/etc/mesos-master/ip
/etc/mesos-master/log_dir
/etc/mesos-master/work_dir
/etc/mesos-master/hostname
/etc/mesos-master/cluster:比如mesos-cluster


配置Mesos Agent


Mesos Agent节点配置信息如下,各文件内容请按照实际情况填写:


/etc/mesos-slave/ip
/etc/mesos-slave/hostname
/etc/mesos-slave/containerizers:推荐值仅为'Docker‘
/etc/mesos-slave/docker_registry
/etc/mesos-slave/port
/etc/mesos-slave/work_dir
/etc/mesos-slave/advertise_ip
/etc/mesos-slave/?no-switch_user:文件内容留空 
/etc/mesos-slave/?no-systemd_enable_support:文件内容留空


访问Mesos Master,地址如下:


http://192.168.0.91[93|127]:5050



Mesos Agent信息如下:



Mesos将以上10个Mesos Agent的计算资源做了抽象,用户角度看来就像一个高配的计算机。


Resources

CPUs GPUs Mem Disk
Total 320 0 837.6GB 18.8TB
Allocated 30.3 0 79.2GB 0B
Offered 0 0 0B 0B
Idle 289.7 0 758.4GB 18.8TB


安装Mesos Plugin


请参见:https://wiki.jenkins.io/display/JENKINS/Mesos Plugin


配置Jenkins on Mesos


配置Mesos Cloud信息:Manage Jenkins -> Configure System -> Mesos Cloud


配置图示和重点参数说明如下:


  • Mesos native library path:Mesos lib库路径

  • Mesos Master [hostname:port]:ZooKeeper地址

  • Cloud ID:自动生成

  • Checkpointing:选择Yes. Enable Checkpointing的意义是Mesos Agent服务失败(例如升级或crash)不会影响正在运行的作业。


点击"Advanced...",配置Slave相关信息图示及重点参数说明如下:


Label String:Jenkins label


说明 :CPU最小可为千分之一核即0.001CPU,内存可为1MB。总分配给slave的CPU为Jenkins Slave CPUs (Minimum/Maximum number of Executors per Slave) * Jenkins Executor CPUs,分配内存总数与CPU计算方式类似。



点击"Advanced...",选中Use Docker Containerizer与Docker,配置用Docker做隔离相关信息图示及重点参数说明如下:



Docker Force Pull Image:会强制从Docker Registry拉取Image。


说明 :默认情况下Mesos会覆盖Dockerfile中的Entrypoint,一个workround方式是勾选Use custom docker command shell,并在Custom docker command shell中加上-c,如无Entrypoint,此步骤忽略。




并在Dockerfile中末尾加上"/bin/sh", 示例如下:


ENTRYPOINT ["/bin/bash", "--login", "--", "/tmp/entrypoint.sh", "/bin/sh"]

如果有Docker化slave中执行Docker命令的需求(Docker in Docker),可配置如下:




另外,如果需要作业构建完成后,尽快销毁Container(超过slave idel时间)释放资源,可作如下配置:



通过Mesos运行Jenkins Job


点击Job Configure -> Restrict where this project can be run -> Label Expression 刚刚在Jenkins Mesos Cloud上配置的label,配置好相关参数后,点击build,然后通过job的Console Output,可以看见:



其中mesos-jenkins-6d7291a458bb49b6ad26efcf3e26f11d-mesos-jenkins-sl为Jenkins slave名称。


在Mesos Web UI可以查看到正在构建的Jenkins job(Mesos task)。



如Slave launch失败或未达到预期,可以点击Sanbox查看stderr、 stdout。



调试过程


下面是我总结的在Mesos上定位问题流程:



远程登录到mesos container,举例如下:


docker -H tcp://bjoepbm01.dev.fwmrm.net:2375 exec -it  mesos-d8df8fb0-1c86-450b-8d0b-f33047fe15a3-S1.d151118f-bf6d-4abf-bca6-f32a885938b7 bash

:可以在Docker daemon中指定 "-H tcp://0.0.0.0:2375",方便远程操作docker daemon。


Mesos 监控

Mesos的监控以纳入我司的ELK,通过ELK: ElastAlert对未满足预设定的条件进行报警, Mesos监控请参见官网:http://mesos.apache.org/documentation/latest/monitoring/。


一个月内CPU/Memory分配情况:






请到「今天看啥」查看全文