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

本文涉及的产品
云原生网关 MSE Higress,422元/月
注册配置 MSE Nacos/ZooKeeper,118元/月
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
简介: 本文讲的是基于Jenkins与Apache Mesos构建弹性高可用的持续集成环境【编者的话】Jenkins是目前持续集成领域应用最为广泛的工具,通过Jenkins,项目可以进行自动化的编译、打包、分发与部署,通过持续不断的集成,减少了项目风险和重复过程,最终提高工作效率;Docker做为新的容器化...
本文讲的是基于Jenkins与Apache Mesos构建弹性高可用的持续集成环境【编者的话】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 ... ntos/

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

Jenkins安装配置

Jenkins安装配置请参见官网: https://jenkins.io/doc/book/ge ... ling/

注: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/d ... .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

注:ZooKeeper集群规模建议3或5,过多可能会导致 replicated log损坏。

配置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

m_ui.jpg

Mesos Agent信息如下:
agent.jpg

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

安装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)不会影响正在运行的作业。
    6a.jpg

点击"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计算方式类似。
slave-c.jpg


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

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

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

并在Dockerfile中末尾加上"/bin/sh", 示例如下:
ENTRYPOINT ["/bin/bash", "--login", "--", "/tmp/entrypoint.sh", "/bin/sh"]

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

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

通过Mesos运行Jenkins Job

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

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

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

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

调试过程

下面是我总结的在Mesos上定位问题流程:
debug-mesos.png

远程登录到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/docume ... ring/
一个月内CPU/Memory分配情况:
cpu_m.jpg

mem_m.jpg

一个月内用Mesos 作业并发构建情况:
job_m.jpg

报警举例: Mesos资源不足通过ElastAlert发送邮件报警。
alert-m.jpg

遇到问题与经验

1、Docker hang:过于频繁create/destory container、pull/push image,当thin pool满时,DeviceMapper后端默认文件系统xfs会不断retry 失败的IO,导致进程挂起。可通过替换ext4文件系统,或升级Docker到1.12.6以上版本,增加Docker daemon启动参数‘dm.xfs_nospace_max_retries=0’方法解决。

2、作业长时间在Jenkins队里等待构建:默认情况下,即使当前有空闲的executor,Jenkins默认等待复用正在运行作业的executor,可以通过Jenkins启动时加上如下参数直接利用空闲的executor:
-Dhudson.slaves.NodeProvisioner.MARGIN=50 -Dhudson.slaves.NodeProvisioner.MARGIN0=0.85

3、由于Jenkins Slave是根据预先估计分配CPU、Memory等资源配额,会存在估计的误差,对于资源超分,解决思路是用Dockbeat监控每个作业的实际使用情况记录到ELK中,而后根据实际使用情况按需分配。

如下图中的作业预申请2cpu,但就近10次的构建中最大cpu使用仅为0.511cpu。
usage_m.jpg

4、如构建作业时不希望复用slave环境,需要在Job配置中勾选Mesos Single-Use Slave,如下图: 
a1a.png

对应pipeline类型作业,如果想使用Mesos Single-Use Slave,可在pipeline 配置中写成如下形式:
node('mylabel') {
wrap([$class: 'MesosSingleUseSlave']) {
    // build actions
}
} 

如同一个label下的作业只是部分用了Mesos Single-Use Slave功能,还是可能会出现slave被复用情况。

解决办法通过自动化方式实现当前label下作业全部使用该功能,而后新建作业自动选择该选项。具体过程如下:

修改代码如下文件:
mesos-plugin/blob/master/src/main/java/org/jenkinsci/plugins/mesos/listener/MesosItemListener.java

加入如下代码,执行mvn package命令重新build mesos plugin
/**
 * Listener for {@link Item} create
 * @param item
 */
@Override
public void onCreated(final Item item) {
    setLabel(item);

    if(item instanceof Project) {
        Project project = (Project) item;
    try{
            synchronized(project) {
    project.getBuildWrappersList().add( new org.jenkinsci.plugins.mesos.MesosSingleUseSlave());
    };
        } catch (Exception e) {
    LOGGER.log(Level.WARNING, "Exception while activating Mesos for project '" + project.getName() + "'", e);
        }
    }
}  

5、以非root(例如Jenkins)用户启动Container但需要执行sudo场景,可以用gosu或su-exec,推荐su-exec,c语言实现,仅10kb大小。具体使用可参考: https://github.com/tianon/gosu

6、通过Docker volume方式将Jenkins作业workspace挂在到网络文件系统(例如CEPH,NFS等)以减少GIT服务器请求压力。

7、设置Mesos Framework Role及weight,使优先级高的任务优先获得资源执行。

8、/etc/sysctl.conf里面net.ipv4.ip_forward值设置为1

参考资料


