1. 程式人生 > >KubeSphere CI/CD+GitLab+Harbor將Spring Boot專案部署至Kubernetes

KubeSphere CI/CD+GitLab+Harbor將Spring Boot專案部署至Kubernetes

上一篇文章分享瞭如何在 KubeSphere 對公共的程式碼倉庫 GitHub 和映象倉庫 DockerHub 建立流水線,本文將繼續使用 KubeSphere,基於 Harbor 和 GitLab 建立流水線,將 Spring Boot 專案釋出至 Kubernetes。

KubeSphere 集成了 Harbor 和 GitLab,內建的 Harbor 和 GitLab 作為可選安裝項,需在安裝前進行配置開啟安裝。使用者可以根據團隊專案的需求來安裝,方便對專案的映象和程式碼進行管理,非常適合內網環境下的 CI/CD 流水線構建。

目的

本示例演示通過內建 GitLab 倉庫中 Spring Boot 專案的 Jenkinsfile 來建立流水線,流水線共包含 7 個階段,首先會將 GitLab 中的原始碼構建成映象,然後推送到 Harbor 私有倉庫,最終將一個輸出 “Hello,World!” 的Web示例部署到 KubeSphere 叢集中的開發環境 (Dev) 和生產環境 (Production) ,這兩個環境在底層的 Kubernetes 是以專案 (Namespace) 為單位進行資源隔離的。

操作示例

流水線概覽

下面的流程圖簡單說明了流水線完整的工作過程:

流程說明:

  • 階段一. Checkout SCM: 拉取 GitLab 倉庫程式碼
  • 階段二. Unit test: 單元測試,如果測試通過了才繼續下面的任務
  • 階段三. sonarQube analysis:sonarQube 程式碼質量檢測
  • 階段四. Build & push snapshot image: 根據行為策略中所選擇分支來構建映象,並將 tag 為 SNAPSHOT-$BRANCH_NAME-$BUILD_NUMBER 推送至 Harbor (其中 $BUILD_NUMBER 為 pipeline 活動列表的執行序號)。
  • 階段五. Push latest image: 將 master 分支打上 tag 為 latest,並推送至 Harbor。
  • 階段六. Deploy to dev: 將 master 分支部署到 Dev 環境,此階段需要稽核。
  • 階段七. Push with tag: 生成 tag 並 release 到 GitLab,並推送到 Harbor。
  • 階段八. Deploy to production: 將釋出的 tag 部署到 Production 環境。

基礎設定

第一步:修改 CoreDNS 配置

通過 CoreDNS 的 hosts 外掛配置 KubeSphere 叢集的 DNS 服務,使叢集內部可通過 hostname 域名訪問外部服務,參考

修改系統配置 - 如何修改 CoreDNS 配置

第二步:上傳基礎映象到 Harbor

參考 如何上傳基礎映象到 Harbor 匯入預先準備好的基礎映象 java:openjdk-8-jre-alpine

建立憑證

使用專案普通使用者 project-regular 登入 KubeSphere,進入已建立的 DevOps 工程,開始建立憑證。

1、本示例程式碼倉庫中的 Jenkinsfile 需要用到 Harbor、GitLab 和 Kubernetes (kubeconfig 用於訪問接入正在執行的 Kubernetes 叢集) 等一共 3 個憑證 (credentials) ,參考 建立憑證 依次建立這三個憑證。

2、然後參考 訪問 SonarQube 並建立 Token,建立一個 Java 的 Token 並複製。

3、最後在 KubeSphere 中進入 devops-demo 的 DevOps 工程中,與上面步驟類似,在 憑證 下點選 建立,建立一個型別為 祕密文字 的憑證,憑證 ID 命名為 sonar-token,金鑰為上一步複製的 token 資訊,完成後點選 確定

至此,4 個憑證已經建立完成,下一步需要在示例倉庫中的 jenkinsfile 修改對應的四個憑證 ID 為使用者自己建立的憑證 ID。

