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

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

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

扫描二维码登录本站

QQ登录

只需一步,快速开始

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

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

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

参加活动:0

组织活动:12

发表于 2017-8-16 15:45:04 | 显示全部楼层 |阅读模式 来自- 广东广州
本帖最后由 monicazhang 于 2017-8-16 15:47 编辑
3 M0 p- m5 {, [$ f1 A* i7 L4 T- k) Q: N; r+ F" X
0?wx_fmt=jpeg.jpg
% @9 P7 h4 B* |! q9 F& y0 f

0 Z+ J; E+ X$ C/ N( x0 A& Y
Jenkins是目前持续集成领域应用最为广泛的工具,通过Jenkins,项目可以进行自动化的编译、打包、分发与部署,通过持续不断的集成,减少了项目风险和重复过程,最终提高工作效率;Docker做为新的容器化的技术代表,能够保持跨环境的一致性,可以实现更快速地交付和部署;Apache Mesos做为一种分布式系统内核,可理解为一个集群管理器,通过对底层计算资源(物理机、虚拟机、云等)的CPU、内存、存储以及机器上的其他资源进行抽象,对抽象后的资源进行统一的管理调度,提供跨分布式应用或框架的资源隔离和共享,非常有效的提高了分布式集群的资源利用率,使机器计算资源变得弹性可扩展。

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

, R) g5 L3 b7 l:Mesos已在FreeWheel公司用了一年时间,目前有超过90% Jenkins作业(CI总作业数约为13000个)通过Mesos提供的资源进行构建,平均每天构建近3000次,作业并发构建量高点时超过100个。
+ g1 z1 |3 i: A, b3 ~) D+ o
安装配置

2 Z  x6 g. D5 a- S
前提准备

! O9 N+ k+ Y- `9 l  z% x4 u* H5 q
版本信息:

7 ]& }5 ~, B2 B5 `: N  a' PMesos版本:1.3.0操作系统版本:Red Hat 7ZooKeeper版本: 3.4.6' l% F) n3 ^$ N0 \* N" Q. i/ Y