欢迎转载,请注明作者出处:张夏,FreeWheel Lead Engineer,DockOne社区

原文发布时间为:2017-07-20

本文作者:张夏

本文来自云栖社区合作伙伴Dockerone.io,了解相关信息可以关注Dockerone.io。

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

相关实践学习
基于MSE实现微服务的全链路灰度
通过本场景的实验操作,您将了解并实现在线业务的微服务全链路灰度能力。
相关文章
|
23天前
|
jenkins Devops Java
DevOps实践:Jenkins在持续集成与持续部署中的价值
【10月更文挑战第27天】在快速发展的软件开发领域,DevOps实践日益重要。Jenkins作为一款流行的开源自动化服务器,在持续集成(CI)和持续部署(CD)中扮演关键角色。本文通过案例分析,探讨Jenkins在Java项目中的应用,展示其自动化构建、测试和部署的能力,提高开发效率和软件质量。
44 2
|
27天前
|
消息中间件 数据挖掘 Kafka
Apache Kafka流处理实战:构建实时数据分析应用
【10月更文挑战第24天】在当今这个数据爆炸的时代,能够快速准确地处理实时数据变得尤为重要。无论是金融交易监控、网络行为分析还是物联网设备的数据收集,实时数据处理技术都是不可或缺的一部分。Apache Kafka作为一款高性能的消息队列系统,不仅支持传统的消息传递模式,还提供了强大的流处理能力,能够帮助开发者构建高效、可扩展的实时数据分析应用。
70 5
|
27天前
|
消息中间件 存储 监控
构建高可用性Apache Kafka集群:从理论到实践
【10月更文挑战第24天】随着大数据时代的到来,数据传输与处理的需求日益增长。Apache Kafka作为一个高性能的消息队列服务,因其出色的吞吐量、可扩展性和容错能力而受到广泛欢迎。然而,在构建大规模生产环境下的Kafka集群时,保证其高可用性是至关重要的。本文将从个人实践经验出发,详细介绍如何构建一个高可用性的Kafka集群,包括集群规划、节点配置以及故障恢复机制等方面。
64 4
|
1月前
|
缓存 Devops jenkins
专家视角:构建可维护的测试架构与持续集成
【10月更文挑战第14天】在现代软件开发过程中,构建一个可维护且易于扩展的测试架构对于确保产品质量至关重要。本文将探讨如何设计这样的测试架构,并将单元测试无缝地融入持续集成(CI)流程之中。我们将讨论最佳实践、自动化测试部署、性能优化技巧以及如何管理和扩展日益增长的测试套件规模。
48 3
|
1月前
|
消息中间件 分布式计算 大数据
大数据-166 Apache Kylin Cube 流式构建 整体流程详细记录
大数据-166 Apache Kylin Cube 流式构建 整体流程详细记录
67 5
|
1月前
|
存储 SQL 分布式计算
大数据-162 Apache Kylin 全量增量Cube的构建 Segment 超详细记录 多图
大数据-162 Apache Kylin 全量增量Cube的构建 Segment 超详细记录 多图
58 3
|
26天前
|
存储 数据挖掘 数据处理
巴别时代使用 Apache Paimon 构建 Streaming Lakehouse 的实践
随着数据湖技术的发展,企业纷纷探索其优化潜力。本文分享了巴别时代使用 Apache Paimon 构建 Streaming Lakehouse 的实践。Paimon 支持流式和批处理,提供高性能、统一的数据访问和流批一体的优势。通过示例代码和实践经验,展示了如何高效处理实时数据,解决了数据一致性和故障恢复等挑战。
107 61
|
3天前
|
关系型数据库 MySQL PHP
PHP与MySQL的无缝集成:构建动态网站的艺术####
本文将深入探讨PHP与MySQL如何携手合作,为开发者提供一套强大的工具集,以构建高效、动态且用户友好的网站。不同于传统的摘要概述,本文将以一个生动的案例引入,逐步揭示两者结合的魅力所在,最终展示如何通过简单几步实现数据驱动的Web应用开发。 ####
|
11天前
|
运维 jenkins Java
Jenkins在持续集成与持续部署中的价值
Jenkins在持续集成与持续部署中的价值
|
24天前
|
jenkins Devops 测试技术
DevOps实践:Jenkins在持续集成与持续部署中的价值
【10月更文挑战第26天】随着DevOps理念的普及,Jenkins作为一款开源自动化服务器,在持续集成(CI)与持续部署(CD)中发挥重要作用。本文通过某中型互联网企业的实际案例,展示了Jenkins如何通过自动化构建、持续集成和持续部署,显著提升开发效率、代码质量和软件交付速度,帮助企业解决传统手工操作带来的低效和错误问题。
49 4

推荐镜像

更多
下一篇
无影云桌面