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)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

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