基于Jenkins, Apache Mesos和Marathon的彈性高可用的持續集成環境(上篇)

jopen 9年前發布 | 94K 次閱讀 Jenkins 項目構建

持續集成(CI)是一種軟件開發實踐,使用得當,它會極大的提高軟件開發效率并保障軟件開發質量;Jenkins是一個開源項目,它提供了一種易于使用的持續集成系統;Mesos是Apache下的一個開源的統一資源管理與調度平臺,它被稱為是分布式系統的內核;Marathon是注冊到Apache Mesos上的管理長時應用(long-running applications)的framework,如果把Mesos比作數據中心kernel的話,那么Marathon就是init或者upstart的daemon。

本文旨在探討如何利用Jenkins,Apache Mesos和Marathon搭建一套彈性的,高可用的持續集成環境。

為什么要把Jenkins運行到Apache Mesos上

把Jenkins運行到Apache Mesos上,或者說利用Apache Mesos向Jenkins提供slave資源,最主要的目的是利用Mesos的彈性資源分配來提高資源利用率。通過配置Jenkins-on-Mesos插件,Jenkins Master可以在作業構建時根據實際需要動態的向Mesos申請slave節點,并在構建完成的一段時間后將節點歸還給mesos。

同時,Marathon會對發布到它之上的應用程序進行健康檢查,從而在應用程序由于某些原因意外崩潰后自動重啟該應用。這樣,選擇利用Marathon 管理Jenkins Master保證了該構建系統的全局高可用。而且,Jenkins Master本身也通過Marathon部署運行在Mesos資源池內,進一步實現了資源共享,提高了資源利用率。

下面兩張圖形象的說明了Marathon將Jenkins Master部署到Mesos資源池,以及Jenkins Master使用Mesos資源池進行作業構建的整個過程。

基于Jenkins, Apache Mesos和Marathon的彈性高可用的持續集成環境(上篇) 基于Jenkins, Apache Mesos和Marathon的彈性高可用的持續集成環境(上篇)

環境設置

為了便于理解,這里我簡化了Mesos/Marathon集群的架構,不再考慮集群本身的高可用性。至于如何利用zookeeper配置高可用的mesos/marathon集群,可以參考Mesosphere的官方文檔,這里不再展開。

我搭建了一個包含40個節點192.168.3.4-192.168.3.43的Mesos集群,其中一個節點用作運行Marthon及Mesos-master,其它39個節點作為mesos的slave,如下所示。

192.168.3.4  marathon/mesos-master
192.168.3.5  mesos-slave
192.168.3.6  mesos-slave
......
192.168.3.43  mesos-slave

參照http://get.dataman.io的文檔配置啟動Marathon,Mesos-Master和Mesos-Slave,下面的整個操作都將在這個集群上完成。

在Marathon上部署Jenkins的master實例

Marathon支持web頁面或者RESTapi兩種方式發布應用,在192.168.3.*內網執行下面的bash命令,就會通過Marathon的RESTapi在mesos slave上啟動一個Jenkins master實例。

git clone git@github.com:Dataman-Cloud/jenkins-on-mesos.git && cd jenkins-on-mesos && curl -v -X POST \
-H 'Accept: application/json' \
-H 'Accept-Encoding: gzip, deflate' \
-H 'Content-Type: application/json; charset=utf-8' \
-H 'User-Agent: HTTPie/0.8.0' \
-d@marathon.json \
http://192.168.3.4:8080/v2/apps

這里我在github上fork了mesosphere的jenkins-on-mesos的repoDataMan-Cloud/jenkins-on-mesos,并進行了一些改進

如果Jenkins master實例被成功部署,通過瀏覽器訪問http://192.168.3.4:8080(請確定你的瀏覽器能夠訪問內網,譬如可以利用設置瀏覽器代理等方式來搞定)可以在running tasks列表中找到jenkins,點擊進入詳細信息頁面,我們會看到下圖:

