首頁/ 家居/ 正文

Gitlab+Jenkins+k8s+Helm 的自動化部署實踐

Gitlab+Jenkins+k8s+Helm 的自動化部署實踐

本文從實踐角度介紹如何結合我們常用的 Gitlab 與 Jenkins,透過 K8s 來實現專案的自動化部署,示例將包括基於 SpringBoot 的服務端專案與基於 Vue。js 的 Web 專案。

本文涉及到的工具與技術包括:

Gitlab —— 常用的原始碼管理系統

Jenkins,Jenkins Pipeline —— 常用的自動化構建、部署工具,Pipeline 以流水線的方式將構建、部署的各個步驟組織起來

Docker,Dockerfile —— 容器引擎,所有應用最終都要以 Docker 容器執行,Dockerfile 是 Docker 映象定義檔案

Kubernetes —— Google 開源的容器編排管理系統

Helm —— Kubernetes 的包管理工具,類似 Linux 的 yum,apt,或 Node 的 npm 等包管理工具,能將 Kubernetes 中的應用及相關依賴服務以包(Chart)的形式組織管理

環境背景:

已使用 Gitlab 做原始碼管理,原始碼按不同的環境建立了 develop(對應開發環境),pre-release(對應測試環境),master(對應生產環境)分支

已搭建了 Jenkins 服務

已有 Docker Registry 服務,用於 Docker 映象儲存(基於 Docker Registry 或Harbor 自建,或使用雲服務,本文使用阿里雲容器映象服務)

已搭建了 K8s 叢集

預期效果:

分環境部署應用,開發環境、測試環境、生產環境分開來,部署在同一叢集的不同namespace,或不同叢集中(比如開發測試部署在本地叢集的不同 namespace中,生產環境部署在雲端叢集)

配置儘可能通用化,只需要透過修改少量配置檔案的少量配置屬性,就能完成新專案的自動化部署配置

開發測試環境在push程式碼時自動觸發構建與部署,生產環境在 master 分支上新增版本 tag 並且 push tag 後觸發自動部署

整體互動流程如下圖

Gitlab+Jenkins+k8s+Helm 的自動化部署實踐

專案配置檔案

首先我們需要在專案的根路徑中新增一些必要的配置檔案,如下圖所示

Gitlab+Jenkins+k8s+Helm 的自動化部署實踐

包括:

Dockerfile 檔案,用於構建 Docker 映象的檔案(參考 Docker筆記(十一):

Dockerfile 詳解與最佳實踐)

Helm 相關配置檔案,Helm 是 Kubernetes 的包管理工具,可以將應用部署相關的Deployment,Service,Ingress 等打包進行釋出與管理(Helm 的具體介紹我們後面再補充)

Jenkinsfile 檔案,Jenkins 的 pipeline 定義檔案,定義了各個階段需執行的任務

Dockerfile

在專案根目錄中新增一個 Dockerfile 檔案(檔名就叫 Dockerfile),定義如何構建Docker 映象,以 Spring Boot 專案為例,

將 SPRING_PROFILES_ACTIVE 透過引數 profile 暴露出來,在構建的時候可以透過 —build-args profile=xxx 來進行動態設定,以滿足不同環境的映象構建要求。

SPRING_PROFILES_ACTIVE 本可以在 Docker 容器啟動時透過 docker run -e SPRING_PROFILES_ACTIVE=xxx 來設定,因這裡使用 Helm 進行部署不直接透過docker run 執行,因此透過 ARG 在映象構建時指定

Helm 配置檔案

Helm 是 Kubernetes 的包管理工具,將應用部署相關的 Deployment,Service,Ingress 等打包進行釋出與管理(可以像 Docker 映象一樣儲存於倉庫中)。如上圖中Helm 的配置檔案包括:

我們可以在 Chart。yaml 中定義每個專案的 chart 名稱(類似安裝包名),如

在 values。yaml 中定義模板檔案中需要用到的變數,如

