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

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

QQ登录

只需一步,快速开始

扫一扫,访问微社区

搜索
查看: 270|回复: 0

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

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

参加活动:0

组织活动:12

发表于 2017-8-16 15:45:04 | 显示全部楼层 |阅读模式 来自- 广东广州
本帖最后由 monicazhang 于 2017-8-16 15:47 编辑 : y5 u) D: v% D+ y& T- n
: n4 a( R9 B; W4 ?
0 G' D; x& |- J3 m0 _) t7 Z

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

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

& S4 _# z' K  J! M6 G9 V9 x! D* ?; k7 O
本文主要介绍基于Jenkins与Mesos快速搭建一套弹性的、高可用的持续集成环境。

5 {2 h$ `& d. z+ d:Mesos已在FreeWheel公司用了一年时间,目前有超过90% Jenkins作业(CI总作业数约为13000个)通过Mesos提供的资源进行构建,平均每天构建近3000次,作业并发构建量高点时超过100个。( @9 ?5 a0 t( X/ j4 }7 `* n
安装配置
+ S7 p9 D/ b- _" ~/ L/ V- l
前提准备
3 d9 e( `  x+ a8 Q
版本信息:
% i# L) h* _* G5 c( U
Mesos版本:1.3.0操作系统版本:Red Hat 7ZooKeeper版本: 3.4.6
: @" ~* m$ P" K0 M( t
+ G% |) e9 f) h- S" b8 t机器信息:
' S2 ~1 M) l" I# L( j* H' _
; Z+ l, l4 _- A: q! {% g' \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
# L+ M" \  x- p2 u8 Y
/ z6 p/ m/ x# N2 B2 }
Docker

) i: h/ ?/ p" ^8 ^
" ^8 l1 G7 |7 J/ a, T$ c: 配置中需加 "-H unix:///var/run/docker.sock",对于CentOS或Red Hat,推荐Docker Storage Driver采用DeviceMapper的direct-lvm模式。8 i3 h- Y1 E  u, Z
Jenkins安装配置

$ w+ b* c" d3 [4 U
Jenkins安装配置请参见官网:https://jenkins.io/doc/book/getting-started/installing/
/ X. P5 B3 `3 ^3 {1 Z- Q5 A9 o
:JDK 1.8的默认垃圾回收算法ParallelGC会导致Jenkins周期性的hang(表现为几分至十几分钟主页无法打开),需将垃圾回收算法替换为 Concurrent Mark Sweep(CMS)或Garbage First(G1)以此减少GC延迟。

6 R+ `" f7 m( Y2 u
另外:对于Jenkins的JVM调优、容灾以及高可用等我司具备一定经验和教训,有需要了解的同学可留言交流。
) W  A: z& Q- A1 c' d( z; h1 ]
Mesos安装配置
3 p# n7 B' e5 e
方式1:源码编译安装

$ j: L1 k. A/ Z! t. e安装过程请参见官网:http://mesos.apache.org/gettingstarted
$ M' ?: s$ X! x- n! y
方式2:YUM安装

/ y% k' F1 O  }
安装Mesos依赖过程请参见官网:http://mesos.apache.org/gettingstarted
% O3 _5 E& w9 o- `/ S2 g1 O: E
添加yum源:

; L5 f' C% G6 [8 t7 a/ ^  ?sudo rpm -Uvh http://repos.mesosphere.com/el/7 ... repo-7-3.noarch.rpm
* g3 L# [* ], ]1 d$ b& p" t6 c( r6 T- `0 b+ a  |: I$ c: R' g# ?0 s" K
安装最新版本:! B' K- _" z3 y9 i3 |! ^3 B3 [' |) Z

5 W2 G& `$ w  |0 Nsudo yum -y install mesos- P8 L& z/ G, Z( S3 n

* Q- J- X) M1 I+ T& f
或指定版本安装:
yum list mesos --showduplicates |sort -r
; N+ ]5 P' `- `
) @3 y9 B) @1 _2 B: E0 U* R
:Jenkins Master也需要安装Mesos,但无需启动Mesos服务。
/ Y. O, Z, J: h: L
ZooKeeper安装
+ U8 _% X$ s' \# L) S: V1 O& z
请参见官网:https://zookeeper.apache.org/doc/trunk/zookeeperStarted.html
0 I7 ?4 K/ l& M3 g: v( e
Mesos Master ZooKeeper配置
9 O( g4 k% R7 G+ V* e+ c1 y) a: k
1、 /etc/mesos/zk文件内容为ZooKeeper地址,示例如下:
zk://192.168.0.91:2181,192.168.0.93:2181,192.168.0.127:2181/mesos
$ H& K' N9 T6 X; g/ ^; h
2、3个ZooKeeper节点中/etc/zookeeper/conf/myid 分别配置1、2、3
3、将3个ZooKeeper节点中的/etc/zookeeper/conf/zoo.cfg,分别增加如下配置:
' M5 L0 K! e' E& ]* \server.1=192.168.0.91:2888:3888server.2=192.168.0.93:2888:3888server.3=192.168.0.127:2888:3888  N7 p; r" p; I
配置Mesos Master

8 K1 `. I! X% y  e* @0 M
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
$ `" b8 g, i* r& K  g1 u- d. t6 w! T  @% R7 [7 i
配置Mesos Agent
  x2 P1 W6 k2 n5 c. P0 k  v! p! w
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:文件内容留空
( i; C* H4 e7 L0 F; \$ u5 V# k5 l" E9 O
访问Mesos Master,地址如下:# u) O$ q/ [. Q" C/ u# c
http://192.168.0.91[93|127]:5050
' Q% H: y8 F/ B
  P* ~3 j) }) V" m- s# l
Mesos Agent信息如下:

. ~: t  q- @' t

  ]+ |& b+ e! S# z4 W( c
Mesos将以上10个Mesos Agent的计算资源做了抽象,用户角度看来就像一个高配的计算机。

% U5 u3 Q6 H# H$ |9 t
Resources

( J. U' i" m/ r8 a2 `) {$ y" K6 Q
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
. u: l+ S5 U. Z7 N5 m
安装Mesos Plugin
8 g2 i, w2 q0 i/ h2 U7 C9 n- _& b( B

, D4 ]3 I2 v5 `  }
配置Jenkins on Mesos

0 [& c) K) [& x4 d5 n4 E6 V/ |4 u
配置Mesos Cloud信息:Manage Jenkins -> Configure System -> Mesos Cloud

1 [5 l4 n/ W+ S1 }
配置图示和重点参数说明如下:
0 _! J  O4 z/ o- _1 j1 T
  • Mesos native library path:Mesos lib库路径
  • Mesos Master [hostname:port]:ZooKeeper地址
  • Cloud ID:自动生成
  • Checkpointing:选择Yes. Enable Checkpointing的意义是Mesos Agent服务失败(例如升级或crash)不会影响正在运行的作业。
    2 {  T0 h$ {6 l2 e: ]
, U$ W7 W& D/ d, U4 `
点击"Advanced...",配置Slave相关信息图示及重点参数说明如下:
8 }1 L7 R) D( l/ S% p
Label String:Jenkins label

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

; w5 _4 T0 t# X

  W' f6 `. |# c3 l  @' O点击"Advanced...",选中Use Docker Containerizer与Docker,配置用Docker做隔离相关信息图示及重点参数说明如下:/ l, [/ f: @# U
2 J' q6 T/ `* {, W
Docker Force Pull Image:会强制从Docker Registry拉取Image。

' d3 @+ M- R8 S7 Q) m( d2 j
说明:默认情况下Mesos会覆盖Dockerfile中的Entrypoint,一个workround方式是勾选Use custom docker command shell,并在Custom docker command shell中加上-c,如无Entrypoint,此步骤忽略。
4 P. Q1 c- z. i. O
7 p" e) \" [! Q* X/ {* R) N! ~; h

: ]4 m* w4 y) i4 [! A& A
并在Dockerfile中末尾加上"/bin/sh", 示例如下:
NTRYPOINT ["/bin/bash", "--login", "--", "/tmp/entrypoint.sh", "/bin/sh"]2 G- p3 B) z' A# i
如果有Docker化slave中执行Docker命令的需求(Docker in Docker),可配置如下:
( `- G) a, Z' t# q

4 z7 F' u& J' S" x6 g! e! `8 Y

3 j" d6 R. q  [% R另外,如果需要作业构建完成后,尽快销毁Container(超过slave idel时间)释放资源,可作如下配置:% a% D6 \  v2 _2 C: G) z

) m9 z0 x( U  ~- X: P% p- @通过Mesos运行Jenkins Job# P% S5 a! Y! H

3 ~. _: V+ n% t8 z2 z1 E点击Job Configure -> Restrict where this project can be run -> Label Expression 刚刚在Jenkins Mesos Cloud上配置的label,配置好相关参数后,点击build,然后通过job的Console Output,可以看见:
: D+ r- g+ y+ k% S* k" k

% r" |8 X3 l6 P) b9 O5 S
其中mesos-jenkins-6d7291a458bb49b6ad26efcf3e26f11d-mesos-jenkins-sl为Jenkins slave名称。
. A( h: J- f, D% \/ f% _; z
在Mesos Web UI可以查看到正在构建的Jenkins job(Mesos task)。
8 D1 [0 s9 a: z8 e9 f
; S+ ?. X# p- c0 |9 T
如Slave launch失败或未达到预期,可以点击Sanbox查看stderr、 stdout。* ?" H" ?4 Z8 ~* P2 a! N4 D
( x$ Z9 \  P4 {" i+ f7 i
调试过程( S. F5 v  Q2 ?2 I: q
下面是我总结的在Mesos上定位问题流程:7 n2 @# c5 t  K( n* R6 {3 g9 y

! K& s; Q0 [6 W" s7 r" \
远程登录到mesos container,举例如下:

% Q) Q8 u6 t# E2 Vdocker -H tcp://bjoepbm01.dev.fwmrm.net:2375 exec -it  mesos-d8df8fb0-1c86-450b-8d0b-f33047fe15a3-S1.d151118f-bf6d-4abf-bca6-f32a885938b7 bash
( ], T7 L; h9 N:可以在Docker daemon中指定 "-H tcp://0.0.0.0:2375",方便远程操作docker daemon。
3 V8 }+ ]. Y$ GMesos 监控% Q$ ]2 z3 D* O; l4 t
Mesos的监控以纳入我司的ELK,通过ELK: ElastAlert对未满足预设定的条件进行报警, Mesos监控请参见官网:http://mesos.apache.org/documentation/latest/monitoring/
* q1 V& _# A/ W/ p0 Y" w
一个月内CPU/Memory分配情况:
( C& x: V1 i8 Z' y+ J9 f$ w* e: ]

: m$ P: S* ^6 l- e8 L  G8 C0 Z2 }' N

% @* c5 T. A1 i; H/ W/ J/ H一个月内用Mesos 作业并发构建情况:9 r8 ?: {9 B$ V& x# I! t  l

7 P+ B: s, X' p( u- o8 _5 R报警举例:Mesos资源不足通过ElastAlert发送邮件报警。
& k) |. S/ E+ s' [* h: J6 L# T' \. d- `+ L) ^# P" Y% h4 e

- K% l) }  b% s
遇到问题与经验
9 P3 T3 q5 H- C$ e% N8 O* d
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’方法解决。
# J% D5 N/ T. F+ n7 ^: o3 {" \( J0 T# L
2、作业长时间在Jenkins队里等待构建:默认情况下,即使当前有空闲的executor,Jenkins默认等待复用正在运行作业的executor,可以通过Jenkins启动时加上如下参数直接利用空闲的executor:6 P# D" @) G, I, Y7 I7 T1 r
5 a5 w2 e' o7 z% Z' P5 h+ v3 s( W
-Dhudson.slaves.NodeProvisioner.MARGIN=50 -Dhudson.slaves.NodeProvisioner.MARGIN0=0.85
; q0 \) J, h! p+ J
3、由于Jenkins Slave是根据预先估计分配CPU、Memory等资源配额,会存在估计的误差,对于资源超分,解决思路是用Dockbeat监控每个作业的实际使用情况记录到ELK中,而后根据实际使用情况按需分配。

$ @2 V5 v. g  c+ ~4 N8 ?0 s* f如下图中的作业预申请2cpu,但就近10次的构建中最大cpu使用仅为0.511cpu。8 A; f/ i  P$ A0 _

8 @$ o7 d! W1 A; c4、如构建作业时不希望复用slave环境,需要在Job配置中勾选Mesos Single-Use Slave,如下图:
% q7 m8 ]4 W/ s
, s% A6 ^) R7 b3 W0 v( |
对应pipeline类型作业,如果想使用Mesos Single-Use Slave,可在pipeline 配置中写成如下形式:

) d2 ?4 K8 t9 h3 h3 y! \3 _node('mylabel') {wrap([$class: 'MesosSingleUseSlave']) {    // build actions}} ) Y. T7 W  B3 e' q4 J& B, k

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

* Q9 R+ [% p: ]3 g" y
解决办法通过自动化方式实现当前label下作业全部使用该功能,而后新建作业自动选择该选项。具体过程如下:

, b$ m& y" b$ }2 v修改代码如下文件:- w; o: _. m* d* W3 `# D% D

8 H+ T. P+ [' m& f2 ]1 t$ r9 U2 \7 wmesos-plugin/blob/master/src/main/java/org/jenkinsci/plugins/mesos/listener/MesosItemListener.java$ a5 j3 K1 [* \+ g- G8 g4 R  F, U
加入如下代码,执行mvn package命令重新build mesos plugin
& t- x" }6 Q6 a! a3 E
/** * 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);        }    }}
. g- O3 M) O; X) r' r, x2 i! x5 I3 e, q5 E, d1 m; p, x5 W
5、以非root(例如Jenkins)用户启动Container但需要执行sudo场景,可以用gosu或su-exec,推荐su-exec,c语言实现,仅10kb大小。具体使用可参考:https://github.com/tianon/gosu
7 v5 r! ?4 r( Q8 p9 y
6、通过Docker volume方式将Jenkins作业workspace挂在到网络文件系统(例如CEPH,NFS等)以减少GIT服务器请求压力。

& Z: f* [6 o. W% E6 c# a
7、设置Mesos Framework Role及weight,使优先级高的任务优先获得资源执行。

+ v' l. X3 a& p3 k1 n; [9 q8、/etc/sysctl.conf里面net.ipv4.ip_forward值设置为18 ~* R1 V2 v3 D  W8 V3 f2 e% B
原创:西夏

6 \- [  [  t/ g: P1 P* _6 L
- S4 f" M0 \- _0 u$ Y$ Z% t  d
7 R% C. @; U8 S4 `  @3 Q+ M

本帖子中包含更多资源

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

x

本版积分规则

团购课程最新动态

 

 

高品质!好口碑!

百分百通过率!

PeopleCertEXIN

国际授权资质!

ITIL Foundation北上广

2天精华班,包证书

ITIL Foundation三天精

讲,知名讲师,包证书

ITIL Expert 金牌讲师北

上广深11天,包证书

DevOps Foundation

2天热点认证班,包证书

ITSS 认证IT服务经理

4天课程,包证书

Prince2双证4天高级班

Cobit高端课程2天班

Togaf高端课程4天班

 

报名热线: 4008-060-230


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

Baidu

GMT+8, 2018-4-25 22:39 , Processed in 0.230916 second(s), 37 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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