基於 KubeSphere CI/CD 將 Spring Boot 項目發佈至 Kubernetes

来源:https://www.cnblogs.com/kubesphere/archive/2019/09/08/11486110.html
-Advertisement-
Play Games

本示例基於開源的 "KubeSphere 容器平臺" 演示如何通過 GitHub 倉庫中的 Jenkinsfile 來創建流水線,流水線共包括 8 個階段,最終將一個 Hello World 頁面部署到 Kubernetes 集群中的不同 namespace。 流水線概覽 下麵的流程圖簡單說明瞭流水 ...


本示例基於開源的 KubeSphere 容器平臺 演示如何通過 GitHub 倉庫中的 Jenkinsfile 來創建流水線,流水線共包括 8 個階段,最終將一個 Hello World 頁面部署到 Kubernetes 集群中的不同 namespace。

流水線概覽

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

流程說明:

  • 階段一. Checkout SCM: 拉取 GitHub 倉庫代碼
  • 階段二. 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,並推送至 DockerHub。
  • 階段六. Deploy to dev: 將 master 分支部署到 Dev 環境,此階段需要審核。
  • 階段七. Push with tag: 生成 tag 並 release 到 GitHub,並推送到 DockerHub。
  • 階段八. Deploy to production: 將發佈的 tag 部署到 Production 環境。

創建憑證

使用 project-regular 登錄 KubeSphere,進入已創建的 devops-demo 工程,開始創建憑證。

1、本示例代碼倉庫中的 Jenkinsfile 需要用到 DockerHub、GitHubkubeconfig (kubeconfig 用於訪問接入正在運行的 Kubernetes 集群) 等一共 3 個憑證 (credentials) 。
2、然後創建一個 Java 的 Token 並複製。

3、最後在 KubeSphere 中進入 devops-demo 的 DevOps 工程中,與上面步驟類似,在 憑證 下點擊 創建,創建一個類型為 秘密文本 的憑證,憑證 ID 命名為 sonar-token,密鑰為上一步複製的 token 信息,完成後點擊 確定

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

修改 Jenkinsfile

第一步:Fork項目

登錄 GitHub,將本示例用到的 GitHub 倉庫 devops-java-sample Fork 至您個人的 GitHub。

第二步:修改 Jenkinsfile

1、Fork 至您個人的 GitHub 後,在 根目錄 進入 Jenkinsfile-online

jenkins-online

2、在 GitHub UI 點擊編輯圖標,需要修改如下環境變數 (environment) 的值。

image-20190409121802459

修改項 含義
DOCKER_CREDENTIAL_ID dockerhub-id 填寫創建憑證步驟中的 DockerHub 憑證 ID,用於登錄您的 DockerHub
GITHUB_CREDENTIAL_ID github-id 填寫創建憑證步驟中的 GitHub 憑證 ID,用於推送 tag 到 GitHub 倉庫
KUBECONFIG_CREDENTIAL_ID demo-kubeconfig kubeconfig 憑證 ID,用於訪問接入正在運行的 Kubernetes 集群
REGISTRY docker.io 預設為 docker.io 功能變數名稱,用於鏡像的推送
DOCKERHUB_NAMESPACE your-dockerhub-account 替換為您的 DockerHub 賬號名
(它也可以是賬戶下的 Organization 名稱)
GITHUB_ACCOUNT your-github-account 替換為您的 GitHub 賬號名,例如 https://github.com/kubesphere/ 則填寫 kubesphere (它也可以是賬戶下的 Organization 名稱)
APP_NAME devops-java-sample 應用名稱
SONAR_CREDENTIAL_ID sonar-token 填寫創建憑證步驟中的 SonarQube token憑證 ID,用於代碼質量檢測

註: Jenkinsfile 中 mvn 命令的參數 -o,表示開啟離線模式。本示例為適應某些環境下網路的干擾,以及避免在下載依賴時耗時太長,已事先完成相關依賴的下載,預設開啟離線模式。

3、修改以上的環境變數後,點擊 Commit changes,將更新提交到當前的 master 分支。

提交更新

創建項目

CI/CD 流水線會根據示例項目的 yaml 模板文件,最終將示例分別部署到 Dev 和 Production 這兩個項目 (Namespace) 環境中,即 kubesphere-sample-devkubesphere-sample-prod,這兩個項目需要預先在控制台依次創建,參考如下步驟創建該項目。

第一步:創建第一個項目

1、使用項目管理員 project-admin 賬號登錄 KubeSphere,在之前創建的企業空間 (demo-workspace) 下,點擊 項目 → 創建,創建一個 資源型項目,作為本示例的開發環境,填寫該項目的基本信息,完成後點擊 下一步

  • 名稱:固定為 kubesphere-sample-dev,若需要修改項目名稱則需在 yaml 模板文件 中修改 namespace
  • 別名:可自定義,比如 開發環境
  • 描述信息:可簡單介紹該項目,方便用戶進一步瞭解

2、本示例暫無資源請求和限制,因此高級設置中無需修改預設值,點擊 創建,項目可創建成功。

第二步:邀請成員

