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

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

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

扫描二维码登录本站

QQ登录

只需一步,快速开始

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

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

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

参加活动:0

组织活动:12

发表于 2017-8-16 15:45:04 | 显示全部楼层 |阅读模式 来自- 广东广州
本帖最后由 monicazhang 于 2017-8-16 15:47 编辑 ' u1 l% ^9 ]) o
- n* B& r  r! Y9 S" h! I5 J9 [9 y

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

" S" w6 C/ S1 ^3 f( h) x! b6 H
传统的以实体机或虚拟机做为Jenkins slave方式,存在部署构建环境复杂、构建环境单点、不一致、作业构建时资源竞争以及资源利用不均衡等诸多问题。而Mesos通过Docker Container做隔离,将构建依赖打包到Docker Image中,保证了构建环境的一致性。Jenkins Master可以在构建作业构建动态Mesos资源申请做为slave节点,并在构建完成后将资源归还给Mesos(也可以一直保留)。Jenkins、Docker以及Mesos的结合,从根本上解决了传统slave构建环境单点、构建环境一致性、作业构建资源竞争以及利用不均衡等问题。
5 h/ u4 C- l9 g) A8 B
本文主要介绍基于Jenkins与Mesos快速搭建一套弹性的、高可用的持续集成环境。

. D8 L" V$ K/ N. [! g* E) A* A:Mesos已在FreeWheel公司用了一年时间,目前有超过90% Jenkins作业(CI总作业数约为13000个)通过Mesos提供的资源进行构建,平均每天构建近3000次,作业并发构建量高点时超过100个。# k, R0 e# Z* d8 t. ^% v5 }" L; L* c
安装配置
+ p0 E. n$ R* g! N
前提准备

