DevOps篇之利用Jenkins實現多K8S集群的版本發布

重點說明

在 Jenkins 中實現多 K8s 集群的版本發布與版本控制,核心在于解決集群身份認證、配置隔離、發布策略協調、版本統一追溯四大問題。以下是具體實現方案,結合工具鏈集成與流水線設計,確保多集群環境下的發布一致性與可控性。

一、核心前提

1. 多集群環境準備

1. 集群標識

為每個 K8s 集群分配唯一標識(如prod-cluster-1、staging-cluster),便于在 Jenkins 中區分。

2. 統一網絡

Jenkins 節點需能訪問所有目標集群的 API Server(通過 VPN 或公網暴露 + 認證限制)。

3. 權限控制

每個集群為 Jenkins 創建專用ServiceAccount,通過 RBAC 限制權限(僅允許部署、更新指定 Namespace 資源)。

2、多集群認證與憑證管理

1. 憑證管理

Jenkins 通過kubeconfig文件與 K8s 集群通信,需安全管理多集群的kubeconfig,確保安全隔離
進入 Manage Jenkins → Manage Credentials,添加「Secret file」類型憑證。
命名規則:kubeconfig-{cluster-id}(如kubeconfig-prod-eu),分別對應各集群的kubeconfig文件。

2. 憑證存儲方式
  • Jenkins Credentials:將每個集群的kubeconfig作為 “Secret file” 類型存儲,ID 命名格式為kubeconfig-{cluster-id}(如kubeconfig-prod-1)。
  • 動態生成:通過 Vault 等密鑰管理工具,在流水線運行時動態拉取kubeconfig(更安全,適合敏感環境)。
3. 憑證使用示例

在 Jenkins 中配置憑證流水線可通過credentialsId引用對應集群的kubeconfig:

// 加載prod-cluster-1的kubeconfig
withCredentials([file(credentialsId: 'kubeconfig-prod-1', variable: 'KUBECONFIG_PATH')]) {sh 'kubectl --kubeconfig=$KUBECONFIG_PATH get nodes'  // 操作目標集群
}

二、多集群發布策略設計

根據業務需求,常見的多集群發布策略包括:串行發布(按順序逐個部署)、并行發布(同時部署無依賴集群)、灰度發布(先測試集群再生產集群)。

三、Jenkins 流水線實現(Jenkinsfile)

以下流水線支持多集群選擇、策略配置、版本控制與故障熔斷,兼容上述所有發布策略。
Jenkins多K8s集群版本發布流水線

