请选择 进入手机版 | 继续访问电脑版

IT运维管理,ITIL,ITSS,ITSM,ISO20000-ITIL先锋论坛

 找回密码
 点击获取邀请码 - 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

搜索
查看: 351|回复: 0

基于Jenkins的弹性高可用的持续集成环境

[复制链接]
来自- 广东广州

参加活动:0

组织活动:12

发表于 2017-8-16 15:45:04 | 显示全部楼层 |阅读模式 来自- 广东广州
本帖最后由 monicazhang 于 2017-8-16 15:47 编辑 5 a  A1 q  w# n
: [/ c9 L8 e5 C6 B8 K# j1 P$ P
6 _) ^4 a( B* Q$ E

% y. ?( R5 f9 V' b1 e# d! j9 V
Jenkins是目前持续集成领域应用最为广泛的工具,通过Jenkins,项目可以进行自动化的编译、打包、分发与部署,通过持续不断的集成,减少了项目风险和重复过程,最终提高工作效率;Docker做为新的容器化的技术代表,能够保持跨环境的一致性,可以实现更快速地交付和部署;Apache Mesos做为一种分布式系统内核,可理解为一个集群管理器,通过对底层计算资源(物理机、虚拟机、云等)的CPU、内存、存储以及机器上的其他资源进行抽象,对抽象后的资源进行统一的管理调度,提供跨分布式应用或框架的资源隔离和共享,非常有效的提高了分布式集群的资源利用率,使机器计算资源变得弹性可扩展。
% {! D6 _4 n1 z0 U9 f8 x0 M7 Q
Mesos通过对运行在其上的Framework按照role进行分组和设置权重的方式,保证高优先级的任务优先获得资源。另外Mesos有非常完善的failover机制,可以做到无缝升降级和容灾处理。Mesos Master服务通过ZooKeeper保证高可用,周期性健康检查失败Mesos Agent会被自动下线,Agent恢复之前不会再被分配任务,Agent短暂性失联也不会影响正在运行的任务,而对于与Mesos Master失联的Framework,指定时间内(Mesos Framework failover_timeout)重新注册Mesos Master也不会影响正在运行的任务。

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

& h" f' \1 ^& f+ L0 C% ?0 ?
本文主要介绍基于Jenkins与Mesos快速搭建一套弹性的、高可用的持续集成环境。
2 c3 [3 `2 Z. C! g5 r% h
:Mesos已在FreeWheel公司用了一年时间,目前有超过90% Jenkins作业(CI总作业数约为13000个)通过Mesos提供的资源进行构建,平均每天构建近3000次,作业并发构建量高点时超过100个。
8 Y/ ~. ~' V" y
安装配置
, Y- r0 I/ @4 @2 _8 r1 k0 G
前提准备
; J" C) [) \( k, b' J4 n& ]$ h
版本信息:
% n" i- [+ r) A" d8 v) ^; ]9 R0 b
Mesos版本:1.3.0操作系统版本:Red Hat 7ZooKeeper版本: 3.4.6; j2 G, F+ f4 g/ W- |1 g
9 w% M7 `  Q# l( d; N, u
机器信息:) `( f$ M+ }, N
  V9 {0 @+ b, z2 b8 H+ T" w; t. E$ |( Z
3台Mesos Master:Mesos Master1: 192.168.0.91Mesos Master2: 192.168.0.93Mesos Master3: 192.168.0.12710台Mesos Agent:Mesos Agent1: 192.168.16.190Mesos Agent2: 192.168.16.191Mesos Agent3: 192.168.16.192... ...Mesos Agent10: 192.168.16.194( w+ j1 W6 A5 j( ?3 F7 q
* ]2 H. a8 |) f: D) `" o
Docker

6 H& M: N. O: @- P. ~. e$ i7 j( ^# t5 F
: 配置中需加 "-H unix:///var/run/docker.sock",对于CentOS或Red Hat,推荐Docker Storage Driver采用DeviceMapper的direct-lvm模式。2 `) J( l& q3 d& k, x3 N& `. K: ?
Jenkins安装配置
. x$ L: E) P; G" P6 P: o
Jenkins安装配置请参见官网:https://jenkins.io/doc/book/getting-started/installing/

8 j0 @3 {- P+ |/ |+ z  W
:JDK 1.8的默认垃圾回收算法ParallelGC会导致Jenkins周期性的hang(表现为几分至十几分钟主页无法打开),需将垃圾回收算法替换为 Concurrent Mark Sweep(CMS)或Garbage First(G1)以此减少GC延迟。
  A. L1 Y# N0 K5 Q
另外:对于Jenkins的JVM调优、容灾以及高可用等我司具备一定经验和教训,有需要了解的同学可留言交流。

% v9 n1 @/ h& E2 ]+ F
Mesos安装配置
5 x# v$ b* X( P7 Z( H1 `" W
方式1:源码编译安装
1 b0 b) W) o4 i: {  U
安装过程请参见官网:http://mesos.apache.org/gettingstarted
6 H1 D# \7 ^" G$ [6 f9 P/ K. P
方式2:YUM安装
/ T, a% k5 z' }9 |# d* N
安装Mesos依赖过程请参见官网:http://mesos.apache.org/gettingstarted
$ O# A+ p  o& S% |0 q
添加yum源:

% m0 Y+ w8 l! f% c7 lsudo rpm -Uvh http://repos.mesosphere.com/el/7 ... repo-7-3.noarch.rpm
1 B& j# @% }( j( f: ]. A; ?3 {2 A  [. z9 T$ e
安装最新版本:
4 T7 n, Y7 o1 f/ H7 ~% t- C, a, m% o( |0 i* K/ _+ n
sudo yum -y install mesos
" B0 F7 L6 \9 {6 h
9 b, B" u5 t9 f
或指定版本安装:
yum list mesos --showduplicates |sort -r0 H7 k. F; q5 o
+ T8 b% m3 E5 c3 i( R9 Q7 f
:Jenkins Master也需要安装Mesos,但无需启动Mesos服务。

) g3 {. G) n  e1 O
ZooKeeper安装

* }- N5 s5 l7 i  H% f请参见官网:https://zookeeper.apache.org/doc/trunk/zookeeperStarted.html, W8 K: G* i# R* f( A2 U. V
Mesos Master ZooKeeper配置
: ], p" M. {- }- @" h
1、 /etc/mesos/zk文件内容为ZooKeeper地址,示例如下:
zk://192.168.0.91:2181,192.168.0.93:2181,192.168.0.127:2181/mesos3 D" e9 i+ J! U0 T# u" s
2、3个ZooKeeper节点中/etc/zookeeper/conf/myid 分别配置1、2、3
3、将3个ZooKeeper节点中的/etc/zookeeper/conf/zoo.cfg,分别增加如下配置:1 M: ?5 E5 c  M% {7 _; l2 p1 i
server.1=192.168.0.91:2888:3888server.2=192.168.0.93:2888:3888server.3=192.168.0.127:2888:3888
% G% m" A! c' F, J
配置Mesos Master
5 B1 j% `3 O& ]$ n
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$ y0 e% o3 s' j" K
' Q2 Q: _0 d, r6 f0 F5 \( m
配置Mesos Agent

$ W2 \' \4 S# U$ V
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:文件内容留空2 O$ H7 S3 h* T9 |7 R* d

) I8 n/ Y& R7 f, ~8 n2 S+ I访问Mesos Master,地址如下:
6 g8 n" s4 }% H; n, n6 b& {http://192.168.0.91[93|127]:50508 Z: ?7 U5 Y' v6 C2 d, I( X8 G
! D1 J9 n2 ?, [  S" f! }) u8 P
Mesos Agent信息如下:
8 {: F# C, d/ C) B3 {- ?% N0 q

3 R/ a. W2 B$ U0 U# ~
Mesos将以上10个Mesos Agent的计算资源做了抽象,用户角度看来就像一个高配的计算机。

0 R( H$ k! Y. v7 @
Resources
3 ?& F  n4 K- h
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

5 t, u" I: K" r/ G" w
安装Mesos Plugin

- i5 b, Q- X2 I/ ~( \4 ]+ g5 J9 j3 T9 ~
配置Jenkins on Mesos
7 a7 G* F! L0 c6 j+ D- Y
配置Mesos Cloud信息:Manage Jenkins -> Configure System -> Mesos Cloud
+ Z& v/ N8 ^5 c) y8 V/ s
配置图示和重点参数说明如下:
5 N" E& {; Z  v5 X
  • Mesos native library path:Mesos lib库路径
  • Mesos Master [hostname:port]:ZooKeeper地址
  • Cloud ID:自动生成
  • Checkpointing:选择Yes. Enable Checkpointing的意义是Mesos Agent服务失败(例如升级或crash)不会影响正在运行的作业。

    ( e( ~( ]$ _) T, {6 J- ]

/ r  l! ]8 x; }5 r4 o
点击"Advanced...",配置Slave相关信息图示及重点参数说明如下:

9 \2 m/ ?5 u' w7 W
Label String:Jenkins label
8 c2 J. i" S' ^" t
说明:CPU最小可为千分之一核即0.001CPU,内存可为1MB。总分配给slave的CPU为Jenkins Slave CPUs (Minimum/Maximum number of Executors per Slave) * Jenkins Executor CPUs,分配内存总数与CPU计算方式类似。

1 g; `" n/ o& m; x' b, H7 v+ a
& n5 z% Q4 }! s  i1 u
点击"Advanced...",选中Use Docker Containerizer与Docker,配置用Docker做隔离相关信息图示及重点参数说明如下:& P' {) p2 [' D5 g

% O9 }& ~, }2 [. c$ E
Docker Force Pull Image:会强制从Docker Registry拉取Image。
+ u  Z3 k1 H# f1 V+ P! A6 @
说明:默认情况下Mesos会覆盖Dockerfile中的Entrypoint,一个workround方式是勾选Use custom docker command shell,并在Custom docker command shell中加上-c,如无Entrypoint,此步骤忽略。

; d% j% E+ a* g5 i1 ]- E' v0 S# ^# G% [3 X0 ^. B+ v- s3 t. O  D
" h$ C! @$ w. N0 I5 P
并在Dockerfile中末尾加上"/bin/sh", 示例如下:
NTRYPOINT ["/bin/bash", "--login", "--", "/tmp/entrypoint.sh", "/bin/sh"]. ]# P9 T" @# ]
如果有Docker化slave中执行Docker命令的需求(Docker in Docker),可配置如下:
+ Y+ K0 C' _+ r$ Z' P, U3 a
- q# N7 ?( m3 m" q* ^