ce

修改 Jenkinsfile

第一步:進入專案

  1. 根據前提條件中的要求,現應已按照 安裝 GitLab 要求正確將 GitHub 中的 devops-java-sample 匯入到GitLab中。

注:若因網路限制,無法從 GitHub 匯入,請自行 clone 至其他伺服器,然後上傳至 GitLab 倉庫,倉庫名稱請保持一致。

gitlab

  1. 點選專案進入。

第二步:修改 Jenkinsfile

​ 1、在 根目錄 進入 Jenkinsfile-on-prem

jenkins

​ 2、在 GitLab UI 點選編輯 Edit,需要修改如下環境變數 (environment) 的值。

edit

修改項 含義
HARBOR_CREDENTIAL_ID harbor-id 填寫建立憑證步驟中的 Harbor 憑證 ID,用於登入您的 Harbor 倉庫
GITLAB_CREDENTIAL_ID gitlab-id 填寫建立憑證步驟中的 GitLab 憑證 ID,用於推送 tag 到 GitLab 倉庫
KUBECONFIG_CREDENTIAL_ID demo-kubeconfig kubeconfig 憑證 ID,用於訪問接入正在執行的 Kubernetes 叢集
REGISTRY harbor.devops.kubesphere.local:30280 預設為 Harbor 域名,用於映象的推送
HARBOR_NAMESPACE library 預設為 Harbor 下的 library 專案,可根據實際情況更改專案名稱
GITLAB_ACCOUNT admin1 GitLab使用者,預設為admin1
APP_NAME devops-docs-sample 應用名稱
SONAR_CREDENTIAL_ID sonar-token 填寫建立憑證步驟中的 sonarQube token憑證 ID,用於程式碼質量檢測

建立兩個專案

CI/CD 流水線會根據示例專案的 yaml 模板檔案,最終將示例分別部署到 Dev 和 Production 這兩個專案 (Namespace) 環境中,專案名為 kubesphere-sample-devkubesphere-sample-prod,這兩個專案需要預先在控制檯依次建立。

project

建立流水線

第一步:填寫基本資訊

1、進入已建立的 DevOps 工程,選擇左側選單欄的 流水線,然後點選 建立

create-pipeline

2、在彈出的視窗中,輸入流水線的基本資訊。

  • 名稱:為建立的流水線起一個簡潔明瞭的名稱,便於理解和搜尋
  • 描述資訊:簡單介紹流水線的主要特性,幫助進一步瞭解流水線的作用
  • 程式碼倉庫:點選選擇程式碼倉庫,程式碼倉庫需已存在 Jenkinsfile

basic_info

第二步:新增 Git 倉庫

1、點選程式碼倉庫,以新增 GitLab 倉庫為例。

addrepo

2、輸入倉庫URl,預設為http://gitlab.devops.kubesphere.local:30080/admin1/devops-java-sample.git

注意:GitLab 中提供的 HTTP 和 SSH URI 有誤。HTTP URI 需要手動加上埠號30080,SSH URI 需要手動加上協議 ssh:// 和埠號:30090。

證書選擇之前建立的 gitlab-id

點選 「儲存」 後進行下一步。

第三步:高階設定

完成程式碼倉庫相關設定後,進入高階設定頁面,高階設定支援對流水線的構建記錄、行為策略、定期掃描等設定的定製化,以下對用到的相關配置作簡單釋義。

1、構建設定中,勾選 丟棄舊的構建,此處的 保留分支的天數保留分支的最大個數 預設為 -1。

丟棄舊的分支

說明:

分支設定的保留分支的天數和保持分支的最大個數兩個選項可以同時對分支進行作用,只要某個分支的保留天數和個數不滿足任何一個設定的條件,則將丟棄該分支。假設設定的保留天數和個數為 2 和 3,則分支的保留天數一旦超過 2 或者保留個數超過 3,則將丟棄該分支。預設兩個值為 -1,表示不自動刪除分支。

