1、Jenkins是什麼
Jenkins是一個開源的、提供友好操作介面的持續整合(CI)工具,起源於Hudson,主要用於持續、自動的構建/測試軟體專案、監控外部任務的執行。
Jenkins用Java語言編寫,可在Tomcat等流行的servlet容器中執行,也可獨立執行。通常與版本管理工具(SCM)、構建工具結合使用。Jenkins可以很好的支援各種語言的專案構建,也完全相容Maven、Ant、Gradle等多種第三方構建工具,同時跟SVN、GIT等常用的版本控制工具無縫整合,也支援直接對接GitHub等原始碼託管網站。
2、Jenkins部署架構概述
Jenkins部署分為以下兩種模式:
- 一種是直接使用單Master安裝Jenkins,直接進行任務管理和業務構建釋出,但可能存在一定的生產安全風險。
- 一種是Master加Agent模式。Master節點主要是處理排程構建作業,把構建分發到Agent實際執行,監視Agent的狀態。業務構建釋出的工作交給Agent進行,即執行Master分配的任務,並返回任務的進度和結果。
Jenkins的Master和Agent均可安裝在虛擬機器或容器中,且組合形式可多樣。
3、Jenkins部署架構詳解
3.1 單節點架構(單Master)
單Master安裝Jenkins,直接進行任務管理和業務構建釋出。虛擬機器單Master安裝Jenkins可以參考《Centos7下安裝配置最新版本Jenkins(2.452.3)》這篇博文。
對於某些特定場景,單節點不足以滿足需求:
- 如果所有執行程式都忙於處理構建任務,則作業(Job)必須等待。
- 當專案的數量或負載增加時,很可能會耗盡資源。
為了恢復並執行Jenkins基礎設施,需要透過增加記憶體、CPU等來增強伺服器,而這不具備可擴充套件性,必須根據需求維護和升級伺服器。
在維護升級過程中,構建環境將被關閉,作業不得不停止,整個Jenkins基礎設施將不可用。
這種單節點架構會造成系統經常處於idle狀態,分配給Jenkins環境的資源在這種狀態下也沒法被充分利用。
單節點架構還會引入安全問題,因為Jenkins使用者對所有資源和工作空間都擁有完全的許可權。
由於這些原因,Jenkins支援分散式架構,其中構建專案的工作負載被委託給多個Jenkins代理。
3.2 分散式架構(Master加Agent)
Master節點主要是處理排程構建作業,把構建分發到Agent實際執行,監視Agent的狀態。業務構建釋出的工作交給Agent進行,即執行Master分配的任務,並返回任務的進度和結果。
Jenkins的Master和Agent均可安裝在虛擬機器或容器中,您可根據自身需求選擇其中一種方案執行。
3.2.1 Agent類別
3.2.1.1 固定Agent
Agent一直執行,任務構建完成後不會銷燬,建立完成後將一直佔用叢集資源,配置過程較簡單。每個Agent可以存在多個Executor,具體的數量應該根據Agent所在主機的系統資源來設定。
- Linux Jenkins(常用);
- Windows Jenkins;
- 容器化方式。
注意 1:很多的構建步驟,有可能會透過執行shell命令進行,於是此時要確保在虛擬機器或Container內部有可用的命令,比如流水線中需要執行mvn命令,需要在虛擬機器或Container映象內安裝配置好maven工具。
3.2.1.2 動態Agent
構建任務時動態建立Agent容器,並在任務構建完成後銷燬容器,可實現資源動態分配,資源利用率高,但是配置過程較為複雜。可以把每個Agent視作一個動態的Executor。
依賴的環境:雲,透過Jenkins Controller(即Jenkins主伺服器)與雲環境進行互動以管理這些動態Agent。Jenkins Controller透過API(依賴外掛)與雲提供商的服務進行通訊,傳送請求以建立新的資源(如虛擬機器或容器)、配置這些資源以作為Jenkins Agent執行,以及在Job完成後銷燬這些資源。這些API呼叫允許Jenkins Controller自動化整個流程,從資源的建立到銷燬,從而實現了Agent的動態管理。
- Docker Plugin,基於配置的Docker Host,按需要建立容器執行Agent,需要事先配置好容器模板;
- Kubernetes Plugin(常用),基於配置的Kubernetes,按需要建立Pod執行Agent,需要事先配置Pod模板。
注意 1:Controller自身既可以部署在K8s上,也完全可以執行在K8s外。
下面以動態Agent(K8s叢集)Jenkins分散式結構圖為例展示下Jenkins分散式架構。
3.2.2 Jenkins分散式結構特點
主節點負責(也叫Controller節點):
- 排程構建作業。
- 將構建作業分發給代理實際執行。
- 監視從節點(Slave),並根據需要停止其工作。
Jenkins代理負責(也叫Slave節點):
- 從主節點接收請求或工作,代理的工作就是按命令列事。
- 可以將工作配置為始終在特定代理上執行。
- 主節點將利用其資源來處理HTTP請求和管理構建環境,構建的實際執行將委託給代理。
透過這種配置,可以橫向擴充套件Jenkins架構,其中Jenkins將安裝在單個節點上。
主要參考:https://support.huaweicloud.com/bestpractice-cce/cce_bestpractice_0066.html