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

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

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

QQ登录

只需一步,快速开始

扫一扫,访问微社区

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

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

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

参加活动:0

组织活动:12

发表于 2017-8-16 15:45:04 | 显示全部楼层 |阅读模式 来自- 广东广州
本帖最后由 monicazhang 于 2017-8-16 15:47 编辑   D5 V+ R7 P, @+ g- D8 f
+ O  k9 u( Y& t4 \) s
) w( ]- G6 r% ~5 g% U
8 A5 Z  i5 ]7 i8 u7 E1 H6 H, l
Jenkins是目前持续集成领域应用最为广泛的工具,通过Jenkins,项目可以进行自动化的编译、打包、分发与部署,通过持续不断的集成,减少了项目风险和重复过程,最终提高工作效率;Docker做为新的容器化的技术代表,能够保持跨环境的一致性,可以实现更快速地交付和部署;Apache Mesos做为一种分布式系统内核,可理解为一个集群管理器,通过对底层计算资源(物理机、虚拟机、云等)的CPU、内存、存储以及机器上的其他资源进行抽象,对抽象后的资源进行统一的管理调度,提供跨分布式应用或框架的资源隔离和共享,非常有效的提高了分布式集群的资源利用率,使机器计算资源变得弹性可扩展。
, i) l  t4 x$ i. ^! g& `
Mesos通过对运行在其上的Framework按照role进行分组和设置权重的方式,保证高优先级的任务优先获得资源。另外Mesos有非常完善的failover机制,可以做到无缝升降级和容灾处理。Mesos Master服务通过ZooKeeper保证高可用,周期性健康检查失败Mesos Agent会被自动下线,Agent恢复之前不会再被分配任务,Agent短暂性失联也不会影响正在运行的任务,而对于与Mesos Master失联的Framework,指定时间内(Mesos Framework failover_timeout)重新注册Mesos Master也不会影响正在运行的任务。

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

4 J9 D6 [+ |3 a( q* c& V
本文主要介绍基于Jenkins与Mesos快速搭建一套弹性的、高可用的持续集成环境。
& Z1 X) V7 x, t  D4 P9 j
:Mesos已在FreeWheel公司用了一年时间,目前有超过90% Jenkins作业(CI总作业数约为13000个)通过Mesos提供的资源进行构建,平均每天构建近3000次,作业并发构建量高点时超过100个。
+ X, n9 T) T9 x
安装配置
  H. j. C# [2 g+ ?7 k
前提准备
% |, l! X, T- H9 Z" ?' V) q; e
版本信息:

9 _  e: e8 u  d( XMesos版本:1.3.0操作系统版本:Red Hat 7ZooKeeper版本: 3.4.61 j, P! p9 P) ^" A+ h  u) U4 W) Q
& ]2 ]. G8 p" W! i
机器信息:* g  U" a: u2 j. b9 O( h
( a5 f' n. r3 x6 R; _' z" Z/ v' D
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
5 S/ n6 B) x; ]
5 y! Y: P' _* D9 W7 T  N- d
Docker
/ s  B$ t4 \  B: e# e' W, x. L
8 Q" @6 `0 J' a0 F& }& `! M3 D9 u
: 配置中需加 "-H unix:///var/run/docker.sock",对于CentOS或Red Hat,推荐Docker Storage Driver采用DeviceMapper的direct-lvm模式。+ K2 ~' ?# [" {( Y, x: I
Jenkins安装配置

