Jenkins + DockerSwarm 實現彈性伸縮持續集成

1、相關概念
Jenkins簡單介紹[1]node

Jenkins是一個開源軟件項目,旨在提供一個開放易用的軟件平臺,使軟件的持續集成變成可能。

使用目的:python

持續、自動地構建/測試軟件項目。

監控一些定時執行的任務。

Jenkins擁有的特性包括:web

1.易於安裝-只要把jenkins.war部署到servlet容器,不須要數據庫支持。

2.易於配置-全部配置都是經過其提供的web界面實現。有些配置如MAVEN_HOME和Email,只須要配置一次,全部的項目就都能用。固然也能夠經過修改XML進行配置。

3.集成RSS/E-mail經過RSS發佈構建結果或當構建完成時經過e-mail通知。

4.生成JUnit/TestNG測試報告。

5.分佈式構建支持Jenkins可以讓多臺計算機一塊兒構建/測試。

6.文件識別:Jenkins可以跟蹤哪次構建生成哪些jar,哪次構建使用哪一個版本的jar等。

7.插件支持:支持擴展插件,你能夠開發適合本身團隊使用的工具。

8.測試報告聚合,全部模塊的測試報告都被聚合在一塊兒,結果一目瞭然,使用其餘CI,這幾乎是件不可能完成的任務。

9.構件指紋(artifact fingerprint),每次build的結果構件都被很好的自動管理,無需任何配置就能夠方便的瀏覽下載。

DockerSwarm簡單介紹[2]docker

Swarm 在 Docker 1.12 版本以前屬於一個獨立的項目,在 Docker 1.12 版本發佈以後,該項目合併到了 Docker 中,成爲 Docker 的一個子命令。目前,Swarm 是 Docker 社區提供的惟一一個原生支持 Docker 集羣管理的工具。它能夠把多個 Docker 主機組成的系統轉換爲單一的虛擬 Docker 主機,使得容器能夠組成跨主機的子網網絡。

Docker Swarm 是一個爲 IT 運維團隊提供集羣和調度能力的編排工具。用戶能夠把集羣中全部 Docker Engine 整合進一個「虛擬 Engine」的資源池,經過執行命令與單一的主 Swarm 進行溝通,而沒必要分別和每一個 Docker Engine 溝通。在靈活的調度策略下,IT 團隊能夠更好地管理可用的主機資源,保證應用容器的高效運行。

DockerSwarm擁有的特性包括:shell

1.任何規模都有高性能表現數據庫

對於企業級的 Docker Engine 集羣和容器調度而言,可拓展性是關鍵。任何規模的公司——不管是擁有五個仍是上千個服務器——都能在其環境下有效使用 Swarm。 通過測試,Swarm 可拓展性的極限是在 1000 個節點上運行 50000 個部署容器,每一個容器的啓動時間爲亞秒級,同時性能無減損。

2.靈活的容器調度api

Swarm 幫助 IT 運維團隊在有限條件下將性能表現和資源利用最優化。Swarm 的內置調度器(scheduler)支持多種過濾器,包括:節點標籤,親和性和多種容器部策略如 binpack、spread、random 等等。

3.服務的持續可用性安全

Docker Swarm 由 Swarm Manager 提供高可用性,經過建立多個 Swarm master 節點和制定主 master 節點宕機時的備選策略。若是一個 master 節點宕機,那麼一個 slave 節點就會被升格爲 master 節點,直到原來的 master 節點恢復正常。 此外,若是某個節點沒法加入集羣,Swarm 會繼續嘗試加入,並提供錯誤警報和日誌。在節點出錯時,Swarm 如今能夠嘗試把容器從新調度到正常的節點上去。

和 Docker API 及整合支持的兼容性Swarm 對 Docker API 徹底支持,這意味着它能爲使用不一樣 Docker 工具(如 Docker CLI,Compose,Trusted Registry,Hub 和 UCP)的用戶提供無縫銜接的使用體驗。

Docker Swarm 爲 Docker 化應用的核心功能(諸如多主機網絡和存儲卷管理)提供原生支持。開發的 Compose 文件能(經過 docker stack deploy )輕易地部署到測試服務器或 Swarm 集羣上。Docker Swarm 還能夠從 Docker Trusted Registry 或 Hub 裏 pull 並 run 鏡像。

綜上所述,Docker Swarm 提供了一套高可用 Docker 集羣管理的解決方案,徹底支持標準的 Docker API,方便管理調度集羣 Docker 容器,合理充分利用集羣主機資源。並不是全部服務都應該部署在Swarm集羣內。數據庫以及其它有狀態服務就不適合部署在Swarm集羣內。

Jenkins與Swarm相結合,Jenkins主節點保持在線,子節點運行在Swarm集羣上,主節點負責對子節點進行調度,使整個Jenkins保持最低要求節點數在線,實現彈性伸縮持續集成。

2、準備
1.環境簡介
本次實踐的機器爲一年多以來積攢的幾臺雲服務器,也能夠在本地採用虛擬機或在局域網中實踐。服務器

