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

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

 找回密码
 微信、QQ、手机号一键注册

扫描二维码登录本站

QQ登录

只需一步,快速开始

艾拓先锋
搜索
查看: 516|回复: 0

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

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

参加活动:0

组织活动:12

发表于 2017-8-16 15:45:04 | 显示全部楼层 |阅读模式 来自- 广东广州
本帖最后由 monicazhang 于 2017-8-16 15:47 编辑 3 b  \4 n" v# Y- X! X
- z# y+ T- y( {5 }2 {2 v& t
0?wx_fmt=jpeg.jpg
  F5 G' |- C+ m! ^# ^
7 f; X  V! o3 R  X: S" I" Y: z
Jenkins是目前持续集成领域应用最为广泛的工具,通过Jenkins,项目可以进行自动化的编译、打包、分发与部署,通过持续不断的集成,减少了项目风险和重复过程,最终提高工作效率;Docker做为新的容器化的技术代表,能够保持跨环境的一致性,可以实现更快速地交付和部署;Apache Mesos做为一种分布式系统内核,可理解为一个集群管理器,通过对底层计算资源(物理机、虚拟机、云等)的CPU、内存、存储以及机器上的其他资源进行抽象,对抽象后的资源进行统一的管理调度,提供跨分布式应用或框架的资源隔离和共享,非常有效的提高了分布式集群的资源利用率,使机器计算资源变得弹性可扩展。

1 ^: g6 U2 A5 D+ h1 @9 P
Mesos通过对运行在其上的Framework按照role进行分组和设置权重的方式,保证高优先级的任务优先获得资源。另外Mesos有非常完善的failover机制,可以做到无缝升降级和容灾处理。Mesos Master服务通过ZooKeeper保证高可用,周期性健康检查失败Mesos Agent会被自动下线,Agent恢复之前不会再被分配任务,Agent短暂性失联也不会影响正在运行的任务,而对于与Mesos Master失联的Framework,指定时间内(Mesos Framework failover_timeout)重新注册Mesos Master也不会影响正在运行的任务。
8 M- P2 I- ?7 h! o
传统的以实体机或虚拟机做为Jenkins slave方式,存在部署构建环境复杂、构建环境单点、不一致、作业构建时资源竞争以及资源利用不均衡等诸多问题。而Mesos通过Docker Container做隔离,将构建依赖打包到Docker Image中,保证了构建环境的一致性。Jenkins Master可以在构建作业构建动态Mesos资源申请做为slave节点,并在构建完成后将资源归还给Mesos(也可以一直保留)。Jenkins、Docker以及Mesos的结合,从根本上解决了传统slave构建环境单点、构建环境一致性、作业构建资源竞争以及利用不均衡等问题。
0 E7 t9 D' R6 U, J, c7 ?
本文主要介绍基于Jenkins与Mesos快速搭建一套弹性的、高可用的持续集成环境。

9 b/ D) X9 o+ u2 H:Mesos已在FreeWheel公司用了一年时间,目前有超过90% Jenkins作业(CI总作业数约为13000个)通过Mesos提供的资源进行构建,平均每天构建近3000次,作业并发构建量高点时超过100个。7 ?: c3 v7 @3 l9 ~$ h7 @
安装配置
/ T/ m2 v% ?' M
前提准备
2 W( |3 \7 U! j8 w  }6 d' J
版本信息:

* V, o$ ^1 _6 H9 c# BMesos版本:1.3.0操作系统版本:Red Hat 7ZooKeeper版本: 3.4.6) v5 G' {: M, G7 P