第一個項目創建完後,還需要項目管理員 project-admin 邀請當前的項目普通用戶 project-regular 進入 kubesphere-sample-dev 項目,進入「項目設置」→「項目成員」,點擊「邀請成員」選擇邀請 project-regular 並授予 operator 角色。

第三步:創建第二個項目

同上,參考以上兩步創建一個名稱為 kubesphere-sample-prod 的項目作為生產環境,並邀請普通用戶 project-regular 進入 kubesphere-sample-prod 項目並授予 operator 角色。

說明:當 CI/CD 流水線後續執行成功後,在 kubesphere-sample-devkubesphere-sample-prod 項目中將看到流水線創建的部署 (Deployment) 和服務 (Service)。

project

創建流水線

第一步:填寫基本信息

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

create-pipeline

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

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

basic_info

第二步:添加倉庫

1、點擊代碼倉庫,以添加 Github 倉庫為例。

2、點擊彈窗中的 獲取 Token

git_input

3、在 GitHub 的 access token 頁面填寫 Token description,簡單描述該 token,如 DevOps demo,在 Select scopes 中無需任何修改,點擊 Generate token,GitHub 將生成一串字母和數字組成的 token 用於訪問當前賬戶下的 GitHub repo。

access-token

4、複製生成的 token,在 KubeSphere Token 框中輸入該 token 然後點擊保存。

5、驗證通過後,右側會列出此 Token 關聯用戶的所有代碼庫,選擇其中一個帶有 Jenkinsfile 的倉庫。比如此處選擇準備好的示例倉庫 devops-java-sample,點擊 選擇此倉庫,完成後點擊 下一步

image-20190409122653070

第三步:高級設置

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

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

丟棄舊的分支

說明:

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

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

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

2、行為策略中,KubeSphere 預設添加了三種策略。由於本示例還未用到 從 Fork 倉庫中發現 PR 這條策略,此處可以刪除該策略,點擊右側刪除按鈕。

advance

說明:

支持添加三種類型的發現策略。需要說明的是,在 Jenkins 流水線被觸發時,開發者提交的 PR (Pull Request) 也被視為一個單獨的分支。

發現分支:

  • 排除也作為 PR 提交的分支:選擇此項表示 CI 將不會掃描源分支 (比如 Origin 的 master branch),也就是需要被 merge 的分支
  • 只有被提交為 PR 的分支:僅掃描 PR 分支
  • 所有分支:拉取的倉庫 (origin) 中所有的分支

從原倉庫中發現 PR:

  • PR 與目標分支合併後的源代碼版本:一次發現操作,基於 PR 與目標分支合併後的源代碼版本創建並運行流水線
  • PR 本身的源代碼版本:一次發現操作,基於 PR 本身的源代碼版本創建並運行流水線
  • 當 PR 被髮現時會創建兩個流水線,一個流水線使用 PR 本身的源代碼版本,一個流水線使用 PR 與目標分支合併後的源代碼版本:兩次發現操作,將分別創建兩條流水線,第一條流水線使用 PR 本身的源代碼版本,第二條流水線使用 PR 與目標分支合併後的源代碼版本

3、預設的 腳本路徑Jenkinsfile,請將其修改為 Jenkinsfile-online

註:路徑是 Jenkinsfile 在代碼倉庫的路徑,表示它在示例倉庫的根目錄,若文件位置變動則需修改其腳本路徑。

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

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

Webhook 推送:

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

完成高級設置後點擊 創建

第四步:運行流水線

流水線創建後,點擊瀏覽器的 刷新 按鈕,可見一條自動觸發遠程分支後的運行記錄。

1、點擊右側 運行,將根據上一步的 行為策略 自動掃描代碼倉庫中的分支,在彈窗選擇需要構建流水線的 master分支,系統將根據輸入的分支載入 Jenkinsfile-online (預設是根目錄下的 Jenkinsfile)。

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

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

說明: tag 用於在 Github 和DockerHub 中分別生成帶有 tag 的 release 和鏡像。 註意: 在主動運行流水線以發佈 release 時,TAG_NAME 不應與之前代碼倉庫中所存在的 tag 名稱重覆,如果重覆會導致流水線的運行失敗。

運行流水線

至此,流水線 已完成創建並開始運行。

註:點擊 分支 切換到分支列表,查看流水線具體是基於哪些分支運行,這裡的分支則取決於上一步 行為策略 的發現分支策略。

查看流水線

第五步:審核流水線

