基于Jenkins, Apache Mesos和Marathon的彈性高可用的持續集成環境(上篇)
持續集成(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資源池進行作業構建的整個過程。
環境設置
為了便于理解,這里我簡化了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的repo到DataMan-Cloud/jenkins-on-mesos,并進行了一些改進。
如果Jenkins master實例被成功部署,通過瀏覽器訪問http://192.168.3.4:8080(請確定你的瀏覽器能夠訪問內網,譬如可以利用設置瀏覽器代理等方式來搞定)可以在running tasks列表中找到jenkins,點擊進入詳細信息頁面,我們會看到下圖:
訪問http://192.168.3.4:5050/#/frameworks并在Active Frameworks中找到Marathon,點擊進入詳細信息頁面,可以在該頁面找到Jenkins Master具體運行到Mesos哪一臺Slave上,如下圖所示:
點擊sandbox
配置Jenkins Master實現彈性伸縮
接下來是配置Jenkins注冊成為Mesos的Framework,需要通過瀏覽器訪問http://192.168.3.25:31052/來到Jenkins Master的UI頁面。下面的截圖是我逐步配置的全過程。
如果Jenkins在Mesos上注冊成功,訪問http://192.168.3.4:5050/#/frameworks,我們可以找到jenkins Framework,如下圖所示:
現在我們可以同時啟動多個構建作業來看一下Jenkins在Mesos上的彈性伸縮,在http://192.168.3.25:31052/上新建一個名為test的工程,配置其構建過程為運行一個shell命令top,如下圖所示:
把該工程復制3份test2、test3和test4,并同時啟動這4個工程的構建作業,Jenkins Master會向Mesos申請資源,如果資源分配成功,Jenkins Master就在獲得的slave節點上進行作業構建,如下圖所示:
因為在前面的系統配置里我們設置了執行者數量為2(即最多有兩個作業同時進行構建),所以在上圖中我們看到兩個正在進行構建的作業,而另外兩個作業在排隊等待。
下圖展示了當前的Jenkins作業構建共使用了0.6CPU和1.4G內存,
正在使用的slave節點的詳細信息
配置Jenkins Slave參數(可選)
在使用Jenkins進行項目構建時,我們經常會面臨這樣一種情形,不同的作業會有不同的資源需求,有些作業需要在配置很高的slave機器上運行,但是 有些則不需要。為了提高資源利用率,顯然,我們需要一種手段來向不同的作業分配不同的資源。通過設置Jenkins Mesos Cloud插件的slave info,我們可以很容易的滿足上述要求。 具體的配置如下圖所示:
總結
利用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