DevOps篇之Jenkins實現k8s集群版本發布以及版本管理

設計思路

通過Jenkins 實現 Kubernetes 集群的版本發布和版本管理。并且利用Jenkins實現多集群 K8s 發布。首先需要了解Helm 的應用場景,以及 GitLab 中配置多集群 KUBECONFIG 等問題。現在工具采用 Jenkins,所以需要重點放在 Jenkins 與 K8s 的集成上,包括版本發布流程、版本管理、回滾機制等。
1、首先,應該考慮整體架構,Jenkins 需要與 K8s 集群通信,所以需要配置 KUBECONFIG,可能涉及憑證管理。然后,版本發布的流程通常包括代碼拉取、構建、測試、打包鏡像、推送鏡像、使用 Helm 或 kubectl 部署到 K8s。版本管理需要跟蹤每個發布的版本,可能包括鏡像標簽、Helm Chart 版本,以及回滾的能力。
2、接下來,環境準備,包括 Jenkins 插件(如 Kubernetes 插件、Docker 插件、Credentials Binding 插件),然后是憑證配置,比如 KUBECONFIG 存儲在 Jenkins 憑證中。然后是流水線設計,可能包括多個階段:構建、測試、構建鏡像、推送鏡像、部署到 K8s(開發、測試、生產環境),每個階段的具體操作。
3、版本管理方面,需要強調鏡像標簽的規范,比如使用 Git Commit 哈希、構建號,確保唯一性和可追溯性。使用 Helm 的話,Chart 版本也需要管理,結合 Jenkins 的構建歷史,可以跟蹤每個版本的部署情況。回滾機制可以利用 K8s 的 Deployment 歷史或 Helm 的回滾功能,在 Jenkins 中通過命令實現。
4、還要考慮多環境部署,比如開發環境自動部署,測試和生產環境手動觸發,或者按順序部署。另外,版本控制的最佳實踐,比如使用 Git 倉庫管理配置文件,集成測試確保發布質量,以及通知機制,比如部署結果通過郵件或 Slack 通知團隊。
在 Jenkins 中實現 Kubernetes(K8s)集群的版本發布與版本管理,核心是通過流水線自動化結合K8s 原生能力與版本控制策略,實現從代碼提交到應用部署的全流程可追溯、可回滾。
以下是具體實現方案,涵蓋環境配置、流水線設計、版本控制與回滾機制。

一、環境準備

1. 核心工具與插件

  • Jenkins 插件
  • Kubernetes Plugin:用于與 K8s 集群交互。
  • Docker Plugin:構建與推送鏡像。
  • Credentials Binding Plugin:管理 K8s 憑證(kubeconfig)。
  • Pipeline Utility Steps:處理 YAML/JSON 配置文件。
  • Git Plugin:拉取代碼與版本控制。

2. 依賴工具

  • kubectl:K8s 命令行工具(需在 Jenkins 節點安裝)。
  • helm:K8s 包管理工具(用于 Chart 部署)。
  • 容器倉庫:Docker Hub/Harbor(存儲應用鏡像)。

3. K8s 集群憑證配置

Jenkins 需通過kubeconfig訪問 K8s 集群,需安全存儲憑證:

  • 進入 Jenkins → Manage Jenkins → Manage Credentials。
  • 選擇全局憑證 → Add Credentials,類型選擇「Secret file」:
  • File:上傳目標 K8s 集群的kubeconfig文件。
  • ID:命名為kubeconfig-prod(或按集群標識命名,如kubeconfig-test)。
  • Description:描述集群用途(如 “生產環境 K8s 集群”)。

二、版本發布核心策略

1. 鏡像版本規范

為確保版本可追溯鏡像標簽需包含唯一標識,推薦格式:
[倉庫地址]/[應用名]:[Git Commit哈希]-[Jenkins構建號]
示例:

harbor.example.com/apps/user-service:7f3a9b2-123
  • Git Commit 哈希:關聯代碼提交,便于定位源碼。
  • 構建號:Jenkins 流水線的唯一編號,確保同 Commit 多次構建可區分。

2. 配置版本管理

使用Helm Chart管理 K8s 資源配置,通過values.yaml區分環境差異:

  • 通用配置:charts/user-service/values.yaml(默認副本數、端口等)。
  • 環境配置:charts/user-service/values-prod.yaml(生產環境資源限制、域名等)。
  • 版本控制:Chart 與配置文件存入 Git 倉庫,每次變更通過 Git Commit 記錄。