基于Jenkins, Apache Mesos和Marathon的彈性高可用的持續集成環境(上篇)

訪問http://192.168.3.4:5050/#/frameworks并在Active Frameworks中找到Marathon,點擊進入詳細信息頁面,可以在該頁面找到Jenkins Master具體運行到Mesos哪一臺Slave上,如下圖所示:

基于Jenkins, Apache Mesos和Marathon的彈性高可用的持續集成環境(上篇)

點擊sandbox

基于Jenkins, Apache Mesos和Marathon的彈性高可用的持續集成環境(上篇)

配置Jenkins Master實現彈性伸縮

接下來是配置Jenkins注冊成為Mesos的Framework,需要通過瀏覽器訪問http://192.168.3.25:31052/來到Jenkins Master的UI頁面。下面的截圖是我逐步配置的全過程。

基于Jenkins, Apache Mesos和Marathon的彈性高可用的持續集成環境(上篇) 基于Jenkins, Apache Mesos和Marathon的彈性高可用的持續集成環境(上篇)

如果Jenkins在Mesos上注冊成功,訪問http://192.168.3.4:5050/#/frameworks,我們可以找到jenkins Framework,如下圖所示:

基于Jenkins, Apache Mesos和Marathon的彈性高可用的持續集成環境(上篇)

現在我們可以同時啟動多個構建作業來看一下Jenkins在Mesos上的彈性伸縮,在http://192.168.3.25:31052/上新建一個名為test的工程,配置其構建過程為運行一個shell命令top,如下圖所示:

基于Jenkins, Apache Mesos和Marathon的彈性高可用的持續集成環境(上篇)

把該工程復制3份test2、test3和test4,并同時啟動這4個工程的構建作業,Jenkins Master會向Mesos申請資源,如果資源分配成功,Jenkins Master就在獲得的slave節點上進行作業構建,如下圖所示:

基于Jenkins, Apache Mesos和Marathon的彈性高可用的持續集成環境(上篇)

因為在前面的系統配置里我們設置了執行者數量為2(即最多有兩個作業同時進行構建),所以在上圖中我們看到兩個正在進行構建的作業,而另外兩個作業在排隊等待。

下圖展示了當前的Jenkins作業構建共使用了0.6CPU和1.4G內存,

基于Jenkins, Apache Mesos和Marathon的彈性高可用的持續集成環境(上篇)

正在使用的slave節點的詳細信息

基于Jenkins, Apache Mesos和Marathon的彈性高可用的持續集成環境(上篇) 基于Jenkins, Apache Mesos和Marathon的彈性高可用的持續集成環境(上篇)

配置Jenkins Slave參數(可選)

在使用Jenkins進行項目構建時,我們經常會面臨這樣一種情形,不同的作業會有不同的資源需求,有些作業需要在配置很高的slave機器上運行,但是 有些則不需要。為了提高資源利用率,顯然,我們需要一種手段來向不同的作業分配不同的資源。通過設置Jenkins Mesos Cloud插件的slave info,我們可以很容易的滿足上述要求。 具體的配置如下圖所示:

基于Jenkins, Apache Mesos和Marathon的彈性高可用的持續集成環境(上篇)

總結

利用mesos為jenkins彈性的提供資源,同時配置Jenkins Slave的參數來滿足不同作業的資源需求,這些都大大提高了集群的資源利用率。另外,由于 Marathon 會自動檢查運行在它之上的app的健康狀態, 并重新發布崩潰掉的應用程序。 在基于Jenkins, Apache Mesos和Marathon的彈性高可用的持續集成環境(下篇), 我會提供一種數據持久化的方法來存儲 Jenkins Master 的數據, 保證利用 marathon 部署 Jenkins Master 時系統的高可用。

參考

delivering-ebays-ci-solution-with-apache-mesos

blog comments powered by Disqus

來自:http://vitan.github.io/scale/ci/2015/05/12/jenkins-on-mesos-1.html

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!