服務器一覽

2.Jenkins安裝
參照 官方文檔 安裝網絡

設置運行用戶爲root

vi /etc/sysconfig/jenkins
...
JENKINS_USER="root" 
...

防火牆開放端口8080(Jenkins默認端口)、8081(後面說明)

3.Swarm準備
在幾臺服務器安裝Docker,安裝方式參考Centos7上安裝docker

全部節點防火牆開放端口2377,主節點與備選主節點防火牆額外開放端口9999

開啓主節點與備選主節點上docker的遠程調用端口

查看配置文件路徑
systemctl show --property=FragmentPath docker // FragmentPath=/usr/lib/systemd/system/docker.service

編輯配置文件內容
vi /usr/lib/systemd/system/docker.service

修改對應項
ExecStart=/usr/bin/dockerd => ExecStart=/usr/bin/dockerd -H unix:///var/run/docker.sock -H tcp://0.0.0.0:9999

從新加載配置文件,重啓docker 
systemctl daemon-reload
systemctl restart docker

在master1上初始化Swarm集羣

docker swarm init

docker swarm join-token manager

docker swarm join-token worker

將上面第二條指令輸出的提示中的 docker swarm join --token ... 在 master2 上執行

將上面第三條指令輸出的提示中的 docker swarm join --token ... 在 slave一、slave2 上執行

在master1上執行 docker node ls 查看集羣狀態

ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION
* ** Ready Active 18.06.0-c
* ** Ready Active Leader 18.09.0
* ** Ready Active Reachable 18.06.1-ce
* ** Ready Active 18.06.0-ce

3、設置Jenkins
【系統管理】-【插件管理】-【可選插件】安裝 Docker Swarm Plugin 插件

【系統管理】-【全局安全配置】-【代理】

代理

防火牆沒有開放全部端口,這裏只能指定端口8081,否者jenkins master節點與運行在 Swarm 上的slave節點沒法通訊

【系統管理】-【系統設置】-【雲】
雲
雲

其中Docker swarm api url 爲master1的網絡地址和以前設置的docker的遠程調用端口
因爲沒有配置調用校驗,因此不能使用默認的2375端口,改用不經常使用的端口9999,不然會被惡意調用,將其用來運行挖礦等惡意程序

Docker Agent template 爲jenkins slave節點的模板
模板能夠配置多個,其中Label爲標籤
在進行構建的時候指定運行節點爲 SWARM-NODE-NODEJS 便可經過 Image 指定的鏡像啓動slave節點

Env 爲環境變量
格式爲 "key1=value1 key2=value2"

Host Binds 爲文件映射配置
配置 /var/run/docker.sock:/var/run/docker.sock 使容器中的docker client 與 宿主機上的 docker server正確通訊

鏡像介紹

基礎鏡像均爲 jenkinsci/jnlp-slave

zhouzhi3859/jenkins-jnlp-slave-root

tag 描述
latest root用戶運行,包含python2.七、gcc、make
docker root用戶運行,包含docker、python2.七、gcc、make

zhouzhi3859/jenkins-jnlp-slave-nodejs

tag 描述
latest root用戶運行,包含python2.七、gcc、make、node10
docker root用戶運行, 包含python2.七、gcc、make、node十、docker-client
node-10-docker root用戶運行, 包含python2.七、gcc、make、node十、docker-client
node-10 root用戶運行, 包含python2.七、gcc、make、node10
node-8-docker root用戶運行, 包含python2.七、gcc、make、node八、docker-client
node-8 root用戶運行, 包含python2.七、gcc、make、node8

4、使用示例
新建一個自由風格的任務,取名test,勾選 限制項目運行的節點,輸入上面的Label SWARM-NODE-NODEJS:DOCKER
示例

在下面構建步驟中勾選執行shell,輸入 "node -v" "docker version" 方便查看運行效果
示例

最後點擊【應用】【保存】

回到首頁運行該構建任務

鏡像最小的至少800M,這是最大的缺點,可是除了第一次啓動耗費時間很長,其餘仍是很快的
除去下載鏡像的時間,大概一到兩分鐘以後,slave節點啓動

在master1上查看Swarm中的任務狀態,能夠看見一個jenkins slave運行
示例

一樣jenkin也開始顯示構建狀態
示例

查看控制檯輸出

示例

5、總結
這裏所介紹的只是整個持續集成中的彈性伸縮,若是須要完成完整的持續集成流程,須要繼續配置webhook與構建後操做,實現自動測試編譯發佈,這裏不做詳述。

沒有構建任務時,只須要保存主節點在線。一旦構建的webhook被觸發,主節點會去Swarm裏面啓動子節點,構建任務完成後,子節點被刪掉,只保持最少的節點在線,靈活使用資源。

[[1].Jenkins系列一:安裝和簡單配置](https://www.jianshu.com/p/422...

[[2].Docker 三劍客之 Docker Swarm](https://www.jianshu.com/p/d7d...

相關文章
相關標籤/搜索