; T+ d) R+ O* _6 ^# x/ x机器信息:
9 l! }6 n8 T" c9 ~( l. g
+ E# m! S* ~$ g2 t" m- `) m3台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+ l9 ]' y8 a8 ~! X' }/ D
8 W# F4 h/ I- f+ a# x' U5 u1 y
Docker
$ m4 G9 O( Y" S% x
; C% \% Z+ k  W. v- m
: 配置中需加 "-H unix:///var/run/docker.sock",对于CentOS或Red Hat,推荐Docker Storage Driver采用DeviceMapper的direct-lvm模式。: q! j" f( h+ z% R: O. U
Jenkins安装配置
! k7 W, `4 C1 z4 |
Jenkins安装配置请参见官网:https://jenkins.io/doc/book/getting-started/installing/

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

8 ], K. k: X" i( Z. ]' Y0 O
另外:对于Jenkins的JVM调优、容灾以及高可用等我司具备一定经验和教训,有需要了解的同学可留言交流。

" s0 i  o8 @1 i. w& t6 D  _
Mesos安装配置

7 j! Y- R+ O8 g5 X1 P8 t# i# b
方式1:源码编译安装

7 P- S1 V2 L# N& w9 z  m安装过程请参见官网:http://mesos.apache.org/gettingstarted2 O& t$ g  S" @6 [
方式2:YUM安装

# d" K* {( [4 q% w3 o# v" H! G% A
安装Mesos依赖过程请参见官网:http://mesos.apache.org/gettingstarted
0 P1 l3 Y9 A% i: O# m
添加yum源:
( x) t: Q1 x+ o! ]5 s. Q6 n
sudo rpm -Uvh http://repos.mesosphere.com/el/7 ... repo-7-3.noarch.rpm
- K* _2 d9 h# ?& f% \
* f% e, P  o" {* z% g) c0 B/ @+ K安装最新版本:
& P0 ]& b7 L6 T3 [" Y1 C) a# h) Q- U/ `9 O& n( B' [
sudo yum -y install mesos' h* t6 e: ~5 D' r" @8 ~
4 b' R4 @) l4 J% t  `& @
或指定版本安装:
yum list mesos --showduplicates |sort -r
' K0 v! ~1 ]8 a1 H+ h1 |9 g/ G+ l+ ?9 T' T9 \4 ~. k0 }
:Jenkins Master也需要安装Mesos,但无需启动Mesos服务。
* Y5 L9 U! [2 B5 U2 V" ~
ZooKeeper安装

! q, ~1 x% q/ {3 M( g* r1 b, d& ]请参见官网:https://zookeeper.apache.org/doc/trunk/zookeeperStarted.html! v: X% @! G' J
Mesos Master ZooKeeper配置
( I* |# x# B  p
1、 /etc/mesos/zk文件内容为ZooKeeper地址,示例如下:
zk://192.168.0.91:2181,192.168.0.93:2181,192.168.0.127:2181/mesos/ L% L1 d9 n  |5 l
2、3个ZooKeeper节点中/etc/zookeeper/conf/myid 分别配置1、2、3
3、将3个ZooKeeper节点中的/etc/zookeeper/conf/zoo.cfg,分别增加如下配置:
& [  c* q$ t- `$ S! pserver.1=192.168.0.91:2888:3888server.2=192.168.0.93:2888:3888server.3=192.168.0.127:2888:3888
2 B7 k2 @" @) w; O
配置Mesos Master
, D$ N# V, g: e. E
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/ A$ H" L: k2 T. U, {: T* L

9 x8 R$ a1 w; b6 f; U* V9 d; l
配置Mesos Agent
9 X8 }9 a+ }: L2 N
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:文件内容留空
) }3 _+ C' t  C% {7 h0 l9 }" d$ S' v) N4 p
访问Mesos Master,地址如下:
  w. |# i, U1 q0 B& Rhttp://192.168.0.91[93|127]:5050
2 S  D% y' X6 x; b
0?wx_fmt=jpeg.jpg
4 G0 D4 Q% e! P  `- m) |8 o9 d
Mesos Agent信息如下:

' k; `: X( ^$ F* D' z
0?wx_fmt=jpeg.jpg

0 r6 i# B+ h0 ^2 O" p
Mesos将以上10个Mesos Agent的计算资源做了抽象,用户角度看来就像一个高配的计算机。
1 w/ `3 g5 c9 G( c/ q
Resources

" w; o! A0 d, Q3 g9 d
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
! U7 `7 n* j/ G) z" i; K
安装Mesos Plugin

. j( z6 Q& Y6 p5 O/ u  ?1 B8 K% Y* y# f$ F" `
配置Jenkins on Mesos
- D* g6 Q& y5 w, u
配置Mesos Cloud信息:Manage Jenkins -> Configure System -> Mesos Cloud
; U* C* \9 |8 g% S$ |; l
配置图示和重点参数说明如下:

& M( |$ x3 t; _8 C8 Q+ ]
  • Mesos native library path:Mesos lib库路径
  • Mesos Master [hostname:port]:ZooKeeper地址
  • Cloud ID:自动生成
  • Checkpointing:选择Yes. Enable Checkpointing的意义是Mesos Agent服务失败(例如升级或crash)不会影响正在运行的作业。
    0?wx_fmt=jpeg.jpg

    - v8 t! q: g& R
! I. n2 \0 H' l9 [9 e. s
点击"Advanced...",配置Slave相关信息图示及重点参数说明如下:

' G4 ^' t4 O$ _1 m
Label String:Jenkins label
3 q. c: V' g6 k5 t
说明:CPU最小可为千分之一核即0.001CPU,内存可为1MB。总分配给slave的CPU为Jenkins Slave CPUs (Minimum/Maximum number of Executors per Slave) * Jenkins Executor CPUs,分配内存总数与CPU计算方式类似。

( u" P* `) C5 ^- V9 J
0?wx_fmt=jpeg.jpg

' Y! r# V; g0 J点击"Advanced...",选中Use Docker Containerizer与Docker,配置用Docker做隔离相关信息图示及重点参数说明如下:) j  K' G7 L1 e6 r6 h' K9 [
0?wx_fmt=jpeg.jpg
/ [6 \  v% {, M! e/ a' J" M' g$ L
Docker Force Pull Image:会强制从Docker Registry拉取Image。

+ G- M1 d& y8 E7 P, Q5 I
说明:默认情况下Mesos会覆盖Dockerfile中的Entrypoint,一个workround方式是勾选Use custom docker command shell,并在Custom docker command shell中加上-c,如无Entrypoint,此步骤忽略。
9 X0 y2 m1 D; K
! a% \3 }* g( V( M( D
0?wx_fmt=jpeg.jpg
7 ^8 @1 R1 i0 ^+ m0 n7 T
并在Dockerfile中末尾加上"/bin/sh", 示例如下:
NTRYPOINT ["/bin/bash", "--login", "--", "/tmp/entrypoint.sh", "/bin/sh"]& X5 W1 K3 V+ Y1 l: Z; V7 L
如果有Docker化slave中执行Docker命令的需求(Docker in Docker),可配置如下:

0 Q# R7 d8 F: `, ~: u: T, x9 d/ @  f* B- |; x
0?wx_fmt=jpeg.jpg

+ H$ M) o$ B- e7 Z& Y另外,如果需要作业构建完成后,尽快销毁Container(超过slave idel时间)释放资源,可作如下配置:3 y$ G7 Z# d0 ?9 e* {
0?wx_fmt=jpeg.jpg

) I6 s( q$ Z# F! q) P通过Mesos运行Jenkins Job
! D% X2 M; A' p* v& O: N
5 i0 Y" ]" J) `5 b7 O9 K点击Job Configure -> Restrict where this project can be run -> Label Expression 刚刚在Jenkins Mesos Cloud上配置的label,配置好相关参数后,点击build,然后通过job的Console Output,可以看见:
9 M1 T$ x# P" P; ], f& d6 a
0?wx_fmt=jpeg.jpg

, r! `' t% C; s$ F2 ^% s
其中mesos-jenkins-6d7291a458bb49b6ad26efcf3e26f11d-mesos-jenkins-sl为Jenkins slave名称。

' M5 u' [% X5 E0 ?在Mesos Web UI可以查看到正在构建的Jenkins job(Mesos task)。& `% w  I9 e1 k) U1 C
0?wx_fmt=jpeg.jpg

* Q8 X0 Y$ g9 L3 X9 a. H如Slave launch失败或未达到预期,可以点击Sanbox查看stderr、 stdout。/ t( p/ C4 ?; i/ D' `5 N* G
0?wx_fmt=jpeg.jpg
0 Z5 l- ^/ N5 s# l$ q0 |' V/ H
调试过程
& B* a1 q2 ^" N3 ?# \; R7 s下面是我总结的在Mesos上定位问题流程:
9 C- Q8 n$ U) l3 c* M( ^. Y+ e
0?wx_fmt=png.jpg
" c' }; Q, p# M
远程登录到mesos container,举例如下:
: ~/ \& T* l* o3 ^1 f# N6 z; j# S
docker -H tcp://bjoepbm01.dev.fwmrm.net:2375 exec -it  mesos-d8df8fb0-1c86-450b-8d0b-f33047fe15a3-S1.d151118f-bf6d-4abf-bca6-f32a885938b7 bash- d: k5 C% G6 j) G9 U% Y
:可以在Docker daemon中指定 "-H tcp://0.0.0.0:2375",方便远程操作docker daemon。
; T' A, P: M! E& c: Q2 ~5 \" |Mesos 监控( U. e3 u/ E& V$ x& o, p. f+ [( n6 Y
Mesos的监控以纳入我司的ELK,通过ELK: ElastAlert对未满足预设定的条件进行报警, Mesos监控请参见官网:http://mesos.apache.org/documentation/latest/monitoring/

, H! r, h# I( x, _! p一个月内CPU/Memory分配情况:
9 r; \. _$ [# S, _% r
0?wx_fmt=jpeg.jpg
) x2 N& _  [8 G6 \# n0 _$ m7 n/ u7 j
0?wx_fmt=jpeg.jpg

0 ^3 L* `( i  w6 C4 C( y$ }4 h一个月内用Mesos 作业并发构建情况:5 m, P2 c- O  G# A) P
0?wx_fmt=jpeg.jpg

# f. c2 ?) k$ e5 U" @; [$ c8 `报警举例:Mesos资源不足通过ElastAlert发送邮件报警。5 ~  d5 T$ ?8 G/ P
& P8 u, |6 l. n- R* V; d: Q
% z8 P/ V+ t, r# B. _+ p
遇到问题与经验

1 M1 N1 t+ Z7 N: t% Y
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’方法解决。

. Q9 ?. X2 d: ?. U5 u2、作业长时间在Jenkins队里等待构建:默认情况下,即使当前有空闲的executor,Jenkins默认等待复用正在运行作业的executor,可以通过Jenkins启动时加上如下参数直接利用空闲的executor:6 L8 X6 {6 R+ }9 F% S: m6 Z3 L
. |  W+ e1 F7 q5 N, Z0 G2 v
-Dhudson.slaves.NodeProvisioner.MARGIN=50 -Dhudson.slaves.NodeProvisioner.MARGIN0=0.855 d% \: P, j& t% Y8 ?/ o
3、由于Jenkins Slave是根据预先估计分配CPU、Memory等资源配额,会存在估计的误差,对于资源超分,解决思路是用Dockbeat监控每个作业的实际使用情况记录到ELK中,而后根据实际使用情况按需分配。
/ g6 O& X" S' X6 ^' K4 K
如下图中的作业预申请2cpu,但就近10次的构建中最大cpu使用仅为0.511cpu。! t! `% t* M& M' ]% J4 Z  @
0?wx_fmt=jpeg.jpg

, B9 T) {3 f) `) j4、如构建作业时不希望复用slave环境,需要在Job配置中勾选Mesos Single-Use Slave,如下图: ( h5 t! K5 Z- ?, g, c4 f' R  k  Z
0?wx_fmt=png.jpg
+ C8 q3 o, u! r" l# K4 c% ^: F
对应pipeline类型作业,如果想使用Mesos Single-Use Slave,可在pipeline 配置中写成如下形式:

4 e0 l- g# `+ B! x5 S* F/ Inode('mylabel') {wrap([$class: 'MesosSingleUseSlave']) {    // build actions}}
* |  e2 |7 e# N9 z3 X1 |: e" D7 m. m: q: k' E" s8 n
如同一个label下的作业只是部分用了Mesos Single-Use Slave功能,还是可能会出现slave被复用情况。
: z( w2 c- q. A2 m  a
解决办法通过自动化方式实现当前label下作业全部使用该功能,而后新建作业自动选择该选项。具体过程如下:

3 k6 a) g$ \2 p修改代码如下文件:
9 v! N5 X/ O- m  P
6 ^6 n. Y2 H& d! Cmesos-plugin/blob/master/src/main/java/org/jenkinsci/plugins/mesos/listener/MesosItemListener.java
  q0 g3 I- @8 b1 A) b" `
加入如下代码,执行mvn package命令重新build mesos plugin

8 _: R2 d. |9 `+ K) s/** * 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);        }    }}
0 g- f" g+ Z7 p; y, C2 \$ K3 u0 t& P
5、以非root(例如Jenkins)用户启动Container但需要执行sudo场景,可以用gosu或su-exec,推荐su-exec,c语言实现,仅10kb大小。具体使用可参考:https://github.com/tianon/gosu
- y& k: Z' j( l* G& N1 c  R
6、通过Docker volume方式将Jenkins作业workspace挂在到网络文件系统(例如CEPH,NFS等)以减少GIT服务器请求压力。

5 e, R! s0 b7 A0 y  @
7、设置Mesos Framework Role及weight,使优先级高的任务优先获得资源执行。
6 y- {- [1 Z6 K6 ^
8、/etc/sysctl.conf里面net.ipv4.ip_forward值设置为1* z2 e+ N9 g, {
原创:西夏

, w8 b+ ], H# ?6 i: K: {
! o8 \  G- O" f( v. [' E  @& |; B, C
0 w1 Q/ X3 u8 g" n1 |: E! R

本版积分规则

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

QQ|小黑屋|手机版|Archiver|艾拓先锋网 ( 粤ICP备11099876号-1|网站地图

Baidu

GMT+8, 2018-12-13 00:59 , Processed in 0.243909 second(s), 31 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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