& P) B" U% `3 \% A6 C/ g: s" W
Jenkins安装配置请参见官网:https://jenkins.io/doc/book/getting-started/installing/
* [  u9 v& `4 P0 [
:JDK 1.8的默认垃圾回收算法ParallelGC会导致Jenkins周期性的hang(表现为几分至十几分钟主页无法打开),需将垃圾回收算法替换为 Concurrent Mark Sweep(CMS)或Garbage First(G1)以此减少GC延迟。

2 F  G6 A9 ?& C! ?0 v( {
另外:对于Jenkins的JVM调优、容灾以及高可用等我司具备一定经验和教训,有需要了解的同学可留言交流。
9 p" L+ r5 |$ @3 h5 _
Mesos安装配置

5 l( }# y6 _) v# P' T0 p
方式1:源码编译安装

" e2 L2 Q) U3 X& T安装过程请参见官网:http://mesos.apache.org/gettingstarted
( N! c/ Q1 `# ~" @7 W9 {
方式2:YUM安装
0 A% p) b0 T  i8 y" f
安装Mesos依赖过程请参见官网:http://mesos.apache.org/gettingstarted
! H% g- X; a; F7 |
添加yum源:
1 G) H2 q4 g4 \6 e. g
sudo rpm -Uvh http://repos.mesosphere.com/el/7 ... repo-7-3.noarch.rpm$ x7 S5 |& ?7 K% Y# m- c3 Y

! G. ]3 Z4 ?5 C0 Q8 L" G安装最新版本:
" W, S, ^+ O) i! i; h  a8 p! O( z. ^, M) q9 u# m5 c
sudo yum -y install mesos) u3 R$ M+ W! R) r, V3 w8 w
( O9 _; Z( s  r; s$ q) x5 Q
或指定版本安装:
yum list mesos --showduplicates |sort -r1 o) Y  U. G2 T" |+ S2 Z( ~0 o
  ^+ R3 M* T; H/ Y. S
:Jenkins Master也需要安装Mesos,但无需启动Mesos服务。

, @3 c: u! |; K* e% e9 q
ZooKeeper安装
# p1 ?( J8 |, N8 ^  z; D
请参见官网:https://zookeeper.apache.org/doc/trunk/zookeeperStarted.html9 u) p, o+ O( R7 D% a/ E4 b& L
Mesos Master ZooKeeper配置

+ K+ b% I5 Y' V5 z
1、 /etc/mesos/zk文件内容为ZooKeeper地址,示例如下:
zk://192.168.0.91:2181,192.168.0.93:2181,192.168.0.127:2181/mesos: S% c* {( P5 C1 W+ R) Y
2、3个ZooKeeper节点中/etc/zookeeper/conf/myid 分别配置1、2、3
3、将3个ZooKeeper节点中的/etc/zookeeper/conf/zoo.cfg,分别增加如下配置:; P( Q. L' `2 ~2 E" e
server.1=192.168.0.91:2888:3888server.2=192.168.0.93:2888:3888server.3=192.168.0.127:2888:3888* g& }. V, l0 G: n+ c6 F) F
配置Mesos Master
9 e; s8 c, e0 |  m" P
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
, R2 m. ]# u, u
" ~* C9 r8 n, X. n
配置Mesos Agent

1 \$ R2 B2 z0 g$ _
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:文件内容留空/ \: e+ d3 Z: T  S- M3 |

( b5 t  ~$ i) J访问Mesos Master,地址如下:
3 L; y  q2 Z- m8 u" G$ qhttp://192.168.0.91[93|127]:5050
4 e+ H- ^  f9 _  C+ l5 w! d/ w/ W