丟棄舊的分支將確定何時應丟棄專案的分支記錄。分支記錄包括控制檯輸出,存檔工件以及與特定分支相關的其他元資料。保持較少的分支可以節省 Jenkins 所使用的磁碟空間,我們提供了兩個選項來確定應何時丟棄舊的分支:

  • 保留分支的天數:如果分支達到一定的天數,則丟棄分支。
  • 保留分支的個數:如果已經存在一定數量的分支,則丟棄最舊的分支。

2、預設的 指令碼路徑 為 Jenkinsfile,需要修改為 Jenkinsfile-on-prem

注:路徑是 Jenkinsfile 在程式碼倉庫的路徑,表示它在示例倉庫的根目錄,若檔案位置變動則需修改其指令碼路徑。

3、在 掃描 Repo Trigger 勾選 如果沒有掃描觸發,則定期掃描,掃描時間間隔可根據團隊習慣設定,本示例設定為 5 minutes

說明:定期掃描是設定一個週期讓流水線週期性地掃描遠端倉庫,根據 行為策略 檢視倉庫有沒有程式碼更新或新的 PR。

Webhook 推送:

Webhook 是一種高效的方式可以讓流水線發現遠端倉庫的變化並自動觸發新的執行,GitHub 和 Git (如 Gitlab) 觸發 Jenkins 自動掃描應該以 Webhook 為主,以上一步在 KubeSphere 設定定期掃描為輔。在本示例中,可以通過手動執行流水線,如需設定自動掃描遠端分支並觸發執行,詳見 設定自動觸發掃描 - GitHub SCM

完成高階設定後點擊 建立

advance

第四步:執行流水線

流水線建立後,點選瀏覽器的 重新整理 按鈕,可見一條自動觸發遠端分支後的執行記錄。

1、點選右側 執行,將根據上一步的 行為策略 自動掃描程式碼倉庫中的分支,在彈窗選擇需要構建流水線的 master分支,系統將根據輸入的分支載入 Jenkinsfile (此示例為根目錄下的 Jenkinsfile-on-prem)。

2、由於倉庫的 Jenkinsfile-on-prem 中 TAG_NAME: defaultValue 沒有設定預設值,因此在這裡的 TAG_NAME 可以輸入一個 tag 編號,比如輸入 v0.0.1。

3、點選 確定,將新生成一條流水線活動開始執行。

說明: tag 用於在 GitLab 和 Harbor 中分別生成帶有 tag 的 release 和映象。 注意: 在主動執行流水線以釋出 release 時,TAG_NAME 不應與之前程式碼倉庫中所存在的 tag 名稱重複,如果重複會導致流水線的執行失敗。

執行流水線

至此,流水線 已完成建立並開始執行。

注:點選 分支 切換到分支列表,檢視流水線具體是基於哪些分支執行,這裡的分支則取決於上一步 行為策略 的發現分支策略。

檢視流水線

第五步:稽核流水線

為方便演示,此處預設用當前賬戶來稽核,當流水線執行至 input 步驟時狀態將暫停,需要手動點選 繼續,流水線才能繼續執行。注意,在 Jenkinsfile-on-prem 中分別定義了三個階段 (stage) 用來部署至 Dev 環境和 Production 環境以及推送 tag,因此在流水線中依次需要對 deploy to dev, push with tag, deploy to production這三個階段稽核 3次,若不稽核或點選 終止 則流水線將不會繼續執行。

稽核流水線

說明:在實際的開發生產場景下,可能需要更高許可權的管理員或運維人員來稽核流水線和映象,並決定是否允許將其推送至程式碼或映象倉庫,以及部署至開發或生產環境。Jenkinsfile 中的 input 步驟支援指定使用者稽核流水線,比如要指定使用者名稱為 project-admin 的使用者來稽核,可以在 Jenkinsfile 的 input 函式中追加一個欄位,如果是多個使用者則通過逗號分隔,如下所示:

···
input(id: 'release-image-with-tag', message: 'release image with tag?', submitter: 'project-admin,project-admin1')
···

檢視流水線

1、點選流水線中 活動 列表下當前正在執行的流水線序列號,頁面展現了流水線中每一步驟的執行狀態,注意,流水線剛建立時處於初始化階段,可能僅顯示日誌視窗,待初始化 (約一分鐘) 完成後即可看到流水線。黑色框標註了流水線的步驟名稱,示例中流水線共 8 個 stage,分別在 Jenkinsfile-on-prem 中被定義。

stage

2、當前頁面中點選右上方的 檢視日誌,檢視流水線執行日誌。頁面展示了每一步的具體日誌、執行狀態及時間等資訊,點選左側某個具體的階段可展開檢視其具體的日誌。日誌可下載至本地,如出現錯誤,下載至本地更便於分析定位問題。

log

驗證執行結果

1、若流水線執行成功,點選該流水線下的 程式碼質量,即可看到通過 sonarQube 的程式碼質量檢測結果,如下圖(僅供參考)。

2、流水線最終 build 的 Docker 映象也將被成功地 push 到 Harbor 中,我們在 Jenkinsfile-on-prem 中已經配置過 Harbor,登入 Harbor 檢視映象的 push 結果,可以看到 tag 為 snapshot、TAG_NAME(master-1)、latest 的映象已經被 push 到 Harbor,並且在 GitLab 中也生成了一個新的 tag 和 release。示例網站最終將以 deployment 和 service 分別部署到 KubeSphere 的 kubesphere-sample-devkubesphere-sample-prod 專案環境中。

環境 訪問地址 所在專案 (Namespace) 部署 (Deployment) 服務 (Service)
Dev 公網 IP : 30861 (${EIP}:${NODEPORT}) kubesphere-sample-dev ks-sample-dev ks-sample-dev
Production 公網 IP : 30961 (${EIP}:${NODEPORT}) kubesphere-sample-prod ks-sample ks-sample

3、可通過 KubeSphere 回到專案列表,依次檢視之前建立的兩個專案中的部署和服務的狀態。例如,以下檢視 kubesphere-sample-prod 專案下的部署。

進入該專案,在左側的選單欄點選 工作負載 → 部署,可以看到 ks-sample 已建立成功。正常情況下,部署的狀態應該顯示 執行中

deploy

4、在選單欄中選擇 網路與服務 → 服務 也可以檢視對應建立的服務,可以看到該服務對外暴露的節點埠 (NodePort) 是 30961

檢視服務 service

5、檢視推送到您個人的 Harbor 中的映象,可以看到 devops-java-sample 就是 APP_NAME 的值,而 tag也是在 Jenkinsfile-on-prem 中定義的 tag。

訪問示例服務

在瀏覽器或通過後臺命令訪問部署到 KubeSphere Dev 和 Production 環境的服務:

Dev 環境

例如,瀏覽器訪問 http://192.168.0.20:30861/ (即 http://IP:NodePort/) 可訪問到 Hello,World! 頁面,或通過後臺命令驗證:

curl http://192.168.0.20:30861
Hello,World!

Prodcution 環境

同上可訪問 http://192.168.0.20:30961/ (即 http://IP:NodePort/) 。

curl http://192.168.0.20:30961
Hello,World!

KubeSphere (https://github.com/kubesphere/kubesphere) 是一個開源的以應用為中心的容器管理平臺,支援部署在任何基礎設施之上,並提供簡單易用的 UI,極大減輕日常開發、測試、運維的複雜度,旨在解決 Kubernetes 本身存在的儲存、網路、安全和易用性等痛點,幫助企業輕鬆應對敏捷開發與自動化監控運維、端到端應用交付、微服務治理、多租戶管理、多叢集管理、服務與網路管理、映象倉庫、AI 平臺、邊緣計