為方便演示,此處預設用當前賬戶來審核,當流水線執行至 input 步驟時狀態將暫停,需要手動點擊 繼續,流水線才能繼續運行。註意,在 Jenkinsfile-online 中分別定義了三個階段 (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-online 中被定義。

stage

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

log

驗證運行結果

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

2、流水線最終 build 的 Docker 鏡像也將被成功地 push 到 DockerHub 中,我們在 Jenkinsfile-online 中已經配置過 DockerHub,登錄 DockerHub 查看鏡像的 push 結果,可以看到 tag 為 snapshot、TAG_NAME(master-1)、latest 的鏡像已經被 push 到 DockerHub,並且在 GitHub 中也生成了一個新的 tag 和 release。Hello World 示例頁面最終將以 deployment 和 service 分別部署到 KubeSphere 的 kubesphere-sample-devkubesphere-sample-prod 項目環境中。

環境 訪問地址 所在項目 (Namespace) 部署 (Deployment) 服務 (Service)
Dev http://{$Virtual IP}:{$8080}
或者 http://{$內網/公網 IP}:{$30861}
kubesphere-sample-dev ks-sample-dev ks-sample-dev
Production http://{$Virtual IP}:{$8080}
或者 http://{$內網/公網 IP}:{$30961}
kubesphere-sample-prod ks-sample ks-sample

3、可通過 KubeSphere 回到項目列表,依次查看之前創建的兩個項目中的部署和服務的狀態。例如,以下查看 kubesphere-sample-prod項目下的部署。

進入該項目,在左側的菜單欄點擊 工作負載 → 部署,可以看到 ks-sample 已創建成功。正常情況下,部署的狀態應該顯示 運行中

sample

4、在菜單欄中選擇 網路與服務 → 服務 也可以查看對應創建的服務,可以看到該服務的 Virtual IP 為 10.233.42.3,對外暴露的節點埠 (NodePort) 是 30961

查看服務

service

5、查看推送到您個人的 DockerHub 中的鏡像,可以看到 devops-java-sample就是 APP_NAME 的值,而 tag 也是在 jenkinsfile-online 中定義的 tag。

查看 DockerHub

6、點擊 release,查看 Fork 到您個人 GitHub repo 中的 v0.0.1 tag 和 release,它是由 jenkinsfile 中的 push with tag 生成的。

訪問示例服務

若在內網環境訪問部署的 HelloWorld 示例服務,可通過 SSH 登陸集群節點,或使用集群管理員登陸 KubeSphere 在 web kubectl 中輸入以下命令驗證訪問,其中 Cluster IP 和節點埠 (NodePort) 可通過對應項目下的服務中查看:

驗證 Dev 環境的示例服務

# curl {$Virtual IP}:{$Port} 或者 curl {$內網 IP}:{$NodePort}
curl 10.233.40.5:8080
Hello,World!

驗證 Prodcution 環境的示例服務

# curl {$Virtual IP}:{$Port} 或者 curl {$內網 IP}:{$NodePort}
curl 10.233.42.3:8080
Hello,World!

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


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 生活中的許多事,並不是我們不能做到,而是我們不相信能夠做到 https://www.linuxcool.com/ 一個很實用的Linux命令查詢網站,並且還有發音 如果我們在系統終端中執行一個命令後想立即停止它,可以同時按下Ctrl + C組合鍵(生產環境中比較常用的一個快捷鍵), 這樣將立即終止該 ...
  • 1)進入存放jdk文件的文件夾路徑我這裡是 usr/local/jdk/2)輸入命令 chmod 777 jdk1.8.0_221/bin/java修改許可權3)再次輸入 java -version 成功 轉載於:https://blog.csdn.net/weixin_43748192/articl ...
  • Makefile的基本規則 規則中的每個命令必須以一個tab開頭,有些Makefile版本可能需要兩個。 如果規則的依賴文件太多,可以使用 \ 接續,但是 \ 之後不能加空格,否則會出錯。 預設執行第一個目標。 偽目標 沒有依賴只有執行動作的目標稱為偽目標。 註意:一般用.PHONY來聲明偽目標,避 ...
  • vmware準備 CentOS準備,這裡下載的是CentOS 7.3CentOS-7-x86_64-Everything-1611.iso 創建新的虛擬機 選擇自定義安裝 硬體相容性預設最新的,不用動 選擇稍後安裝操作系統 選擇Linux CentOS64 填寫虛擬機實例名稱並選擇虛擬機存放位置(按 ...
  • 一、概念 1.rpm是什麼?在幫助文檔里我們可以看到,rpm的名字是rpm package manage 的縮寫, 從名字上看就可以知道rpm就是一個包管理工具。簡單說rpm包就是把一些程式編譯成二進位,和一些配置文件以及幫助文檔等一些程式所依賴庫打包在一起,這樣形成的一個包。rpm大大的簡化用戶在 ...
  • 我們需要向centos操作系統的伺服器上上傳文件或者下載文件,這時候,ftp有必要安裝下, 我們選擇主流的vsftp; 第一步:安裝vsftp yum install -y vsftpd 第二步:設置開機啟動 systemctl enable vsftpd 第三步:啟動ftp服務 systemctl ...
  • 上一篇文章分享瞭如何在 KubeSphere 對公共的代碼倉庫 GitHub 和鏡像倉庫 DockerHub 創建流水線,本文將繼續使用 KubeSphere,基於 Harbor 和 GitLab 創建流水線,將 Spring Boot 項目發佈至 Kubernetes。 KubeSphere 集成 ...
  • 隨著網站的運行時間越來越長,日誌文件也會隨之越來越大需要對Nginx日誌進行切割,下麵是每周六晚上自動進行日誌切割的shell腳本 腳本如下: [root@jrjs ~]# vim /usr/local/nginx/logbak.sh #新建腳本名為logbak.sh#!/bin/bash #解釋器 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...