0 ?' ?1 G' T) E4 I2 Z* F: j机器信息:0 K, {$ E' I% C" z

% ?; n1 i, i2 v2 c9 O' D3台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- u$ u% D& F6 H

' f8 ]) W& ~' {  E! @
Docker
, K/ I- V4 d0 i
# Z. t" Y6 }" {3 e
: 配置中需加 "-H unix:///var/run/docker.sock",对于CentOS或Red Hat,推荐Docker Storage Driver采用DeviceMapper的direct-lvm模式。: Q+ {5 U9 z  k- v$ j/ q
Jenkins安装配置
4 I1 D$ r/ V% H7 n  d
Jenkins安装配置请参见官网:https://jenkins.io/doc/book/getting-started/installing/

) v" w$ {; |+ v
:JDK 1.8的默认垃圾回收算法ParallelGC会导致Jenkins周期性的hang(表现为几分至十几分钟主页无法打开),需将垃圾回收算法替换为 Concurrent Mark Sweep(CMS)或Garbage First(G1)以此减少GC延迟。
/ X$ q8 G. T6 s# h2 E# }
另外:对于Jenkins的JVM调优、容灾以及高可用等我司具备一定经验和教训,有需要了解的同学可留言交流。

8 ]# \/ p1 q. a  I
Mesos安装配置

& l# n; V8 K* S7 f3 x
方式1:源码编译安装
1 R  {! S5 b' X* ^# ~: Y5 F
安装过程请参见官网:http://mesos.apache.org/gettingstarted
/ `& i6 w3 L4 P6 H2 R1 E# ?2 y
方式2:YUM安装
# ^+ K# [) \$ C5 I! V& \& f% R0 A
安装Mesos依赖过程请参见官网:http://mesos.apache.org/gettingstarted

1 h$ v2 a1 O# ~- z
添加yum源:
" K4 L: |- K6 ~
sudo rpm -Uvh http://repos.mesosphere.com/el/7 ... repo-7-3.noarch.rpm1 |" X! D8 h7 ?7 H' n% z) b

7 J# _8 f% z' ?% z安装最新版本:
% b1 k4 [- \' D1 L  r4 a3 X$ s! w9 {9 T* ?1 y9 _0 j
sudo yum -y install mesos
# A' ~! m! z3 j+ ]. T% U- ~- B$ H  U2 {% {% z$ W
或指定版本安装:
yum list mesos --showduplicates |sort -r' [% T1 g7 d( P1 P

1 z" K. m: m  p* f" [4 @0 x/ M
:Jenkins Master也需要安装Mesos,但无需启动Mesos服务。
- V- y( `  L7 Y) I
ZooKeeper安装

) D( G( M8 d! c$ s" }4 M$ T# U( g6 ]请参见官网:https://zookeeper.apache.org/doc/trunk/zookeeperStarted.html+ o2 Q  ^( g+ F3 H. \& B
Mesos Master ZooKeeper配置
' K8 \) P; D# ^- ]' A# T
1、 /etc/mesos/zk文件内容为ZooKeeper地址,示例如下:
zk://192.168.0.91:2181,192.168.0.93:2181,192.168.0.127:2181/mesos
" x8 p  l" e9 {. {. O
2、3个ZooKeeper节点中/etc/zookeeper/conf/myid 分别配置1、2、3
3、将3个ZooKeeper节点中的/etc/zookeeper/conf/zoo.cfg,分别增加如下配置:, j) {& Z5 z. o
server.1=192.168.0.91:2888:3888server.2=192.168.0.93:2888:3888server.3=192.168.0.127:2888:3888
4 L: B0 E8 }2 W' C: y( h; @
配置Mesos Master
+ C* p; ^4 r8 b
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
- g( j* z6 X9 n- j3 B5 @, {4 A- e; s; U5 o
配置Mesos Agent

" M% l1 O1 _( C; `9 r& S# ]
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:文件内容留空+ k* `! X; x0 G
3 p' T- n. L; N! A; q: j
访问Mesos Master,地址如下:  P! t) n$ X/ V' K0 }, y4 e8 e
http://192.168.0.91[93|127]:5050
. h" q2 L8 K5 R* |
0?wx_fmt=jpeg.jpg
/ u# h8 V  o2 j+ m4 L3 U' z
Mesos Agent信息如下:
( c3 s; C" d" ~9 _% u5 v6 _. R
0?wx_fmt=jpeg.jpg
/ `* {" s, r7 e- g$ F( t' A
Mesos将以上10个Mesos Agent的计算资源做了抽象,用户角度看来就像一个高配的计算机。
1 E- L2 y$ Z$ y3 d8 b
Resources

+ j! J* C/ ^5 Y, r+ C0 f% p
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
. j4 H- U+ T. r( |
安装Mesos Plugin
5 o* g/ E7 e" H0 Q  n7 d6 |2 }

/ ^4 q$ \  n8 J7 C: O) J
配置Jenkins on Mesos
# _; `; `/ C; A3 v; ]$ t
配置Mesos Cloud信息:Manage Jenkins -> Configure System -> Mesos Cloud
' n& Q" D1 N. {& ]; \
配置图示和重点参数说明如下:
* m( K2 o- _# A+ s' T1 I
  • 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
    1 W% K- ?* D& T" u

( ~) f& e: O2 }3 V
点击"Advanced...",配置Slave相关信息图示及重点参数说明如下:
) L; M! h* J% k6 Y* B3 e
Label String:Jenkins label
' r7 w) y& q7 v1 l" h, s% }% _& u
说明:CPU最小可为千分之一核即0.001CPU,内存可为1MB。总分配给slave的CPU为Jenkins Slave CPUs (Minimum/Maximum number of Executors per Slave) * Jenkins Executor CPUs,分配内存总数与CPU计算方式类似。
4 u3 j' R& A& u3 c- k  W+ j) [/ S
0?wx_fmt=jpeg.jpg

1 `- k- I% U* _点击"Advanced...",选中Use Docker Containerizer与Docker,配置用Docker做隔离相关信息图示及重点参数说明如下:- T% ^2 y0 z; ]* u
0?wx_fmt=jpeg.jpg

' t: y" y+ P$ D
Docker Force Pull Image:会强制从Docker Registry拉取Image。

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

5 f% a) t* C: K# f6 t/ v+ t* K8 t' B% P* |0 `2 L3 W$ h% g# ]- }
0?wx_fmt=jpeg.jpg

) V5 {6 T! s/ z4 ~
并在Dockerfile中末尾加上"/bin/sh", 示例如下:
NTRYPOINT ["/bin/bash", "--login", "--", "/tmp/entrypoint.sh", "/bin/sh"]
7 u3 }% r% A. K* ?! V3 D$ Z. b- P
如果有Docker化slave中执行Docker命令的需求(Docker in Docker),可配置如下:
/ c: N$ O+ A6 F0 i
- o* H5 c; s4 E- y/ s
0?wx_fmt=jpeg.jpg

  Q9 U- z5 N4 Z  a" |, `另外,如果需要作业构建完成后,尽快销毁Container(超过slave idel时间)释放资源,可作如下配置:! S+ _$ u+ F' |  {& N8 b( n
0?wx_fmt=jpeg.jpg
" M+ ]* ?) u' d/ Y- m5 N
通过Mesos运行Jenkins Job% D8 H  e1 e# x  b( Q/ x, o
) q# \3 F! s, F1 X/ Z
点击Job Configure -> Restrict where this project can be run -> Label Expression 刚刚在Jenkins Mesos Cloud上配置的label,配置好相关参数后,点击build,然后通过job的Console Output,可以看见:
6 Q4 L& Y( b- h
0?wx_fmt=jpeg.jpg

: q6 ]. {3 |8 u' P- v
其中mesos-jenkins-6d7291a458bb49b6ad26efcf3e26f11d-mesos-jenkins-sl为Jenkins slave名称。
8 Q5 y- Q& ~4 x6 K: z
在Mesos Web UI可以查看到正在构建的Jenkins job(Mesos task)。
  _! D9 D! N. T. p
0?wx_fmt=jpeg.jpg
" T  X" J1 i: B5 F9 F7 f+ j. Y
如Slave launch失败或未达到预期,可以点击Sanbox查看stderr、 stdout。: `, ^' `& [: c2 X/ c) m
0?wx_fmt=jpeg.jpg
3 O3 B) Y4 f# `4 ~5 U: R. Z; E6 ^
调试过程
# Z3 Y# B- G& s+ t: U" k) G下面是我总结的在Mesos上定位问题流程:9 D! w1 H& G+ G! p( `
0?wx_fmt=png.jpg
* P2 x. J7 q* w3 I4 X- u: J
远程登录到mesos container,举例如下:
- P  d3 A: r, `/ q
docker -H tcp://bjoepbm01.dev.fwmrm.net:2375 exec -it  mesos-d8df8fb0-1c86-450b-8d0b-f33047fe15a3-S1.d151118f-bf6d-4abf-bca6-f32a885938b7 bash6 a/ P% B, z9 \
:可以在Docker daemon中指定 "-H tcp://0.0.0.0:2375",方便远程操作docker daemon。
+ Y1 e2 T% s4 U$ m5 {Mesos 监控( t' J( y; J. a' J2 }: w
Mesos的监控以纳入我司的ELK,通过ELK: ElastAlert对未满足预设定的条件进行报警, Mesos监控请参见官网:http://mesos.apache.org/documentation/latest/monitoring/

! r: x' B5 g# E3 M1 v- h一个月内CPU/Memory分配情况:
8 N2 p! f5 p. c9 c- Q
0?wx_fmt=jpeg.jpg

$ h2 J; L. p5 I% y
0?wx_fmt=jpeg.jpg
1 V& P0 j$ d5 f! j/ f' O
一个月内用Mesos 作业并发构建情况:
$ B! @; d. P4 D+ x9 l
0?wx_fmt=jpeg.jpg
1 G5 w# a# u" I5 h
报警举例:Mesos资源不足通过ElastAlert发送邮件报警。
/ [* |, y& e8 ]& g; O0 n& z
# I  A2 B4 ^, {4 L4 o1 J& y/ ~  K9 H: v" @3 |
遇到问题与经验
# d5 f/ W( q. D  G
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’方法解决。

0 {' t3 X! n6 \! c7 Q3 t2、作业长时间在Jenkins队里等待构建:默认情况下,即使当前有空闲的executor,Jenkins默认等待复用正在运行作业的executor,可以通过Jenkins启动时加上如下参数直接利用空闲的executor:
1 t! I9 B# k$ ^* Z- s( O" T9 ]9 }5 k8 u2 [' d4 S8 m" y7 f5 i
-Dhudson.slaves.NodeProvisioner.MARGIN=50 -Dhudson.slaves.NodeProvisioner.MARGIN0=0.85% t: `! e- R  u! N2 x& D# V6 u
3、由于Jenkins Slave是根据预先估计分配CPU、Memory等资源配额,会存在估计的误差,对于资源超分,解决思路是用Dockbeat监控每个作业的实际使用情况记录到ELK中,而后根据实际使用情况按需分配。
" }4 W( b6 C6 b( D6 X7 z5 C
如下图中的作业预申请2cpu,但就近10次的构建中最大cpu使用仅为0.511cpu。# U, u& t  u9 w+ V1 b9 b
0?wx_fmt=jpeg.jpg

/ j+ S8 g7 t6 D9 O; \$ G% x6 w4、如构建作业时不希望复用slave环境,需要在Job配置中勾选Mesos Single-Use Slave,如下图: 6 X( [, |- K& @! n; N  P5 I
0?wx_fmt=png.jpg

2 f/ k7 A) |; ^7 c
对应pipeline类型作业,如果想使用Mesos Single-Use Slave,可在pipeline 配置中写成如下形式:
; \7 m5 N2 I3 c' U# i5 u
node('mylabel') {wrap([$class: 'MesosSingleUseSlave']) {    // build actions}} , q& k2 h: U+ m

. R: @9 h6 i9 n+ t
如同一个label下的作业只是部分用了Mesos Single-Use Slave功能,还是可能会出现slave被复用情况。
& g; P+ b( }1 Y! I
解决办法通过自动化方式实现当前label下作业全部使用该功能,而后新建作业自动选择该选项。具体过程如下:

  Y3 ~+ N4 f9 q5 @1 S& E" M* i修改代码如下文件:5 e$ l& Z! m4 k6 X' F' ?+ g
7 p; }( V& {$ ]1 l2 g* v
mesos-plugin/blob/master/src/main/java/org/jenkinsci/plugins/mesos/listener/MesosItemListener.java' R% M& j" i6 {2 A4 h) d  b8 G
加入如下代码,执行mvn package命令重新build mesos plugin
3 _2 x* p7 ~0 E; o$ K2 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);        }    }}
7 @& N1 R6 V, ?! Q7 x
& L: }5 U+ W5 r8 y# x0 W; U
5、以非root(例如Jenkins)用户启动Container但需要执行sudo场景,可以用gosu或su-exec,推荐su-exec,c语言实现,仅10kb大小。具体使用可参考:https://github.com/tianon/gosu

6 ?  T; F0 M2 b) K, F1 ^* H
6、通过Docker volume方式将Jenkins作业workspace挂在到网络文件系统(例如CEPH,NFS等)以减少GIT服务器请求压力。
+ z. n  e, Y9 E9 s' ]7 T/ U
7、设置Mesos Framework Role及weight,使优先级高的任务优先获得资源执行。
1 v2 w7 k/ Q& r
8、/etc/sysctl.conf里面net.ipv4.ip_forward值设置为1" R8 f; [( ?* ^2 C  n" Z3 @3 Z; F
原创:西夏
# S9 d2 L6 k; M/ }
# D0 P6 E  M" G2 O$ \

% L; c" z3 s) F2 a

本版积分规则

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

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

Baidu

GMT+8, 2019-2-16 03:38 , Processed in 0.205594 second(s), 31 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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