2 t9 n2 C! p, _7 V" z/ y8 {另外,如果需要作业构建完成后,尽快销毁Container(超过slave idel时间)释放资源,可作如下配置:  J- c' w) W' j4 @
( E+ ]2 j) u" b8 \
通过Mesos运行Jenkins Job" V4 [8 E9 g$ N1 R* w

" E8 R8 `; I; d4 `1 y点击Job Configure -> Restrict where this project can be run -> Label Expression 刚刚在Jenkins Mesos Cloud上配置的label,配置好相关参数后,点击build,然后通过job的Console Output,可以看见:
% V/ t+ ^& r/ x0 R# Q! q1 E3 ~
9 Z2 v7 e* e# |8 J, _
其中mesos-jenkins-6d7291a458bb49b6ad26efcf3e26f11d-mesos-jenkins-sl为Jenkins slave名称。

% z" H# g. ~6 y! I; p在Mesos Web UI可以查看到正在构建的Jenkins job(Mesos task)。( c5 j3 j: w7 M$ a3 ]  i' M
/ T$ O3 M/ E! K) U# a3 b
如Slave launch失败或未达到预期,可以点击Sanbox查看stderr、 stdout。
3 h+ X3 Z$ b- H# n% r$ k, @& D& o

# L% p, b* m: h3 u调试过程2 h1 [$ l. ]* C" ?4 f+ ?9 Z- ]
下面是我总结的在Mesos上定位问题流程:* P0 s0 ]; n3 M. z, b. g# Q

