CI3.0 Jenkins和mesos集成

概述

持續(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è)置標簽,測試敞曹。

問題

  1. jenkins的配置存儲在文件系統(tǒng),如果運行jenkins的mesos slave宕機综膀,marathon會在其它slave重新啟動澳迫,但配置會丟失。

解決:一個方法是使用分布式文件系統(tǒng)剧劝,結(jié)合marathon的資源控制橄登,確保jenkins只運行在掛載了共享的mesos slave。 另一個方法是通過SCM Sync Configuration Plugin 這個插件將jenkins配置存儲在版本庫中讥此,實時同步拢锹。

  1. 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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末面褐,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子取胎,更是在濱河造成了極大的恐慌展哭,老刑警劉巖湃窍,帶你破解...
    沈念sama閱讀 221,273評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異匪傍,居然都是意外死亡您市,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,349評論 3 398
  • 文/潘曉璐 我一進店門役衡,熙熙樓的掌柜王于貴愁眉苦臉地迎上來茵休,“玉大人,你說我怎么就攤上這事手蝎¢泡海” “怎么了?”我有些...
    開封第一講書人閱讀 167,709評論 0 360
  • 文/不壞的土叔 我叫張陵棵介,是天一觀的道長钉鸯。 經(jīng)常有香客問我,道長邮辽,這世上最難降的妖魔是什么唠雕? 我笑而不...
    開封第一講書人閱讀 59,520評論 1 296
  • 正文 為了忘掉前任,我火速辦了婚禮吨述,結(jié)果婚禮上岩睁,老公的妹妹穿的比我還像新娘。我一直安慰自己揣云,他們只是感情好捕儒,可當我...
    茶點故事閱讀 68,515評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著灵再,像睡著了一般肋层。 火紅的嫁衣襯著肌膚如雪亿笤。 梳的紋絲不亂的頭發(fā)上翎迁,一...
    開封第一講書人閱讀 52,158評論 1 308
  • 那天,我揣著相機與錄音净薛,去河邊找鬼汪榔。 笑死,一個胖子當著我的面吹牛肃拜,可吹牛的內(nèi)容都是我干的痴腌。 我是一名探鬼主播,決...
    沈念sama閱讀 40,755評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼燃领,長吁一口氣:“原來是場噩夢啊……” “哼士聪!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起猛蔽,我...
    開封第一講書人閱讀 39,660評論 0 276
  • 序言:老撾萬榮一對情侶失蹤剥悟,失蹤者是張志新(化名)和其女友劉穎灵寺,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體区岗,經(jīng)...
    沈念sama閱讀 46,203評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡略板,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,287評論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了慈缔。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片叮称。...
    茶點故事閱讀 40,427評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖藐鹤,靈堂內(nèi)的尸體忽然破棺而出瓤檐,到底是詐尸還是另有隱情,我是刑警寧澤娱节,帶...
    沈念sama閱讀 36,122評論 5 349
  • 正文 年R本政府宣布距帅,位于F島的核電站,受9級特大地震影響括堤,放射性物質(zhì)發(fā)生泄漏碌秸。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,801評論 3 333
  • 文/蒙蒙 一悄窃、第九天 我趴在偏房一處隱蔽的房頂上張望讥电。 院中可真熱鬧,春花似錦轧抗、人聲如沸恩敌。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,272評論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽纠炮。三九已至,卻和暖如春灯蝴,著一層夾襖步出監(jiān)牢的瞬間恢口,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,393評論 1 272
  • 我被黑心中介騙來泰國打工穷躁, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留耕肩,地道東北人。 一個月前我還...
    沈念sama閱讀 48,808評論 3 376
  • 正文 我出身青樓问潭,卻偏偏與公主長得像猿诸,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子狡忙,可洞房花燭夜當晚...
    茶點故事閱讀 45,440評論 2 359

推薦閱讀更多精彩內(nèi)容