. l" p" b) S+ F0 O+ d, S. k
Mesos Agent信息如下:
0 _; B* P7 l9 |6 c; F
, g0 y, J7 q( [7 v8 l  E! C
Mesos将以上10个Mesos Agent的计算资源做了抽象,用户角度看来就像一个高配的计算机。

, y. ^- w4 v" g7 c  b- p
Resources
5 f! a* c1 K1 N8 E% b) q" z
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
3 x6 h2 W2 l8 v
安装Mesos Plugin
4 ^- d( o) l/ e, P
4 e: ~: P$ ^! S+ R
配置Jenkins on Mesos
* N0 C' S* @& `5 G: D
配置Mesos Cloud信息:Manage Jenkins -> Configure System -> Mesos Cloud
' a. a  G2 j) B7 T. ?
配置图示和重点参数说明如下:
. v5 d4 a3 H; \6 [
  • Mesos native library path:Mesos lib库路径
  • Mesos Master [hostname:port]:ZooKeeper地址
  • Cloud ID:自动生成
  • Checkpointing:选择Yes. Enable Checkpointing的意义是Mesos Agent服务失败(例如升级或crash)不会影响正在运行的作业。

    . v* A6 c' Q$ }  m1 T% s" Y# A/ m

- N$ s6 ]" O8 G# L
点击"Advanced...",配置Slave相关信息图示及重点参数说明如下:

( A# m9 y6 ^3 W  p
Label String:Jenkins label

* z( T7 N$ z4 t( }& u+ ]4 S
说明:CPU最小可为千分之一核即0.001CPU,内存可为1MB。总分配给slave的CPU为Jenkins Slave CPUs (Minimum/Maximum number of Executors per Slave) * Jenkins Executor CPUs,分配内存总数与CPU计算方式类似。

7 W0 I0 R! m0 T' O, s' F
3 B$ [- l; C5 d- x9 n4 b5 [
点击"Advanced...",选中Use Docker Containerizer与Docker,配置用Docker做隔离相关信息图示及重点参数说明如下:
( F+ r: t/ i- K6 N) p, O
! a3 h: _5 f% C2 L* \$ u( M
Docker Force Pull Image:会强制从Docker Registry拉取Image。
/ U5 j! f# e# _( z8 r6 e
说明:默认情况下Mesos会覆盖Dockerfile中的Entrypoint,一个workround方式是勾选Use custom docker command shell,并在Custom docker command shell中加上-c,如无Entrypoint,此步骤忽略。

) k6 Y7 ]' f& b0 C& R6 w2 n. k. s
8 B4 |% G4 w) z4 p$ n) b2 R+ ?
并在Dockerfile中末尾加上"/bin/sh", 示例如下:
NTRYPOINT ["/bin/bash", "--login", "--", "/tmp/entrypoint.sh", "/bin/sh"]
9 h" r5 k9 a3 T5 F: ]0 o* f  D
如果有Docker化slave中执行Docker命令的需求(Docker in Docker),可配置如下:

7 n. y5 w% S: A/ K
( \% h- ]' G( p# H7 Q6 n# j" Y

  ]4 ~* M5 j6 W& x5 y另外,如果需要作业构建完成后,尽快销毁Container(超过slave idel时间)释放资源,可作如下配置:
) Q1 j, W% G# D1 U- h
7 t' y, E4 ^2 Z) o
通过Mesos运行Jenkins Job4 E5 U) W! S' U# W, J3 R/ s

5 S/ V' [* O* A; l  n点击Job Configure -> Restrict where this project can be run -> Label Expression 刚刚在Jenkins Mesos Cloud上配置的label,配置好相关参数后,点击build,然后通过job的Console Output,可以看见:
; L* }* u2 S; w4 f1 l
6 c/ z1 ]6 }2 K" p+ d* |' z
其中mesos-jenkins-6d7291a458bb49b6ad26efcf3e26f11d-mesos-jenkins-sl为Jenkins slave名称。