0 q7 L5 w- w4 O2 y. \
版本信息:
- P+ q' t+ E" X: A
Mesos版本:1.3.0操作系统版本:Red Hat 7ZooKeeper版本: 3.4.6
) [  [+ Z5 `9 m7 U$ g/ [
: V* s0 ?0 ~$ K5 h/ D7 e9 T机器信息:0 N+ J4 S/ |7 b' \! Y. f

9 N' R4 _+ n& @. C+ Z3台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
* S2 q/ j0 u! F% @
# C8 ?: @5 h9 T6 J% ]; |# v
Docker
0 Q; V. l! m- t( O  Z

1 N$ [# ~/ U7 q+ ^6 z* Y5 j! B: 配置中需加 "-H unix:///var/run/docker.sock",对于CentOS或Red Hat,推荐Docker Storage Driver采用DeviceMapper的direct-lvm模式。
, ?- z- |1 s- U  t2 z
Jenkins安装配置
+ R9 n  s* C/ w% r, K( X
Jenkins安装配置请参见官网:https://jenkins.io/doc/book/getting-started/installing/
+ s7 k% k, ?: d# T
:JDK 1.8的默认垃圾回收算法ParallelGC会导致Jenkins周期性的hang(表现为几分至十几分钟主页无法打开),需将垃圾回收算法替换为 Concurrent Mark Sweep(CMS)或Garbage First(G1)以此减少GC延迟。

: i2 q+ f& P9 i; q) T2 a- n
另外:对于Jenkins的JVM调优、容灾以及高可用等我司具备一定经验和教训,有需要了解的同学可留言交流。
8 J3 F& h" ?" P' Y1 |, a2 L8 }1 j! y
Mesos安装配置

% r/ v% I2 c+ \8 O
方式1:源码编译安装

! O7 x& s  P1 X. i! z- Y8 ]安装过程请参见官网:http://mesos.apache.org/gettingstarted/ ^+ O% v9 S; A0 K8 s5 ~; P
方式2:YUM安装

  o" k; B. k$ _9 a1 A/ D
安装Mesos依赖过程请参见官网:http://mesos.apache.org/gettingstarted

4 m# M; N: g) N2 i# L
添加yum源:
6 R) G6 Y! j; s. Z
sudo rpm -Uvh http://repos.mesosphere.com/el/7 ... repo-7-3.noarch.rpm! E7 w8 D% g. R% a/ D; P1 W

$ E, {0 M" @# {6 [3 {安装最新版本:+ y6 }3 r, ~/ \" W1 H  }

+ P) `9 T- m5 D* P% p+ Tsudo yum -y install mesos+ ]" J8 `" d8 N( W* r# D
( P* w2 j+ Q( |: _. O) [' ^
或指定版本安装:
yum list mesos --showduplicates |sort -r7 c7 j9 W: J' u5 a; B: K& G  l! o7 |

/ V( k* k' h! _9 ^0 D) U. ]
:Jenkins Master也需要安装Mesos,但无需启动Mesos服务。
3 K, i+ p, Q4 A  Y" @" i8 t! l! O0 ~
ZooKeeper安装
  D6 U6 k. p- T; O) o5 c
请参见官网:https://zookeeper.apache.org/doc/trunk/zookeeperStarted.html: v5 t$ F* x; d
Mesos Master ZooKeeper配置

, W9 z4 H( Z3 _' R4 E3 A2 \: ]+ m
1、 /etc/mesos/zk文件内容为ZooKeeper地址,示例如下:
zk://192.168.0.91:2181,192.168.0.93:2181,192.168.0.127:2181/mesos
5 k6 H5 c- _/ F: L$ p/ b1 j; x  ?' I/ u
2、3个ZooKeeper节点中/etc/zookeeper/conf/myid 分别配置1、2、3
3、将3个ZooKeeper节点中的/etc/zookeeper/conf/zoo.cfg,分别增加如下配置:
# H$ s% X+ E/ v. Aserver.1=192.168.0.91:2888:3888server.2=192.168.0.93:2888:3888server.3=192.168.0.127:2888:3888
. S, i' F4 L- t, @
配置Mesos Master
% f- S1 s8 r2 {' 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: r5 U6 T8 m+ ?5 M' d0 a0 C# X( g

7 j( N1 Q. Q, u8 z8 n
配置Mesos Agent

) [3 Q/ g+ v7 W! V! G( 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:文件内容留空
' g8 y7 `" ?8 X1 V5 E6 Y* y$ V" R7 e& W! N) [$ s1 {
访问Mesos Master,地址如下:  T8 z: {: z( T% D; s- t
http://192.168.0.91[93|127]:5050; F  y* X: P  m+ A7 S/ _$ E
# g; W9 v9 ]/ K$ Y
Mesos Agent信息如下:

# i) o, s. g2 j8 R9 w3 A
$ b* ?4 Z5 h7 T" \7 J
Mesos将以上10个Mesos Agent的计算资源做了抽象,用户角度看来就像一个高配的计算机。
4 r8 T, W* I) F1 F
Resources
  L5 L; ]: N; M2 P: T& v
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
  B* N, b; N" E; P
安装Mesos Plugin

) }. k, W, q% W- N: F" s3 I- Z) [( V. V
配置Jenkins on Mesos
% v* C/ `3 G" z
配置Mesos Cloud信息:Manage Jenkins -> Configure System -> Mesos Cloud
; M' K. a' g' n% ?( C
配置图示和重点参数说明如下:
; u2 _- R7 `4 i
  • Mesos native library path:Mesos lib库路径
  • Mesos Master [hostname:port]:ZooKeeper地址
  • Cloud ID:自动生成
  • Checkpointing:选择Yes. Enable Checkpointing的意义是Mesos Agent服务失败(例如升级或crash)不会影响正在运行的作业。

    0 n9 f% w0 i# T5 x: [7 U. J+ m

) p/ i/ U1 \5 h
点击"Advanced...",配置Slave相关信息图示及重点参数说明如下:
8 \  a0 }) I6 I( c  l
Label String:Jenkins label

: t( g4 j: {- `4 K
说明:CPU最小可为千分之一核即0.001CPU,内存可为1MB。总分配给slave的CPU为Jenkins Slave CPUs (Minimum/Maximum number of Executors per Slave) * Jenkins Executor CPUs,分配内存总数与CPU计算方式类似。
3 D: ]# A; ~4 Z' f2 |, A& J) ^, N2 J

9 h8 F2 s5 ]" c; g0 n1 t4 ~5 a点击"Advanced...",选中Use Docker Containerizer与Docker,配置用Docker做隔离相关信息图示及重点参数说明如下:7 K% B6 l+ ?9 y9 K+ y, |

/ b8 e9 W0 D" B0 ]/ h+ N# w: `& u
Docker Force Pull Image:会强制从Docker Registry拉取Image。
( ]$ C) v8 \; a- A
说明:默认情况下Mesos会覆盖Dockerfile中的Entrypoint,一个workround方式是勾选Use custom docker command shell,并在Custom docker command shell中加上-c,如无Entrypoint,此步骤忽略。

. T: X1 W# S3 X. i% j3 C  ~/ i8 R2 a  D7 X+ `2 V; J2 r0 A  a
" o) c- d. |; Y* A7 G
并在Dockerfile中末尾加上"/bin/sh", 示例如下:
NTRYPOINT ["/bin/bash", "--login", "--", "/tmp/entrypoint.sh", "/bin/sh"]
7 k1 ?" w, C) ?( F  O- `& G
如果有Docker化slave中执行Docker命令的需求(Docker in Docker),可配置如下:

2 v* K7 D8 v4 j: y1 t# w' X7 i+ K: ~$ _: [- u5 M# \& O! C
1 @- K  i# _, p. i
另外,如果需要作业构建完成后,尽快销毁Container(超过slave idel时间)释放资源,可作如下配置:
6 @# m- y4 h$ l' H, e' ~% K! C: @# q1 n
% H% o& S/ t' j0 s- w
通过Mesos运行Jenkins Job6 `# t$ V2 T8 J: O: L& F  x5 M
; q8 Z# R1 {! R; U; z0 f9 Y" m# \! _
点击Job Configure -> Restrict where this project can be run -> Label Expression 刚刚在Jenkins Mesos Cloud上配置的label,配置好相关参数后,点击build,然后通过job的Console Output,可以看见:
5 y. ]+ A8 d% Y: j6 g* f6 P1 u
: Z+ y# s$ `$ w3 B9 }6 [
其中mesos-jenkins-6d7291a458bb49b6ad26efcf3e26f11d-mesos-jenkins-sl为Jenkins slave名称。

' T: H+ g- I  ?4 k2 O8 ?8 J在Mesos Web UI可以查看到正在构建的Jenkins job(Mesos task)。2 W  a# }3 a) G9 s: T

. `( d# g% M! v如Slave launch失败或未达到预期,可以点击Sanbox查看stderr、 stdout。
& y9 [, K/ {1 h. a
  S, U- A2 C' K$ V5 x
调试过程
: l8 O0 O* z% H6 l下面是我总结的在Mesos上定位问题流程:- w0 A) y" d6 r3 h' U) y

4 V; f4 J/ T+ N" o
远程登录到mesos container,举例如下:
3 \2 n! t" P8 ~, Q5 U0 k
docker -H tcp://bjoepbm01.dev.fwmrm.net:2375 exec -it  mesos-d8df8fb0-1c86-450b-8d0b-f33047fe15a3-S1.d151118f-bf6d-4abf-bca6-f32a885938b7 bash- @& `( V2 z& |8 q6 G; X& F  T
:可以在Docker daemon中指定 "-H tcp://0.0.0.0:2375",方便远程操作docker daemon。
9 V( z0 l, E0 P6 u7 x1 A1 YMesos 监控
8 \! e1 P$ y* D/ T) @2 c
Mesos的监控以纳入我司的ELK,通过ELK: ElastAlert对未满足预设定的条件进行报警, Mesos监控请参见官网:http://mesos.apache.org/documentation/latest/monitoring/
1 G9 ^& r- o! p9 r# _& J
一个月内CPU/Memory分配情况:; u# a- m0 o+ _  w, L. N9 [/ r
, f; X) }0 n9 g' v' l, j; I
* P- g$ q, B  }; x' S, y: o
一个月内用Mesos 作业并发构建情况:
, `: }$ P) \" I. _! ^
# H( r7 u  x" F' V
报警举例:Mesos资源不足通过ElastAlert发送邮件报警。
0 j  [6 H' U- h& m
6 D1 F; Y2 b7 B+ F
) ?' ?" ]6 W4 J2 v4 W6 `4 p3 y
遇到问题与经验
3 d$ L) g; B" j/ D& Q
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’方法解决。

: F4 H( K: @) T  h5 B9 A7 t1 G* h+ @, Q2、作业长时间在Jenkins队里等待构建:默认情况下,即使当前有空闲的executor,Jenkins默认等待复用正在运行作业的executor,可以通过Jenkins启动时加上如下参数直接利用空闲的executor:; m& v8 C3 M0 n( C5 u

% C$ G# P  H$ G/ E-Dhudson.slaves.NodeProvisioner.MARGIN=50 -Dhudson.slaves.NodeProvisioner.MARGIN0=0.85$ J% [7 F; J5 a; [( b9 l" s) [6 }; _
3、由于Jenkins Slave是根据预先估计分配CPU、Memory等资源配额,会存在估计的误差,对于资源超分,解决思路是用Dockbeat监控每个作业的实际使用情况记录到ELK中,而后根据实际使用情况按需分配。
, L! D( H2 e( H8 }
如下图中的作业预申请2cpu,但就近10次的构建中最大cpu使用仅为0.511cpu。
1 ~! X& {2 [% S

, G; o, @% S; f9 A6 j4、如构建作业时不希望复用slave环境,需要在Job配置中勾选Mesos Single-Use Slave,如下图: - k3 \1 \4 Q$ G) W4 _, X

0 z# j: R& {2 J+ v! N+ \
对应pipeline类型作业,如果想使用Mesos Single-Use Slave,可在pipeline 配置中写成如下形式:
7 ^( O1 d- T/ Z& Y  t9 h
node('mylabel') {wrap([$class: 'MesosSingleUseSlave']) {    // build actions}} . S9 D9 I0 r' b1 Y

2 G* H( @6 L' {+ ?1 \# ]
如同一个label下的作业只是部分用了Mesos Single-Use Slave功能,还是可能会出现slave被复用情况。

0 Q+ X- d0 ?( a" K' c
解决办法通过自动化方式实现当前label下作业全部使用该功能,而后新建作业自动选择该选项。具体过程如下:
0 g$ l/ c  @7 c7 B
修改代码如下文件:
% Q& h4 K. K  {; N+ y( r6 a% h' K
8 c$ t& x$ m" J( m$ U& Xmesos-plugin/blob/master/src/main/java/org/jenkinsci/plugins/mesos/listener/MesosItemListener.java
0 }/ P5 b% y6 j5 @0 F$ X! a' q
加入如下代码,执行mvn package命令重新build mesos plugin

: _7 ?! u: a6 ^+ ?/** * 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);        }    }}" U3 _/ I5 D5 C- ~

- f7 V/ s0 m8 e9 z' W7 Z
5、以非root(例如Jenkins)用户启动Container但需要执行sudo场景,可以用gosu或su-exec,推荐su-exec,c语言实现,仅10kb大小。具体使用可参考:https://github.com/tianon/gosu
1 M* A& c8 E' q" H5 D) b3 [
6、通过Docker volume方式将Jenkins作业workspace挂在到网络文件系统(例如CEPH,NFS等)以减少GIT服务器请求压力。
/ F+ ]& h- G; F4 X( `
7、设置Mesos Framework Role及weight,使优先级高的任务优先获得资源执行。
/ ]0 c0 e- |* m1 [$ T! ~
8、/etc/sysctl.conf里面net.ipv4.ip_forward值设置为14 f% P& w3 a, @, S% d
原创:西夏

6 n$ M3 n$ i! J  r# N! x2 R
) U4 f0 V3 }9 N
$ {" ?! B* K) T

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?微信、QQ、手机号一键注册

x

本版积分规则

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

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

Baidu

GMT+8, 2018-10-16 01:37 , Processed in 1.103545 second(s), 29 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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