概述
持續(xù)集成的速度是衡量一個團隊敏捷水平的核心指標之一纱皆,CI也需要持續(xù)升級同眯。
- CI1.0 單機绽昼,集中式,只有一臺jenkins服務(wù)器须蜗,負責(zé)所有任務(wù)硅确。
問題:隨著項目的增多,資源出現(xiàn)嚴重不足明肮,打包失敗率飆升, jenkins服務(wù)本身也容易崩潰.
- CI2.0 分布式,jenkins master只負責(zé)調(diào)度疏魏,占用資源的編譯任務(wù)全部交由容器化的slave完成。
問題:slave容器靜態(tài)分布晤愧,持續(xù)運行大莫,在沒有編譯任務(wù)時造成資源閑置。
- CI3.0 容器化jenkins master,通過marathon實現(xiàn)持續(xù)運行官份,并通過mesos的jenkins插件實現(xiàn)slave動態(tài)創(chuàng)建和銷毀只厘,實現(xiàn)資源的按需利用。
資源調(diào)度:Mesos
Apache Mesos是一款開源集群管理軟件舅巷。Mesos經(jīng)過了Facebook羔味,Twitter這些大型公司的萬臺主機驗證,在國內(nèi)钠右,愛奇藝赋元、去哪網(wǎng),小米網(wǎng)等公司也擁有大規(guī)模的Mesos集群應(yīng)用。Mesos實現(xiàn)了兩級調(diào)度架構(gòu)搁凸,可以管理多種類型的應(yīng)用程序媚值,支持Docker。第一級調(diào)度是Master的守護進程护糖,管理Mesos集群中所有節(jié)點上運行的Slave守護進程褥芒。集群由物理服務(wù)器或虛擬服務(wù)器組成,用于運行應(yīng)用程序的任務(wù)嫡良,比如Hadoop和MPI作業(yè)锰扶。第二級調(diào)度由被稱作Framework的“組件”組成。Framework包括調(diào)度器(Scheduler)和執(zhí)行器(Executor)進程寝受,其中每個節(jié)點上都會運行執(zhí)行器坷牛。Mesos能和不同類型的Framework通信,每種Framework由相應(yīng)的應(yīng)用集群管理很澄。圖中只展示了Hadoop和MPI兩種類型京闰,其它類型的應(yīng)用程序也有相應(yīng)的Framework。Mesos支持多種Framework痴怨,比如說Hadoop忙干,Spark器予,Storm等等浪藻,各類型的Framework在它上面都可以運行。
mesos的核心功能是資源收集和任務(wù)分配乾翔,如下:
容器管理:Marathon
Marathon 是可以和 Mesos 一起協(xié)作的一個 framework爱葵,用來運行持久性的應(yīng)用,比如docker。用戶可以通過WEB UI和API將應(yīng)用發(fā)布到mesos集群中反浓。
擴展和故障恢復(fù)
比如我們啟動三個服務(wù)萌丈,分別是一個節(jié)點的,三個節(jié)點的和五個節(jié)點的雷则。我們想拓展這些服務(wù)的話辆雾,可以調(diào)用Marathon的API進行擴展,并且是秒級的月劈。如果有一臺主機宕掉了度迂, Marathon會均勻地把服務(wù)遷移到其他的機器上,選擇資源有空余的機器進行遷移猜揪。這樣能就保證服務(wù)是動態(tài)的調(diào)度惭墓,保證服務(wù)的高可用,并且這些都是它內(nèi)部自行處理的而姐,不需要手動干預(yù)腊凶。
Jenkins 與 Mesos 集成
Jenkins和Mesos的集成由master的容器化,和slave的動態(tài)創(chuàng)建、銷毀兩部分組成钧萍。由于Jenkins與mesos的集成需要mesos庫的支持褐缠,造成Jenkins官方的鏡像無法使用,所以需要在官方鏡像中寫入mesos划煮。另外送丰,通過marathon在mesos中運行Jenkins master,以保證master的持續(xù)可用性。對于slave的調(diào)度弛秋,mesos官方提供了jenkins的插件器躏,為jenkins提供了調(diào)度mesos資源的能力,如下:
部署
整個部署包括Mesos集群蟹略、Marathon框架和Jenkins服務(wù)登失,Mesos和Marathon支持集群模式,所以需要Zookeeper來存儲配置信息挖炬,實現(xiàn)集群的選舉揽浙。
zookeeper集群
下載
$ wget http://apache.fayea.com/zookeeper/stable/zookeeper-3.4.8.tar.gz
$ tar zxvf zookeeper-3.4.8.tar.gz
$ ln -s zookeeper-3.4.8 zookeeper
$ cd zookeeper/conf
$ cp zoo_sample.cfg zoo.cfg
修改配置,3臺一致
$ vim zoo.cfg
dataDir=/usr/local/tmp/zookeeper
clientPort=2181
server.1=192.168.197.170:2888:3888
server.2=192.168.197.171:2888:3888
server.3=192.168.197.172:2888:3888
每臺服務(wù)器設(shè)置不同的ID
$ echo "1" > /usr/local/tmp/zookeeper/myid
Mesos意敛、Marathon集群
Mesos官方只提供了源碼安裝的方式馅巷,還好mesosphere提供了各個發(fā)行版的二進制包,推薦使用倉庫安裝草姻。
倉庫配置
$ sudo rpm -Uvh http://repos.mesosphere.com/el/7/noarch/RPMS/mesosphere-el-repo-7-1.noarch.rpm
安裝
$ sudo yum install -y mesos
mesos-master配置
$ echo 'zk://192.168.197.170:2181,192.168.197.171:2181,192.168.197.172:2181/mesos' > /etc/mesos/zk
$ echo "CLUSTER_NAME" > /etc/mesos-master/cluster
$ echo "IP" > /etc/mesos-master/ip
$ echo "HOSTNAME" > /etc/mesos-master/hostname
mesos-slave配置
$ echo "docker,mesos" > /etc/mesos-slave/containerizers
$ echo "IP" > /etc/mesos-slave/ip
$ echo "HOSTNAME" > /etc/mesos-slave/hostname
啟動mesos
$ systemctl start mesos-master
$ systemctl start mesos-slave
訪問mesos控制臺:http://master_ip:5050
下載marathon
$ wget http://downloads.mesosphere.com/marathon/v1.1.1/marathon-1.1.1.tgz
$ tar zxvf marathon-1.1.1.tgz
$ ln -s marathon-1.1.1 marathon
運行marathon,指定相同的zookeeper啟動多臺會自動組成一個集群
$ cd marathon/bin
$ nohup ./start -h HOSTNAME --http_credentials "admin:admin" --master zk://zk://192.168.197.170:2181,192.168.197.171:2181,192.168.197.172:2181/mesos --zk zk://192.168.197.170:2181,192.168.197.171:2181,192.168.197.172:2181/marathon &> output.log &
訪問marathon控制臺:http://master_ip:8080
運行Jenkins master容器
在marathon控制臺啟動jenkins master容器:
{
"id": "jenkinsmaster",
"cmd": null,
"cpus": 1,
"mem": 600,
"disk": 0,
"instances": 1,
"labels": {
"HAPROXY_GROUP":"external",
"HAPROXY_0_VHOST":"jenkins.evan.com"
},
"container": {
"type": "DOCKER",
"docker": {
"image": "jenkins_mesos",
"network": "BRIDGE",
"portMappings": [
{
"containerPort": 8080,
"hostPort": 31080
},
{
"containerPort": 31500,
"hostPort": 31500
}
],
"parameters": []
},
"healthChecks": [
{
"path": "/login",
"portIndex": 0,
"protocol": "HTTP",
"gracePeriodSeconds": 300,
"intervalSeconds": 60,
"timeoutSeconds": 20,
"maxConsecutiveFailures": 3,
"ignoreHttp1xx": false
}
],
"volumes": [
{
"containerPath": "/var/jenkins_home",
"hostPath": "/data/share/docker/jenkins_master",
"mode": "RW"
}
]
},
"healthChecks": [
{
"protocol": "HTTP",
"path": "/login",
"portIndex": 0,
"gracePeriodSeconds": 300,
"intervalSeconds": 60,
"timeoutSeconds": 20,
"maxConsecutiveFailures": 3
}
],
"env": {
"JENKINS_SLAVE_AGENT_PORT": "31500"
}
}
訪問jenkins钓猬。
配置mesos jenkins插件
安裝mesos插件
在System config界面配置mesos插件
設(shè)置mesos庫的路徑和mesos master的地址
點擊右下方Advanced,設(shè)置標簽、和slave資源
繼續(xù)點擊右下方Advanced撩独,設(shè)置slave以容器方式運行
新建job設(shè)置標簽,測試敞曹。
問題
- jenkins的配置存儲在文件系統(tǒng),如果運行jenkins的mesos slave宕機综膀,marathon會在其它slave重新啟動澳迫,但配置會丟失。
解決:一個方法是使用分布式文件系統(tǒng)剧劝,結(jié)合marathon的資源控制橄登,確保jenkins只運行在掛載了共享的mesos slave。 另一個方法是通過SCM Sync Configuration Plugin 這個插件將jenkins配置存儲在版本庫中讥此,實時同步拢锹。
- Jenkins在多臺mesos slave上運行時會造成ip的變化,無法確定暂论。
解決:通過marathon-lb實現(xiàn)服務(wù)發(fā)現(xiàn)
參考資料
mesos 文檔:http://mesos.apache.org/documentation/latest/
marathon 文檔:https://mesosphere.github.io/marathon/docs/
如何做好持續(xù)集成——Jenkins on Mesos 實踐
Delivering eBay’s CI Solution with Apache Meso