三、Jenkins 流水線實現(Jenkinsfile)

流水線分為 構建→測試→鏡像推送→部署→驗證 5個階段,支持多環境部署與版本控制。
Jenkins實現K8s版本發布與管理的流水線
Jenkinsfile如下:

pipeline {agent anyenvironment {// 應用與鏡像信息APP_NAME = "user-service"REGISTRY = "harbor.example.com/apps"// 鏡像標簽:Git Commit短哈希 + 構建號(唯一且可追溯)IMAGE_TAG = "${env.GIT_COMMIT.take(7)}-${env.BUILD_NUMBER}"// Helm Chart目錄與環境配置CHART_DIR = "charts/${APP_NAME}"ENV = "prod"  // 可通過參數化設置為test/dev/prod}parameters {// 部署參數:支持選擇環境、手動輸入版本(用于回滾或指定歷史版本)choice(name: 'DEPLOY_ENV', choices: ['dev', 'test', 'prod'], description: '部署環境')string(name: 'SPECIFY_IMAGE_TAG', defaultValue: '', description: '指定鏡像版本(如空則使用當前構建版本)')}stages {// 階段1:拉取代碼并構建stage('Build') {steps {script {checkout scm  // 拉取Git代碼// 后端構建示例(Maven),前端可替換為npm/yarnsh 'mvn clean package -DskipTests'}}}// 階段2:單元測試與代碼質量檢查stage('Test') {steps {sh 'mvn test'  // 執行單元測試// 可選:集成SonarQube代碼質量檢查withSonarQubeEnv('SonarQube') {sh 'mvn sonar:sonar'}}post {always {junit 'target/surefire-reports/*.xml'  // 收集測試報告}}}// 階段3:構建并推送鏡像stage('Build & Push Image') {when {// 若未指定歷史版本,則構建新鏡像expression { return params.SPECIFY_IMAGE_TAG == '' }}steps {script {// 登錄容器倉庫withCredentials([usernamePassword(credentialsId: 'registry-creds', usernameVariable: 'USER', passwordVariable: 'PWD')]) {sh "docker login ${REGISTRY} -u ${USER} -p ${PWD}"}// 構建鏡像sh "docker build -t ${REGISTRY}/${APP_NAME}:${IMAGE_TAG} ."// 推送鏡像(同時打latest標簽便于引用)sh "docker push ${REGISTRY}/${APP_NAME}:${IMAGE_TAG}"sh "docker tag ${REGISTRY}/${APP_NAME}:${IMAGE_TAG} ${REGISTRY}/${APP_NAME}:latest"sh "docker push ${REGISTRY}/${APP_NAME}:latest"}}}// 階段4:部署到K8s集群(使用Helm)stage('Deploy to K8s') {steps {script {// 確定最終使用的鏡像版本(優先用戶指定,否則用當前構建版本)finalImageTag = params.SPECIFY_IMAGE_TAG ?: IMAGE_TAG// 加載K8s集群憑證(kubeconfig)withCredentials([file(credentialsId: "kubeconfig-${params.DEPLOY_ENV}", variable: 'KUBECONFIG')]) {// 配置kubectl與helm使用目標集群sh "export KUBECONFIG=${KUBECONFIG}"// 檢查Helm Release是否存在,存在則升級,否則安裝def releaseExists = sh script: "helm list -n ${params.DEPLOY_ENV} | grep -q ${APP_NAME}-${params.DEPLOY_ENV}", returnStatus: trueif (releaseExists == 0) {// 升級部署(使用環境專屬values文件)sh """helm upgrade ${APP_NAME}-${params.DEPLOY_ENV} ${CHART_DIR} \--namespace ${params.DEPLOY_ENV} \--set image.repository=${REGISTRY}/${APP_NAME} \--set image.tag=${finalImageTag} \-f ${CHART_DIR}/values-${params.DEPLOY_ENV}.yaml"""} else {// 首次部署(創建命名空間)sh """helm install ${APP_NAME}-${params.DEPLOY_ENV} ${CHART_DIR} \--namespace ${params.DEPLOY_ENV} \--create-namespace \--set image.repository=${REGISTRY}/${APP_NAME} \--set image.tag=${finalImageTag} \-f ${CHART_DIR}/values-${params.DEPLOY_ENV}.yaml"""}// 等待部署完成(超時5分鐘)sh "kubectl rollout status deployment/${APP_NAME}-${params.DEPLOY_ENV} -n ${params.DEPLOY_ENV} --timeout=5m"}}}}// 階段5:部署后驗證與版本記錄stage('Verify & Record') {steps {script {finalImageTag = params.SPECIFY_IMAGE_TAG ?: IMAGE_TAG// 驗證Pod狀態withCredentials([file(credentialsId: "kubeconfig-${params.DEPLOY_ENV}", variable: 'KUBECONFIG')]) {sh """export KUBECONFIG=${KUBECONFIG}# 檢查所有Pod是否運行if ! kubectl get pods -n ${params.DEPLOY_ENV} -l app=${APP_NAME} | grep -q 'Running'; thenecho "部署后Pod狀態異常,終止流程"exit 1fi# 記錄版本信息(存儲到文件或數據庫)echo "部署記錄:環境=${params.DEPLOY_ENV},應用=${APP_NAME},版本=${finalImageTag},時間=$(date)" >> deployment-history.log"""}// 提交版本記錄到Git(可選,用于集中追溯)sh """git config --global user.name "jenkins"git config --global user.email "jenkins@example.com"git add deployment-history.loggit commit -m "Record deployment: ${APP_NAME} ${finalImageTag} to ${params.DEPLOY_ENV}"git push origin main"""}}}}post {// 部署結果通知(郵件/Slack)success {emailext to: 'dev-team@example.com',subject: "[$APP_NAME] 部署成功到 ${params.DEPLOY_ENV}",body: "版本: ${finalImageTag}\n構建鏈接: ${BUILD_URL}"}failure {emailext to: 'dev-team@example.com',subject: "[$APP_NAME] 部署失敗到 ${params.DEPLOY_ENV}",body: "版本: ${finalImageTag}\n構建鏈接: ${BUILD_URL}"}}
}

四、版本管理與回滾機制

1. 版本追蹤

  • 鏡像版本:通過IMAGE_TAG(Git Commit + 構建號)唯一標識,與代碼提交強關聯。
  • 部署記錄:通過deployment-history.log記錄每次部署的環境、版本、時間,并存入 Git 倉庫,實現集中追溯。
  • Jenkins 構建歷史:每個構建對應唯一版本,可通過構建號快速定位部署記錄。

2. 回滾操作

利用 K8s 和 Helm 的原生回滾能力,在 Jenkins 中通過參數化觸發:

// 回滾專用階段(可添加到流水線或單獨創建回滾Job)
stage('Rollback') {when {parameter(name: 'NEED_ROLLBACK', value: 'true')  // 通過參數控制是否回滾}steps {withCredentials([file(credentialsId: "kubeconfig-${params.DEPLOY_ENV}", variable: 'KUBECONFIG')]) {sh """export KUBECONFIG=${KUBECONFIG}# 回滾到Helm歷史版本(如版本2)helm rollback ${APP_NAME}-${params.DEPLOY_ENV} 2 -n ${params.DEPLOY_ENV}# 驗證回滾結果kubectl rollout status deployment/${APP_NAME}-${params.DEPLOY_ENV} -n ${params.DEPLOY_ENV}"""}}
}
  • 回滾觸發:通過 Jenkins 參數SPECIFY_IMAGE_TAG輸入歷史版本號,或直接調用helm rollback指定 Helm Release 版本。
  • 版本查詢:通過helm history ${RELEASE_NAME} -n ${NAMESPACE}查看歷史版本。

五、多環境與多集群擴展

1. 多環境部署通過流水線參數

DEPLOY_ENV(dev/test/prod)區分環境,結合不同values-xxx.yaml配置:

  • 開發環境(dev):副本數少、資源限制低,自動部署。
  • 生產環境(prod):副本數多、資源限制高,手動觸發(通過input步驟確認)。

2. 多集群部署

如需部署到多個 K8s 集群,可擴展憑證與流水線邏輯:
1.為每個集群配置獨立憑證(如kubeconfig-prod-1、kubeconfig-prod-2)。
2.在流水線中通過參數選擇目標集群,循環部署:

stage('Deploy to Multi Clusters') {steps {script {def clusters = ['prod-1', 'prod-2']  // 目標集群列表for (cluster in clusters) {withCredentials([file(credentialsId: "kubeconfig-${cluster}", variable: 'KUBECONFIG')]) {sh "export KUBECONFIG=${KUBECONFIG}"sh "helm upgrade ...  # 部署命令,使用當前集群配置"}}}}
}

六、最佳實踐

1.權限最小化:K8s 集群為 Jenkins 創建專用ServiceAccount,僅授予deployments、services等必要資源的操作權限。
2.鏡像安全掃描:在Build & Push Image階段集成 Trivy/Clair 掃描鏡像漏洞,高風險漏洞阻斷部署。
3.灰度發布:結合 K8s 的RollingUpdate策略(通過 Helm 配置maxSurge和maxUnavailable),實現平滑更新。
4.自動化測試:部署到測試環境后,自動執行 API 測試、負載測試,通過后才允許部署到生產。
5.備份與恢復:定期備份 Helm Release 配置和 K8s 資源清單,應對集群級故障。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/97684.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/97684.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/97684.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

AI 智能體架構中的協議設計三部曲:MCP → A2A → AG-UI

AI 智能體應用在企業實際落地越來越多,一個完整的 AI 智能體應用系統通常包含三個主要角色:用戶、AI 智能體和外部工具。AI 智能體架構設計的核心任務之一,就是解決這三個角色之間的溝通問題。 這三個角色的溝通,涉及到&#xff1…

Unity6最新零基礎入門(知識點復習包含案例)NO.2——Unity6下載與安裝(超詳細)

前言 隨著 Unity 6 版本的推出,全新的功能與優化為開發者帶來了更高效的創作體驗。不過,在真正開始揮灑創意之前,掌握 Unity Hub 的安裝、版本的選擇以及 Unity 6 的正確安裝方法是至關重要的基礎。本文將圍繞這些核心步驟展開,為…

【開題答辯全過程】以 健身愛好者飲食管理小程序為例,包含答辯的問題和答案

個人簡介一名14年經驗的資深畢設內行人,語言擅長Java、php、微信小程序、Python、Golang、安卓Android等開發項目包括大數據、深度學習、網站、小程序、安卓、算法。平常會做一些項目定制化開發、代碼講解、答辯教學、文檔編寫、也懂一些降重方面的技巧。感謝大家的…

基于JavaScript的智能合約平臺(Agoric)

Agoric通過對象能力模型提升安全性,被用于去中心化金融(DeFi)衍生品開發。通過簡化開發流程和增強安全性,推動去中心化應用(DApps)的大規模落地。Agoric成立于2018年,由斯坦福大學校友Mark Mill…

mysql實例是什么?

在 ??MySQL?? 的語境中,??“MySQL 實例”(MySQL Instance)?? 是指:??一個正在運行的 MySQL 服務進程及其所管理的獨立數據庫環境,包括內存結構、后臺線程、配置參數、數據文件等。一個 MySQL 實例可以管理一…

別再說AppInventor2只能開發安卓了!蘋果iOS現已支持!

AppInventor2中文網(https://www.fun123.cn)已完成v2.76版本升級。 AI伴侶升級至v2.76,Android SDK由34升級至35,安卓版本由14升級至15。已支持安卓15! 重磅升級!!支持蘋果iOS編譯及上架…

2025 批量下載雪球和東方財富帖子和文章導出excel和pdf

之前分享過雪球下載 2025年如何批量下載雪球帖子和文章導出pdf?,今天再整理分享下最新雪球和東方財富文章導出excel和pdf 以雪球這個號為例 下載的所有帖子文章內容html: 然后用我開發的工具批量轉換為pdf 2025 更新版:蘇生不…

JavaEE 初階第十八期:叩開網絡世界的大門

專欄:JavaEE初階起飛計劃 個人主頁:手握風云 目錄 一、網絡發展史 1.1. 獨立模式 1.2. 網絡互連 二、網絡分類 2.1. 局域網 2.2. 廣域網 三、IP地址 3.1. 概念 3.2. 格式 四、端口號 4.1. 概念 4.2. 格式 五、協議 5.1. 概念 5.2. 作用 …

SOME/IP-SD中IPv4 SD端點選項詳解

<摘要> 本解析圍繞IPv4 SD端點選項在AUTOSAR AP R22-11規范中的定義與應用展開。該選項是SOME/IP服務發現&#xff08;SD&#xff09;協議中的關鍵字段&#xff0c;用于在網絡地址不可達或變化的場景下&#xff08;如經NAT網關或使用多宿主設備時&#xff09;&#xff0c…

.NET 8 集成 JWT Bearer Token

注意&#xff1a;這是一種非常簡單且不是最低限度安全的設置 JWT 的方法。步驟 1——安裝軟件包首先&#xff0c;您需要安裝一些 NuGet 包。dotnet add package Microsoft.AspCore.Authentication.JwtBearer dotnet add package System.IdentityModel.Tokens.Jwt步驟 2——創建…

模型匯總-數學建模

一、優化模型1.線性規劃線性規劃&#xff08;Linear Programming, LP&#xff09;是一種數學優化方法&#xff0c;用于在給定的線性約束條件下&#xff0c;找到線性目標函數的最大值或最小值。它是運籌學中最常用的方法之一。線性規劃的標準形式最大化問題標準形式&#xff1a;…

2025年09月計算機二級MySQL選擇題每日一練——第十二期

計算機二級中選擇題是非常重要的&#xff0c;本期是這個系列的最后一期了&#xff01; 答案及解析將在末尾公布&#xff01; 今日主題&#xff1a;綜合應用進階 1、設有如下創建表的語句&#xff1a; CREATE TABLE tb_test( ID INT NOT NULL PRIMARY KEY, sno CHAR(10) NOT …

計組(2)CPU與指令

一、總體認識CPU1、軟硬件角度CPU&#xff0c;全稱就是中央處理器。從硬件上來說&#xff0c;CPU是一個超大規模集成電路&#xff0c;通過電路實現加法、乘法乃至各種各樣的處理邏輯。從軟件來說&#xff0c;CPU就是一個執行各種計算機指令的邏輯機器。2、計算機指令所謂的計算…

用Java讓家政服務觸手可及

家政服務不僅僅包括日常保潔&#xff0c;隨著社會的發展&#xff0c;從日常保潔、衣物清潔到家電維修、月嫂保姆&#xff0c;家政服務的場景越發多元。用戶不僅追求服務的 “專業度”&#xff0c;更看重 “便捷性”—— 能否快速找到服務、預約服務、了解服務效果&#xff1f;上…

Python OpenCV圖像處理與深度學習:Python OpenCV特征檢測入門

特征檢測與描述&#xff1a;探索圖像中的關鍵點 學習目標 通過本課程&#xff0c;學員們將掌握特征檢測的基本概念&#xff0c;了解如何使用OpenCV庫中的SIFT和SURF算法進行特征點檢測和特征描述符的計算。實驗將通過理論講解與實踐操作相結合的方式&#xff0c;幫助學員深入理…

ECDH (橢圓曲線迪菲-赫爾曼密鑰交換)

文章目錄一、什么是ECDH&#xff1f;二、為什么需要 ECDH&#xff1f;要解決什么問題&#xff1f;三、原理與圖示四、核心比喻&#xff1a;混合顏料五、技術實現步驟1. 約定公共參數2. 生成密鑰對3. 交換公鑰4. 計算共享密鑰5. 密鑰派生六、注意事項七、安全性基礎八、優勢特點…

Spring Boot實戰:打造高效Web應用,從入門到精通

目錄一、Spring Boot 初相識二、搭建開發環境2.1 安裝 JDK2.2 安裝 IDE&#xff08;以 IntelliJ IDEA 為例&#xff09;2.3 初始化 Spring Boot 項目三、Spring Boot 基礎配置3.1 配置文件詳解&#xff08;application.properties 和 application.yml&#xff09;3.2 自定義配置…

2025網絡安全宣傳周知識競賽答題活動怎么做

網絡安全答題PK小程序可以結合競技性、趣味性和知識性&#xff0c;設計以下核心功能模塊&#xff0c;提升用戶參與度和學習效果&#xff1a;一、核心PK功能實時對戰匹配 隨機匹配在線用戶&#xff08;按段位/積分相近原則&#xff09; 好友定向PK&#xff08;支持分享邀請對戰&…

echo、seq、{}、date、bc命令

文章目錄echo、seq、{}、date、bc命令echo案例seq命令案例{}花括號列表擴展序列擴展嵌套擴展datebc(高精度計算器)echo、seq、{}、date、bc命令 echo echo命令是一個常用的Shell命令&#xff0c;用于在終端上輸出文本。它的基本語法如下&#xff1a; echo [option] [string]…

Vue2之Vuex

文章目錄 數據準備新建項目選擇模塊安裝vscode工具打開 刪除無用文件刪除src/assets文件下的所有內容刪除src/components文件下的所有內容修改src/app.vuevscode運行項目 一、 概述1.是什么2. 使用場景3.優勢4 Vuex流程圖5.注意&#xff1a; 二、需求: 多組件共享數據創建三個組…