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

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

QQ登录

只需一步,快速开始

扫一扫,访问微社区

搜索
查看: 100|回复: 0

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

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

参加活动:0

组织活动:12

发表于 2017-8-16 15:45:04 | 显示全部楼层 |阅读模式 来自- 广东广州
本帖最后由 monicazhang 于 2017-8-16 15:47 编辑
1 @5 x4 P9 C' E* s
" V. e. r) r8 W. X# }# J! X2 @

7 _# G4 p/ ]# n1 `" ^3 w! }( C  o) v. M' x' I# B  R
Jenkins是目前持续集成领域应用最为广泛的工具,通过Jenkins,项目可以进行自动化的编译、打包、分发与部署,通过持续不断的集成,减少了项目风险和重复过程,最终提高工作效率;Docker做为新的容器化的技术代表,能够保持跨环境的一致性,可以实现更快速地交付和部署;Apache Mesos做为一种分布式系统内核,可理解为一个集群管理器,通过对底层计算资源(物理机、虚拟机、云等)的CPU、内存、存储以及机器上的其他资源进行抽象,对抽象后的资源进行统一的管理调度,提供跨分布式应用或框架的资源隔离和共享,非常有效的提高了分布式集群的资源利用率,使机器计算资源变得弹性可扩展。
" L* S7 {- w: _) v: N. ^
Mesos通过对运行在其上的Framework按照role进行分组和设置权重的方式,保证高优先级的任务优先获得资源。另外Mesos有非常完善的failover机制,可以做到无缝升降级和容灾处理。Mesos Master服务通过ZooKeeper保证高可用,周期性健康检查失败Mesos Agent会被自动下线,Agent恢复之前不会再被分配任务,Agent短暂性失联也不会影响正在运行的任务,而对于与Mesos Master失联的Framework,指定时间内(Mesos Framework failover_timeout)重新注册Mesos Master也不会影响正在运行的任务。
& b7 u0 Y' p# u4 c4 y* {
传统的以实体机或虚拟机做为Jenkins slave方式,存在部署构建环境复杂、构建环境单点、不一致、作业构建时资源竞争以及资源利用不均衡等诸多问题。而Mesos通过Docker Container做隔离,将构建依赖打包到Docker Image中,保证了构建环境的一致性。Jenkins Master可以在构建作业构建动态Mesos资源申请做为slave节点,并在构建完成后将资源归还给Mesos(也可以一直保留)。Jenkins、Docker以及Mesos的结合,从根本上解决了传统slave构建环境单点、构建环境一致性、作业构建资源竞争以及利用不均衡等问题。

5 P$ j7 Y4 L7 p7 H! ?) C
本文主要介绍基于Jenkins与Mesos快速搭建一套弹性的、高可用的持续集成环境。

- A: }1 Q! D5 O2 R# v/ |# c- V:Mesos已在FreeWheel公司用了一年时间,目前有超过90% Jenkins作业(CI总作业数约为13000个)通过Mesos提供的资源进行构建,平均每天构建近3000次,作业并发构建量高点时超过100个。& r: F) y8 O6 q# P
安装配置

! s* o6 A# d$ a
前提准备
# q' I8 T9 k/ i: w- X4 z% f0 b
版本信息:

/ y$ {  D4 T, Y. p* AMesos版本:1.3.0操作系统版本:Red Hat 7ZooKeeper版本: 3.4.6
4 \, D& Q1 d0 H! ^( P3 T. s
  Q8 g/ c2 n: ~+ x  G. _机器信息:
9 \/ F( ^( G+ L- E. A2 v8 |7 z6 n  G5 D: D1 c+ {+ E  }
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
( a6 q/ r1 A& {7 Z" ^0 |
4 ~1 B0 f7 F+ z/ ~/ f
Docker

9 T# x" J; l' y$ s: F" n, l1 ]0 ?5 Y  T) W2 {' ~
: 配置中需加 "-H unix:///var/run/docker.sock",对于CentOS或Red Hat,推荐Docker Storage Driver采用DeviceMapper的direct-lvm模式。7 M4 a( F  f0 u( z& R- h$ C) k5 f% K
Jenkins安装配置

: r. U: k6 @, S9 m0 R, j
Jenkins安装配置请参见官网:https://jenkins.io/doc/book/getting-started/installing/

0 k2 [3 V+ ~9 G* t4 V% w! x
:JDK 1.8的默认垃圾回收算法ParallelGC会导致Jenkins周期性的hang(表现为几分至十几分钟主页无法打开),需将垃圾回收算法替换为 Concurrent Mark Sweep(CMS)或Garbage First(G1)以此减少GC延迟。

/ W$ v! B& u. w* z  J
另外:对于Jenkins的JVM调优、容灾以及高可用等我司具备一定经验和教训,有需要了解的同学可留言交流。

8 ?  W5 n9 P* D  }1 [$ d
Mesos安装配置

; r8 @. e1 r& P% J
方式1:源码编译安装
  ~2 Y( \3 t4 X# y) j) c2 d
安装过程请参见官网:http://mesos.apache.org/gettingstarted
" J6 ]9 X  a1 L; C5 a
方式2:YUM安装
5 O3 H3 e2 ^( q7 p  _( C
安装Mesos依赖过程请参见官网:http://mesos.apache.org/gettingstarted
* F* Q% A4 D6 k$ M1 z
添加yum源:

2 V! D7 @1 F7 N5 hsudo rpm -Uvh http://repos.mesosphere.com/el/7 ... repo-7-3.noarch.rpm0 b; l! R  @2 D) I; v0 _

5 p1 v  L/ l+ t) Y安装最新版本:, W5 Y6 }8 u* u( _9 L5 W
! Q: T+ O! {' {4 q* m
sudo yum -y install mesos3 L# D$ P) N' z3 |# l' d  y  V

7 Q; ~8 f4 H. K/ _
或指定版本安装:
yum list mesos --showduplicates |sort -r8 Q! V7 j* L8 q" b. [) v  ]1 j
, |2 P( H0 t' _  q0 v1 z; n. P
:Jenkins Master也需要安装Mesos,但无需启动Mesos服务。

/ f5 u6 Y1 z" D8 @. S! N+ u- `/ [
ZooKeeper安装
2 o7 H9 L( R. N# ]! ~9 v1 R. U
请参见官网:https://zookeeper.apache.org/doc/trunk/zookeeperStarted.html9 i' M+ X' M4 g& a* o- M* M
Mesos Master ZooKeeper配置

6 x( U; V  u5 A" S: f) D
1、 /etc/mesos/zk文件内容为ZooKeeper地址,示例如下:
zk://192.168.0.91:2181,192.168.0.93:2181,192.168.0.127:2181/mesos4 Z1 a1 m# {: u: ?2 p, x5 J+ D
2、3个ZooKeeper节点中/etc/zookeeper/conf/myid 分别配置1、2、3
3、将3个ZooKeeper节点中的/etc/zookeeper/conf/zoo.cfg,分别增加如下配置:
/ L  e( M! @' ?" _server.1=192.168.0.91:2888:3888server.2=192.168.0.93:2888:3888server.3=192.168.0.127:2888:3888& H& g2 d. R, ^: Y+ i8 e( U, s
配置Mesos Master
- O" v. i  R4 K, q7 m& 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
5 Y" l) A  p' p2 ]: A8 u
5 F, ]& G. f2 V/ q5 f+ M
配置Mesos Agent
3 V  ?5 z$ @0 l, 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:文件内容留空
, ?% U1 j  e5 @9 E) c$ F, H3 C' |' {; @0 z+ w1 C
访问Mesos Master,地址如下:
7 K% u# q! v7 t( l. [http://192.168.0.91[93|127]:50505 {' C& \3 w. ~
' N: B  n6 k5 t: J$ l& i
Mesos Agent信息如下:

: j9 v: c  \" n& u3 h

! [% `' h) E" ]4 I' v; O
Mesos将以上10个Mesos Agent的计算资源做了抽象,用户角度看来就像一个高配的计算机。
# G) b) ^, y$ s8 K
Resources

, H5 R' c7 t$ F7 l7 p0 W  E: k
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

4 f3 B  y* a2 I! s& w
安装Mesos Plugin

& p( g  h* a* H5 [/ y3 L
( o' q6 P2 Z" B
配置Jenkins on Mesos
5 i! a1 f6 e7 O5 A
配置Mesos Cloud信息:Manage Jenkins -> Configure System -> Mesos Cloud
4 w% V/ v2 k% Z( ]
配置图示和重点参数说明如下:
3 L5 a- D9 j6 X( B
  • Mesos native library path:Mesos lib库路径
  • Mesos Master [hostname:port]:ZooKeeper地址
  • Cloud ID:自动生成
  • Checkpointing:选择Yes. Enable Checkpointing的意义是Mesos Agent服务失败(例如升级或crash)不会影响正在运行的作业。

    2 |! V6 {) T3 x) q6 n
# A) d$ Q; `6 Y! P8 M& n+ \2 J" i: D
点击"Advanced...",配置Slave相关信息图示及重点参数说明如下:
! q$ ?" K4 ?3 f  o9 y1 P. [3 t
Label String:Jenkins label
: J* ~" o: R& ?' ?. o" S
说明:CPU最小可为千分之一核即0.001CPU,内存可为1MB。总分配给slave的CPU为Jenkins Slave CPUs (Minimum/Maximum number of Executors per Slave) * Jenkins Executor CPUs,分配内存总数与CPU计算方式类似。
% d# m) o1 o; b0 i" L

5 E+ Q3 ]' Y+ p9 X. k点击"Advanced...",选中Use Docker Containerizer与Docker,配置用Docker做隔离相关信息图示及重点参数说明如下:! g! S4 a5 w: W' W; k! I

/ a' x% r& J. }# X9 U3 Q2 n
Docker Force Pull Image:会强制从Docker Registry拉取Image。

/ b3 \+ Y! E) P; k( \
说明:默认情况下Mesos会覆盖Dockerfile中的Entrypoint,一个workround方式是勾选Use custom docker command shell,并在Custom docker command shell中加上-c,如无Entrypoint,此步骤忽略。
8 g' V) U. Q! l
) v2 I+ ?4 |! [
* O  m0 u6 R: Z% D
并在Dockerfile中末尾加上"/bin/sh", 示例如下:
NTRYPOINT ["/bin/bash", "--login", "--", "/tmp/entrypoint.sh", "/bin/sh"]. [( s" z! @* j, M6 L  _
如果有Docker化slave中执行Docker命令的需求(Docker in Docker),可配置如下:
" Y5 f" y- ~- f1 j# n) J2 U

, M! E9 X% k0 N+ i
* w& P$ ]+ y* i" |
另外,如果需要作业构建完成后,尽快销毁Container(超过slave idel时间)释放资源,可作如下配置:# L+ w0 a" p' V- w  T
# h2 S0 J% A0 M$ Z: O
通过Mesos运行Jenkins Job* I( c: D/ c7 h
1 K7 {1 V/ s2 Y& I. B8 w- B
点击Job Configure -> Restrict where this project can be run -> Label Expression 刚刚在Jenkins Mesos Cloud上配置的label,配置好相关参数后,点击build,然后通过job的Console Output,可以看见:/ E; p2 T( Y, @8 w: N1 V
. W3 K: q5 l8 g8 O+ q
其中mesos-jenkins-6d7291a458bb49b6ad26efcf3e26f11d-mesos-jenkins-sl为Jenkins slave名称。

5 X0 i% ?3 u% u1 S2 b& T& R在Mesos Web UI可以查看到正在构建的Jenkins job(Mesos task)。3 U+ z2 {$ a3 b# N5 Q1 q

, C! T9 O$ y3 m如Slave launch失败或未达到预期,可以点击Sanbox查看stderr、 stdout。. ~# y1 Z8 P2 P

+ h0 `) x" I) l0 b' X  `4 f* p5 e3 |调试过程
% @, Y. t$ N7 n3 V+ _下面是我总结的在Mesos上定位问题流程:$ T( }" q4 h( ^

/ B+ E$ v/ a/ K: B
远程登录到mesos container,举例如下:

: v7 o+ v3 F! `: G1 y8 J- }% i, |docker -H tcp://bjoepbm01.dev.fwmrm.net:2375 exec -it  mesos-d8df8fb0-1c86-450b-8d0b-f33047fe15a3-S1.d151118f-bf6d-4abf-bca6-f32a885938b7 bash
2 @8 Y6 i4 M6 C; u:可以在Docker daemon中指定 "-H tcp://0.0.0.0:2375",方便远程操作docker daemon。
" y& N6 K# X( c1 mMesos 监控
# u$ |9 i& L" c2 f1 X
Mesos的监控以纳入我司的ELK,通过ELK: ElastAlert对未满足预设定的条件进行报警, Mesos监控请参见官网:http://mesos.apache.org/documentation/latest/monitoring/

: ?4 B; e3 [$ M0 o% P一个月内CPU/Memory分配情况:2 L+ \& D* @6 y
! d$ ~& R' D7 y% d  Q

8 Y2 F2 M4 R7 o. @1 \一个月内用Mesos 作业并发构建情况:
0 W  J& X  T3 p, P4 ]

1 N- |$ d8 |  D! s3 m+ N/ D& u报警举例:Mesos资源不足通过ElastAlert发送邮件报警。
! _9 l/ Z0 b5 \9 V; a
: m, D7 z* g8 W+ ?! ]) Z: e$ b/ G" ~6 t' G5 Y# F& P$ p
遇到问题与经验
: U& m$ B) K9 E% ?% Q" I7 r
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’方法解决。

: h- x% W  ~7 i" N! F% s2、作业长时间在Jenkins队里等待构建:默认情况下,即使当前有空闲的executor,Jenkins默认等待复用正在运行作业的executor,可以通过Jenkins启动时加上如下参数直接利用空闲的executor:7 |0 `' j1 [7 y, G
: G+ d* L9 _) u- [$ x
-Dhudson.slaves.NodeProvisioner.MARGIN=50 -Dhudson.slaves.NodeProvisioner.MARGIN0=0.857 L# d3 A" a! l0 q+ g
3、由于Jenkins Slave是根据预先估计分配CPU、Memory等资源配额,会存在估计的误差,对于资源超分,解决思路是用Dockbeat监控每个作业的实际使用情况记录到ELK中,而后根据实际使用情况按需分配。

& I0 [- i  {" ^  r) |7 L  {, u  k如下图中的作业预申请2cpu,但就近10次的构建中最大cpu使用仅为0.511cpu。$ Z  T5 B6 s5 T0 E8 ]# {( g

. i7 K. P  Z0 `7 O. F# }2 n3 \+ V4、如构建作业时不希望复用slave环境,需要在Job配置中勾选Mesos Single-Use Slave,如下图:
, w7 k2 ]/ P6 E
- Q3 W7 _& }7 M' y1 [0 O
对应pipeline类型作业,如果想使用Mesos Single-Use Slave,可在pipeline 配置中写成如下形式:

% Z8 a; g; Q0 c% d. q9 i! {node('mylabel') {wrap([$class: 'MesosSingleUseSlave']) {    // build actions}}
% O/ K- g3 h" }5 E: O1 M' k. i9 g+ e- D+ `) d! \
如同一个label下的作业只是部分用了Mesos Single-Use Slave功能,还是可能会出现slave被复用情况。
' M( O; F) v5 Q- A
解决办法通过自动化方式实现当前label下作业全部使用该功能,而后新建作业自动选择该选项。具体过程如下:

6 ?4 V$ m$ G- {" k! [5 c/ P6 X( X修改代码如下文件:: i, _9 J! G2 C  q3 D! x
# Y% Y6 _0 k( A  K( |1 D' F
mesos-plugin/blob/master/src/main/java/org/jenkinsci/plugins/mesos/listener/MesosItemListener.java
( c; p5 J: x& W" u  O1 _; E
加入如下代码,执行mvn package命令重新build mesos plugin

. l& _2 @$ r- q! g8 J( Z/ y/** * 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 a; G* q, o1 m8 p  y

- U# S8 A. p8 b" x) }  u' ?
5、以非root(例如Jenkins)用户启动Container但需要执行sudo场景,可以用gosu或su-exec,推荐su-exec,c语言实现,仅10kb大小。具体使用可参考:https://github.com/tianon/gosu

1 V3 |( S7 r# `) ~; @6 H
6、通过Docker volume方式将Jenkins作业workspace挂在到网络文件系统(例如CEPH,NFS等)以减少GIT服务器请求压力。

% F4 K" _/ |# Q
7、设置Mesos Framework Role及weight,使优先级高的任务优先获得资源执行。

8 Q. r; t# A/ J8 E! o8、/etc/sysctl.conf里面net.ipv4.ip_forward值设置为16 W9 E1 C$ r4 _+ P# x: j0 M
原创:西夏
8 C& E: Z# o3 E7 z. I" z, S

/ w3 x+ P! b" O; W1 Y* q
  R) m: R" Y$ }5 t* v# u5 v) c

本帖子中包含更多资源

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

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-2-22 08:35 , Processed in 0.175305 second(s), 37 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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