& ]$ E( w6 _" g/ k" u在Mesos Web UI可以查看到正在构建的Jenkins job(Mesos task)。9 E" o* D' ]6 N5 o+ Y
  Z0 }) a0 a9 y( J, r
如Slave launch失败或未达到预期,可以点击Sanbox查看stderr、 stdout。( U' ?( a% ?$ @7 e9 n
, A/ Q8 O; B' ?
调试过程* G; N8 h# g3 W! K0 h& R/ W
下面是我总结的在Mesos上定位问题流程:0 n5 F/ y. ~; K; h/ s
. A: o# c, F" e2 V
远程登录到mesos container,举例如下:

% C( q4 ^( |% T& m2 Y- k% Hdocker -H tcp://bjoepbm01.dev.fwmrm.net:2375 exec -it  mesos-d8df8fb0-1c86-450b-8d0b-f33047fe15a3-S1.d151118f-bf6d-4abf-bca6-f32a885938b7 bash% ~  S2 W4 g. G: [8 l8 e1 F% S8 G% m
:可以在Docker daemon中指定 "-H tcp://0.0.0.0:2375",方便远程操作docker daemon。
" M- r  W  R  a0 ^% WMesos 监控
! z7 t" p1 T. M3 Y+ K  ^$ S9 ^/ X
Mesos的监控以纳入我司的ELK,通过ELK: ElastAlert对未满足预设定的条件进行报警, Mesos监控请参见官网:http://mesos.apache.org/documentation/latest/monitoring/
9 ]9 \0 m7 U7 d
一个月内CPU/Memory分配情况:
' f1 O. J1 t  q7 G' A# {

" w# K! q  `8 m& o( p- C

! o% _* a+ R4 _" L一个月内用Mesos 作业并发构建情况:
0 C9 Q# _, i5 y2 P: S

. ^% P. @2 ~2 }2 E. [$ B* U% K" _; s报警举例:Mesos资源不足通过ElastAlert发送邮件报警。
4 v8 k* B1 U( `) e
2 o* _3 O# f; @& i. Q6 i; h& K9 Q7 B0 b; F
遇到问题与经验

/ ~& F* v+ R: g+ t$ g4 N
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’方法解决。
9 T( n' J, \1 K( }  z( h
2、作业长时间在Jenkins队里等待构建:默认情况下,即使当前有空闲的executor,Jenkins默认等待复用正在运行作业的executor,可以通过Jenkins启动时加上如下参数直接利用空闲的executor:
3 o3 Z1 u8 W# _; w& B9 Z" w1 D+ u/ x) [" l) X3 v
-Dhudson.slaves.NodeProvisioner.MARGIN=50 -Dhudson.slaves.NodeProvisioner.MARGIN0=0.85& u) L3 B  w, y
3、由于Jenkins Slave是根据预先估计分配CPU、Memory等资源配额,会存在估计的误差,对于资源超分,解决思路是用Dockbeat监控每个作业的实际使用情况记录到ELK中,而后根据实际使用情况按需分配。
9 u8 s: i& f& K0 v" H1 n$ i5 a
如下图中的作业预申请2cpu,但就近10次的构建中最大cpu使用仅为0.511cpu。
( n/ C) u: ?2 r8 U' k
: S. Y+ H8 [4 Z2 {4 X1 ~
4、如构建作业时不希望复用slave环境,需要在Job配置中勾选Mesos Single-Use Slave,如下图:
  X. Z1 N1 j' m) ^  f+ w4 Y
, ]7 _+ f8 G+ I
对应pipeline类型作业,如果想使用Mesos Single-Use Slave,可在pipeline 配置中写成如下形式:

& P4 L% S7 k3 D4 A, Anode('mylabel') {wrap([$class: 'MesosSingleUseSlave']) {    // build actions}} " k5 [% n5 a- C5 A3 R

" l1 p% w9 i, M& G
如同一个label下的作业只是部分用了Mesos Single-Use Slave功能,还是可能会出现slave被复用情况。

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

4 h, Y% \4 a! J' H( ^4 L2 @修改代码如下文件:0 g) w% l+ Y9 e" P( O

9 z& h0 v' _. k8 |! \mesos-plugin/blob/master/src/main/java/org/jenkinsci/plugins/mesos/listener/MesosItemListener.java) c2 ?; e$ B5 p  o( a- @5 a
加入如下代码,执行mvn package命令重新build mesos plugin
% ?1 S3 L+ b. C' P& ]
/** * 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);        }    }}" E; d2 P- s. w3 y0 P# j0 I, Q3 m
6 {2 C4 q. \" L/ e+ e; ?  \5 y
5、以非root(例如Jenkins)用户启动Container但需要执行sudo场景,可以用gosu或su-exec,推荐su-exec,c语言实现,仅10kb大小。具体使用可参考:https://github.com/tianon/gosu

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

; z8 `" |8 T/ F) i
7、设置Mesos Framework Role及weight,使优先级高的任务优先获得资源执行。
5 Q+ e8 g+ D( }3 S5 E4 X
8、/etc/sysctl.conf里面net.ipv4.ip_forward值设置为1: R$ r1 q0 d* R
原创:西夏

& ?7 R* d; z% O* Y
! R6 t" @5 ?- {/ J! ^: u
9 @0 ^% p2 d  Y, E- m

本帖子中包含更多资源

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

x

本版积分规则

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

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

Baidu

GMT+8, 2018-8-21 23:35 , Processed in 0.258094 second(s), 35 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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