& V% @) ^! [6 _8 T- X
远程登录到mesos container,举例如下:
0 g+ N. y6 u5 `3 r$ T
docker -H tcp://bjoepbm01.dev.fwmrm.net:2375 exec -it  mesos-d8df8fb0-1c86-450b-8d0b-f33047fe15a3-S1.d151118f-bf6d-4abf-bca6-f32a885938b7 bash
4 @# P% l8 n4 A# D9 b) d- G:可以在Docker daemon中指定 "-H tcp://0.0.0.0:2375",方便远程操作docker daemon。5 e/ t1 b/ ~* t" ?; e
Mesos 监控; h& Q; x  C2 }5 P8 N- x
Mesos的监控以纳入我司的ELK,通过ELK: ElastAlert对未满足预设定的条件进行报警, Mesos监控请参见官网:http://mesos.apache.org/documentation/latest/monitoring/

8 |% x+ D1 O( |  X6 }) ~一个月内CPU/Memory分配情况:7 s* y; [, n: P7 W/ N

' H* E' D4 y5 w* X& N' f, w
. `. y5 u2 w- k  \, w" k9 u
一个月内用Mesos 作业并发构建情况:: @# q% q7 Q8 t+ b1 `8 |
0 E' F4 ?$ S+ I4 b
报警举例:Mesos资源不足通过ElastAlert发送邮件报警。$ O8 q* U9 G$ N; U5 g

) q1 R% G; V: R( v& X2 H! S" q: H+ ]1 `% y& ]! Z, |/ z. ?# L1 E+ B' ~
遇到问题与经验
! j/ R9 l$ ~3 O! N. T8 ?& S
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’方法解决。

( a2 [! x) `. ?6 x# W9 U2、作业长时间在Jenkins队里等待构建:默认情况下,即使当前有空闲的executor,Jenkins默认等待复用正在运行作业的executor,可以通过Jenkins启动时加上如下参数直接利用空闲的executor:
( i9 z1 H& X: K! S2 t2 u5 {5 Y- z: x2 L, u
-Dhudson.slaves.NodeProvisioner.MARGIN=50 -Dhudson.slaves.NodeProvisioner.MARGIN0=0.85+ \+ S! L, u5 k2 L
3、由于Jenkins Slave是根据预先估计分配CPU、Memory等资源配额,会存在估计的误差,对于资源超分,解决思路是用Dockbeat监控每个作业的实际使用情况记录到ELK中,而后根据实际使用情况按需分配。

( z1 y! ?) r: p4 S: R  W' e如下图中的作业预申请2cpu,但就近10次的构建中最大cpu使用仅为0.511cpu。
/ m0 g0 p2 f1 Q  D+ d3 G
- c0 g- V7 g* ~7 V; [' R- R/ y; O
4、如构建作业时不希望复用slave环境,需要在Job配置中勾选Mesos Single-Use Slave,如下图: 7 H) ?: l, Z: ^3 e8 F- m2 w5 j

8 M( d& Z  M6 t  i
对应pipeline类型作业,如果想使用Mesos Single-Use Slave,可在pipeline 配置中写成如下形式:

9 |# z( D6 a# H4 c% e. b: \node('mylabel') {wrap([$class: 'MesosSingleUseSlave']) {    // build actions}}
' ^( Z6 e6 p6 S3 _8 j8 k6 H3 `& B7 o# x" f& F! z0 T
如同一个label下的作业只是部分用了Mesos Single-Use Slave功能,还是可能会出现slave被复用情况。

" C$ E- F' ~, j: `) t" A
解决办法通过自动化方式实现当前label下作业全部使用该功能,而后新建作业自动选择该选项。具体过程如下:
: p5 b) t6 m+ I/ L
修改代码如下文件:% u  C) H$ s( M8 q( }) y( Y
8 M# ?9 G/ ]/ y7 C" U
mesos-plugin/blob/master/src/main/java/org/jenkinsci/plugins/mesos/listener/MesosItemListener.java
. |3 W. B/ I% r6 ~" r2 o# G* {: ~
加入如下代码,执行mvn package命令重新build mesos plugin
3 b0 w! G6 H! X
/** * Listener for {@link Item} create * @param item */@Overridepublic 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);        }    }}
! B- h- C/ O2 \8 {$ N$ G3 j
0 r, N# i6 T* N
5、以非root(例如Jenkins)用户启动Container但需要执行sudo场景,可以用gosu或su-exec,推荐su-exec,c语言实现,仅10kb大小。具体使用可参考:https://github.com/tianon/gosu

! n/ h0 @, j% g5 X
6、通过Docker volume方式将Jenkins作业workspace挂在到网络文件系统(例如CEPH,NFS等)以减少GIT服务器请求压力。
4 U% B4 _# S+ S0 ^
7、设置Mesos Framework Role及weight,使优先级高的任务优先获得资源执行。

: |. N/ O/ i- o# C3 O. y8、/etc/sysctl.conf里面net.ipv4.ip_forward值设置为1  X$ n5 @+ n* i4 D
原创:西夏

' I# C3 H: u6 u" x! J0 I' _
2 n- _, Q: A" M; D9 Y. R; L6 c

# _) ^2 z2 o. G: N0 V% c4 \' J

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?点击获取邀请码 - 立即注册

x

本版积分规则

选择云运维时代的王牌讲师-长河老师,助你轻松入门ITIL Foundation培训课程

QQ|小黑屋|手机版|Archiver|ITIL先锋论坛五万运维人社区 ( 粤ICP备17056641号|网站地图

Baidu

GMT+8, 2018-6-20 06:16 , Processed in 0.178677 second(s), 37 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表