這裡在預設生成的基礎上添加了 container 部分,可以在這裡指定容器的埠號而不用去改模板檔案(讓模板檔案在各個專案通用,通常不需要做更改),同時新增env的配置,可以在helm部署時往容器裡傳入環境變數。將Service type從預設的ClusterIp改為了NodePort。部署同類型的不同專案時,只需要根據專案情況配置Chart。yaml與values。yaml兩個檔案的少量配置項,templates目錄下的模板檔案可直接複用。

部署時需要在K8s環境中從 Docker 映象倉庫拉取映象,因此需要在K8s中建立映象倉庫訪問憑證(imagePullSecrets)

Jenkinsfile

Jenkinsfile 是 Jenkins pipeline 配置檔案,遵循 Groovy 語法,對於 Spring Boot 專案的構建部署, 編寫 Jenkinsfile 指令碼檔案如下,

Jenkinsfile定義了整個自動化構建部署的流程:

Code Analyze,可以使用 SonarQube 之類的靜態程式碼分析工具完成程式碼檢查,這裡先忽略

Maven Build,啟動一個 Maven 的 Docker 容器來完成專案的 maven 構建打包,掛載 maven 本地倉庫目錄到宿主機,避免每次都需要重新下載依賴包

Docker Build,構建 Docker 映象,並推送到映象倉庫,不同環境的映象透過tag區分,開發環境使用 dev。commitId 的形式,如 dev。88f5822,測試環境使用 test。commitId,生產環境可以將 webhook 事件設定為 tag push event,直接使用 tag名稱

Helm Deploy,使用helm完成新專案的部署,或已有專案的升級,不同環境使用不同的引數配置,如訪問域名,K8s 叢集的訪問憑證kube_config等

Jenkins 配置

Jenkins 任務配置

在 Jenkins 中建立一個 pipeline 的任務,如圖

Gitlab+Jenkins+k8s+Helm 的自動化部署實踐

配置構建觸發器,將目標分支設定為 develop 分支,生成一個 token,如圖

記下這裡的“GitLab webhook URL”及token值,在Gitlab配置中使用。

配置流水線,選擇“Pipeline script from SCM”從專案原始碼中獲取pipeline指令碼檔案,配置專案Git地址,拉取原始碼憑證等,如圖

Gitlab+Jenkins+k8s+Helm 的自動化部署實踐

儲存即完成了專案開發環境的Jenkins配置。測試環境只需將對應的分支修改為pre-release 即可

Jenkins 憑據配置

在 Jenkinsfile 檔案中,我們使用到了兩個訪問憑證——Docker Registry憑證與本地K8s的kube憑證,

這兩個憑證需要在 Jenkins 中建立。

新增 Docker Registry 登入憑證,在 Jenkins 憑據頁面,新增一個使用者名稱密碼型別的憑據,如圖

Gitlab+Jenkins+k8s+Helm 的自動化部署實踐

Gitlab+Jenkins+k8s+Helm 的自動化部署實踐

新增 K8s 叢集的訪問憑證,在 master 節點上將 /root/。kube/config 檔案內容進行 base64 編碼,

使用編碼後的內容在 Jenkins 中建立一個 Secret text 型別的憑據,如圖

在 Secret 文字框中輸入 base64 編碼後的內容。

Gitlab 配置

在 Gitlab 專案的 Settings - Integrations 頁面配置一個 webhook,在 URL 與 Secret Token 中填入前面 Jenkins 觸發器部分的“GitLab webhook URL”及token值,選中“Push events”作為觸發事件,如圖

Gitlab+Jenkins+k8s+Helm 的自動化部署實踐

開發、測試環境選擇“Push events”則在開發人員push程式碼,或merge程式碼到develop,pre-release分支時,就會觸發開發或測試環境的Jenkins pipeline任務完成自動化構建;生產環境選擇“Tag push events”,在往master分支push tag時觸發自動化構建。如圖為pipeline構建檢視

總結

本文介紹使用 Gitlab+Jenkins Pipeline+Docker+Kubernetes+Helm 來實現 Spring Boot專案的自動化部署,只要稍加修改即可應用於其它基於Spring Boot的專案(具體修改的地方在原始碼的 Readme 檔案中說明)。

END

相關文章

頂部