pipeline {agent anyparameters {// 參數1:選擇目標集群(可多選,用逗號分隔)string(name: 'TARGET_CLUSTERS',defaultValue: 'staging,prod-eu,prod-us',description: '目標集群列表(用逗號分隔,如staging,prod-eu)')// 參數2:發布策略(串行/并行)choice(name: 'DEPLOY_STRATEGY',choices: ['serial', 'parallel'],description: '發布策略:serial(串行)/parallel(并行)')// 參數3:發布順序(僅串行有效,按集群優先級排序)string(name: 'SERIAL_ORDER',defaultValue: 'staging,prod-eu,prod-us',description: '串行發布順序(需與TARGET_CLUSTERS一致,用逗號分隔)')// 參數4:指定鏡像版本(默認使用當前構建版本)string(name: 'IMAGE_TAG',defaultValue: '',description: '指定鏡像版本(如空則自動生成:commit-hash-buildnumber)')}environment {APP_NAME = "user-service"REGISTRY = "harbor.example.com/apps"// 自動生成鏡像標簽(Git Commit短哈希+構建號)AUTO_IMAGE_TAG = "${env.GIT_COMMIT.take(7)}-${env.BUILD_NUMBER}"// 最終使用的版本(優先用戶指定)FINAL_IMAGE_TAG = "${params.IMAGE_TAG ?: env.AUTO_IMAGE_TAG}"// Helm Chart目錄CHART_DIR = "charts/${APP_NAME}"}stages {// 階段1:前置檢查(鏡像存在性、集群連通性)stage('Pre-Check') {steps {script {def clusters = params.TARGET_CLUSTERS.split(',')// 1. 檢查鏡像是否存在withCredentials([usernamePassword(credentialsId: 'registry-creds', usernameVariable: 'USER', passwordVariable: 'PWD')]) {sh """docker login ${REGISTRY} -u ${USER} -p ${PWD}if ! docker pull ${REGISTRY}/${APP_NAME}:${FINAL_IMAGE_TAG}; thenecho "鏡像 ${FINAL_IMAGE_TAG} 不存在,終止發布"exit 1fi"""}// 2. 檢查所有目標集群的連通性for (cluster in clusters) {withCredentials([file(credentialsId: "kubeconfig-${cluster}", variable: 'KUBECONFIG')]) {sh """kubectl --kubeconfig=${KUBECONFIG} cluster-info || {echo "集群 ${cluster} 連接失敗"exit 1}"""}}}}}// 階段2:構建鏡像(僅當未指定版本時執行)stage('Build Image') {when {expression { return params.IMAGE_TAG == '' }}steps {withCredentials([usernamePassword(credentialsId: 'registry-creds', usernameVariable: 'USER', passwordVariable: 'PWD')]) {sh """docker login ${REGISTRY} -u ${USER} -p ${PWD}docker build -t ${REGISTRY}/${APP_NAME}:${FINAL_IMAGE_TAG} .docker push ${REGISTRY}/${APP_NAME}:${FINAL_IMAGE_TAG}"""}}}// 階段3:多集群發布(根據策略選擇串行/并行)stage('Deploy to Clusters') {steps {script {def targetClusters = params.TARGET_CLUSTERS.split(',')if (params.DEPLOY_STRATEGY == 'serial') {// 串行發布:按指定順序逐個部署,前一個成功才繼續def serialClusters = params.SERIAL_ORDER.split(',')// 校驗串行順序是否包含在目標集群中def invalid = serialClusters.find { !targetClusters.contains(it) }if (invalid) {error("串行順序中的集群 ${invalid} 不在目標集群列表中")}for (cluster in serialClusters) {deployToCluster(cluster)  // 調用部署函數}} else {// 并行發布:同時部署所有目標集群parallel targetClusters.collectEntries { cluster ->["部署到 ${cluster}": { deployToCluster(cluster) }]}}}}}// 階段4:版本記錄與審計stage('Record Version') {steps {sh """# 記錄本次發布的集群-版本映射echo "$(date +%Y-%m-%d_%H:%M:%S) - ${APP_NAME} - ${FINAL_IMAGE_TAG} - 集群: ${TARGET_CLUSTERS}" >> deployment-history.log# 提交到Git倉庫(用于審計)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} ${FINAL_IMAGE_TAG} to ${TARGET_CLUSTERS}"git push origin main"""}}}post {failure {// 發布失敗通知(郵件/Slack)emailext to: 'devops@example.com',subject: "[$APP_NAME] 多集群發布失敗: ${FINAL_IMAGE_TAG}",body: "失敗集群: ${TARGET_CLUSTERS}\n構建鏈接: ${BUILD_URL}"}}
}// 部署到單個集群的函數(復用邏輯)
def deployToCluster(String cluster) {echo "===== 開始部署 ${cluster} 集群 ====="// 每個集群的命名空間(如staging集群用staging命名空間)def namespace = clusterwithCredentials([file(credentialsId: "kubeconfig-${cluster}", variable: 'KUBECONFIG')]) {sh """# 檢查命名空間是否存在,不存在則創建if ! kubectl --kubeconfig=${KUBECONFIG} get namespace ${namespace}; thenkubectl --kubeconfig=${KUBECONFIG} create namespace ${namespace}fi# 檢查Helm Release是否存在,存在則升級,否則安裝if helm --kubeconfig=${KUBECONFIG} list -n ${namespace} | grep -q ${APP_NAME}; thenhelm --kubeconfig=${KUBECONFIG} upgrade ${APP_NAME} ${CHART_DIR} \-n ${namespace} \--set image.repository=${REGISTRY}/${APP_NAME} \--set image.tag=${FINAL_IMAGE_TAG} \--set cluster=${cluster}  # 傳遞集群標識到Chartelsehelm --kubeconfig=${KUBECONFIG} install ${APP_NAME} ${CHART_DIR} \-n ${namespace} \--set image.repository=${REGISTRY}/${APP_NAME} \--set image.tag=${FINAL_IMAGE_TAG} \--set cluster=${cluster}fi# 等待部署完成(超時10分鐘)kubectl --kubeconfig=${KUBECONFIG} rollout status deployment/${APP_NAME} -n ${namespace} --timeout=10m# 驗證Pod狀態if ! kubectl --kubeconfig=${KUBECONFIG} get pods -n ${namespace} -l app=${APP_NAME} | grep -q 'Running'; thenecho "${cluster} 集群部署后Pod異常,觸發回滾"helm --kubeconfig=${KUBECONFIG} rollback ${APP_NAME} 0 -n ${namespace}exit 1fi"""}echo "===== ${cluster} 集群部署成功 ====="
}

四、核心策略解析

1. 串行發布(Serial Deployment)

適用場景:集群間有依賴關系(如先部署歐洲集群,再部署美國集群)、需逐步驗證的核心業務。
實現邏輯:按SERIAL_ORDER參數指定的順序逐個部署,前一個集群部署成功且健康檢查通過后,才開始下一個集群的部署。
優勢:故障影響范圍小,便于逐步發現問題(如某集群配置錯誤)。

2. 并行發布(Parallel Deployment)

適用場景:集群獨立無依賴(如多區域冗余部署)、非核心業務追求發布效率。
實現邏輯:通過 Jenkins 的parallel語法同時部署所有目標集群,各集群部署過程互不阻塞。
優勢:發布速度快,適合大規模集群批量更新。

3. 灰度發布(Canary Deployment)

可基于上述流水線擴展,先部署測試集群驗證,再按比例部署生產集群:

// 示例:灰度發布擴展
stage('Canary Deploy') {steps {script {// 1. 先部署測試集群deployToCluster('staging')// 2. 人工確認后,部署10%的生產集群input message: '測試集群驗證通過?', ok: '繼續'deployToCluster('prod-eu-10pct')  // 10%流量的生產集群// 3. 監控無異常后,全量部署生產集群input message: '灰度集群無異常?', ok: '全量部署'deployToCluster('prod-eu')deployToCluster('prod-us')}}
}

五、關鍵技術點

1. 集群隔離與認證

通過kubeconfig-{cluster-id}憑證動態加載對應集群的配置,kubectl和helm命令通過–kubeconfig參數指定目標集群,確保操作隔離。

2. 版本一致性

所有集群使用相同的FINAL_IMAGE_TAG(鏡像版本),通過 Helm Chart 的–set cluster=${cluster}傳遞集群專屬參數,既保證版本統一,又支持集群差異化配置。

3. 故障熔斷與回滾

單個集群部署失敗時,通過exit 1終止流水線,避免影響其他集群(串行模式)。
部署后 Pod 異常自動執行helm rollback回滾到上一版本,減少故障時間。

4. 審計與追溯

通過deployment-history.log記錄每次發布的集群、版本和時間,并存入 Git 倉庫,實現全鏈路可追溯。

六、最佳實踐

  1. 集群分組管理:將集群按環境(staging/prod)、區域(eu/us)分組,通過參數快速選擇分組(如TARGET_CLUSTERS=prod-*)。
  2. 配置預校驗:在Pre-Check階段添加helm template渲染配置,檢查集群專屬參數是否沖突(如資源限制超出節點能力)。
  3. 資源限制控制:通過 Helm Chart 限制每個集群的資源使用(CPU / 內存),避免單集群過度占用資源。
  4. 定期演練:定期執行跨集群回滾演練,驗證helm rollback在多集群環境的有效性。

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

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

相關文章

Day16_【機器學習—KNN算法】

一、KNN 簡介KNN:K-近鄰算法 (K Nearest Neighbor)算法思想:一個樣本最相似的 k 個樣本中的大多數屬于某一個類別,則該樣本也屬于這個類別距離計算:歐氏距離二、KNN 解決兩類問題分類問題與回歸問題分類流程…

《架構師手記:SpringCloud整合Nacos實戰·一》

《架構師手記:SpringCloud整合Nacos實戰一》 🌈 第一章:SpringCloud與Nacos的初識之旅 引言 在微服務架構的浪潮中,服務發現和配置管理成為了每個架構師必須面對的挑戰。今天,我們將開啟一段SpringCloud與Nacos的探…

卷積神經網絡訓練全攻略:從理論到實戰

卷積神經網絡(Convolutional Neural Networks, CNN)作為深度學習的重要分支,已成為計算機視覺領域的核心技術。從圖像分類到目標檢測,從人臉識別到醫學影像分析,CNN 展現出了強大的特征提取和模式識別能力。本文將全面…

從零開始學習n8n-定時器+HTTP+飛書多維表格(上)

概述零基礎也能把自動化玩明白:本篇將從“為什么要做自動化”出發,帶你在 n8n 里新建第一個工作流,只用兩個核心節點——Schedule Trigger(定時器) 與 HTTP Request。你會學會如何按固定頻率觸發流程、向接口發起請求、…

小白成長之路-k8s原理(二)

文章目錄一、Service原理1.1概述1.2為什么需要service1.3service1.4service類型1.5service組件協同二、configMap原理2.1概述2.2命令2.3類型三、volume2.1emptydir2.2hostPath2.3pv/pvc2.4storageClass四、調度管理3.1概念3.2特點3.3親和性3.4容忍和污點3.5固定節點調度五、etc…

2025 數字化轉型期,值得關注的 10 項高價值證書解析

2025 年,數字化轉型已邁入深度滲透階段,大數據、人工智能、云計算等技術重塑各行業格局,相關領域人才缺口持續擴大。對于職場人突破瓶頸、大學生搶占就業先機而言,適配轉型需求的專業證書已成為核心競爭力。本文結合行業經驗&…

STM32 入門教程:從零基礎到項目實戰

STM32 微控制器憑借其高性能、低功耗、豐富外設以及龐大的生態系統,成為工程師和開發者的首選。對于剛接觸 STM32 的新手來說,面對復雜的芯片架構和開發流程,往往會感到無從下手。本文將以通俗易懂的語言,結合實際案例&#xff0c…

ros、slam、激光雷達、自動駕駛相關學習內容和計劃

明白 ?。你現在做的是 LHD自動駕駛,核心技術是 SLAM、LiDAR、ROS、感知與規劃控制。這類項目涉及“工程落地 學術算法 安全規范”三大方面。我給你一個循序漸進的學習方案(從基礎到應用),并附帶開源項目推薦,方便你…

Flutter 完全組件化的項目結構設計實踐

Flutter 完全組件化的項目結構設計實踐 在做 Flutter 項目的時候,隨著業務不斷擴展,如果所有代碼都堆在 lib/ 目錄里,后期維護會越來越痛苦。組件化(Componentization) 是一種常見的解決方案,它能讓項目更清…

文件上傳漏洞基礎及挖掘流程

基礎介紹定義用戶通過文件上傳的功能模塊進行文件上傳時,如果服務端沒有對上傳文件進行嚴格的驗 證和過濾,而導致的用戶可以越過其本身權限向服務器上上傳可執行的動態腳本文件。則 攻擊者可以通過上傳木馬,webshell等惡意文件,經…

【C2000】C2000的硬件設計指導與幾點意見

《C2000 MCU硬件設計指南》 提示:《C2000 MCU硬件設計指南》用于指導C2000 MCU應用中的原理圖設計與注意事項 文章目錄 《C2000 MCU硬件設計指南》 前言 1.器件選型與封裝決策 2.電源設計與去耦策略 3.時鐘與復位電路設計 4.PCB布局與接地策略 5.EMI/EMC與ESD防護 [F2800x C20…

屏隨人動+視覺魔方+多樣主題+智能留言,涂鴉Wukong AI 2.0助力打造爆款帶屏云臺相機

一、帶屏云臺機:超硬核的市場魔力 作為 IPC 消費級別里的第一大品類,云臺機市場一直處于穩步增長階段,2024 年全球出貨量達到 7000 萬臺。而其中的最強潛力股–帶屏云臺機,在 AI 大模型的強勢賦能下,更于今年迎來全新…

Polkadot - ELVES

ELVES (Endorsing Light Validity Evaluator System) 即 輕量級背書有效性評估系統 。它是 JAM 可擴展且自適應的區塊審計協議,即是JAM用于finalise區塊的協議, 確保只有有效區塊才能最終確定。 論文 – 2024-961 : Jeff Burdges、Cevallos 等人在2024年提出的 ELV…

【科研寫作自動化工具】如何??用AI技術組合(大模型+多Agent+自動化)打造一個“智能論文生產線”??,把寫作流程變成自動化

自主構建智慧科研寫作系統——融合LLM語義理解、多智能體任務協同與n8n自動化工作流n8n 是一款開源的 ??工作流自動化工具??,類似于 Zapier 或 Make(原 Integromat),但更注重靈活性和開發者友好性。在課程文件中提到的 ??n8…

window顯示驅動開發—監視器類函數驅動程序

設備節點用于表示已連接到一臺監視器的顯示適配器上的每個視頻輸出。 設備節點是顯示適配器設備節點的子節點。通常情況下,設備堆棧中只有兩個設備對象代表一對視頻輸出/監視器:物理設備對象 (PDO)。功能設備對象 (FDO)。在某些情況下,篩選器…

STM32CubeMX + HAL 庫:基于 I2C 通信的 AHT20 高精度溫濕度測量實驗

1 概述1.1 實驗目的本實驗基于 STM32CubeMX 與 HAL 庫,借助硬件 IC 接口實現對 AHT20 高精度溫濕度傳感器的測量與數據處理。實驗內容涵蓋 AHT20 的初始化流程、指令交互機制、測量數據的采集與物理量轉換等關鍵環節。通過對實驗驅動代碼與測試結果的完整展示&#…

今日分享:C++ -- vector

😎【博客主頁:你最愛的小傻瓜】😎 🤔【本文內容:C vector 😍 】🤔 --------------------------------------------------------------------------------------------------------------------…

NAS Docker 安裝N8N

NAS Docker 安裝N8Ndocker 操作中文版使用 Docker Compose(更易于管理)創建一個 docker-compose.yml 文件,內容如下:yaml version: 3services:n8n:image: n8nio/n8n:latestcontainer_name: n8nrestart: unless-stoppedports:- &q…

Node.js漢字轉拼音指南:pinyin-pro全解析

pinyin-pro 工具庫簡介核心功能:漢字轉拼音、多音字處理、音調控制、格式定制等性能特點:高效、輕量級、支持多種拼音風格應用場景:搜索優化、數據排序、中文輸入法等環境準備與安裝Node.js npm 或 yarn 安裝 pinyin-pronpm install pinyin-p…

UART-TCP雙向橋接服務

UART-TCP雙向橋接服務是一種將串口(UART)通信與TCP/IP網絡通信相互轉換的技術服務,其核心功能是實現兩種不同協議之間的數據透明傳輸。1. 基本概念UART(串口):硬件設備的傳統通信接口,常見于嵌入…