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

一、相關概念

Jenkins簡單介紹[1]

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

使用目的:

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

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

Jenkins擁有的特性包括:

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]

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擁有的特性包括:

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

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

2.靈活的容器調度

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保持最低要求節點數在線,實現彈性伸縮持續集成。

二、準備

1.環境簡介

本次實踐的機器為一年多以來積攢的幾臺服務器,也可以在本地采用虛擬機或在局域網中實踐。

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

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 … 在 slave1、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

三、設置Jenkins

【系統管理】-【插件管理】-【可選插件】安裝 Docker Swarm Plugin 插件

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

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

防火墻沒有開放所有端口,這里只能指定端口8081,否者jenkins master節點與運行在 Swarm 上的slave節點無法通信

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

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

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

其中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.7、gcc、make
docker root用戶運行,包含docker、python2.7、gcc、make

zhouzhi3859/jenkins-jnlp-slave-nodejs

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

四、使用示例

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

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

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

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

回到首頁運行該構建任務

鏡像最小的至少800M,這是最大的缺點,但是除了第一次啟動耗費時間很長,其他還是很快的

除去下載鏡像的時間,大概一到兩分鐘之后,slave節點啟動

在master1上查看Swarm中的任務狀態,可以看見一個jenkins slave運行

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

同樣jenkin也開始顯示構建狀態

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

查看控制臺輸出

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

五、總結

這里所介紹的只是整個持續集成中的彈性伸縮,如果需要完成完整的持續集成流程,需要繼續配置webhook與構建后操作,實現自動測試編譯發布,這里不作詳述。

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

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

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

原文 

https://segmentfault.com/a/1190000019607092

本站部分文章源于互聯網,本著傳播知識、有益學習和研究的目的進行的轉載,為網友免費提供。如有著作權人或出版方提出異議,本站將立即刪除。如果您對文章轉載有任何疑問請告之我們,以便我們及時糾正。

PS:推薦一個微信公眾號: askHarries 或者qq群:474807195,里面會分享一些資深架構師錄制的視頻錄像:有Spring,MyBatis,Netty源碼分析,高并發、高性能、分布式、微服務架構的原理,JVM性能優化這些成為架構師必備的知識體系。還能領取免費的學習資源,目前受益良多

轉載請注明原文出處:Harries Blog? » Jenkins + DockerSwarm 實現彈性伸縮持續集成

贊 (0)
分享到:更多 ()

評論 0

  • 昵稱 (必填)
  • 郵箱 (必填)
  • 網址
2013平特肖公式