设计思路

通过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; 二、需求: 多组件共享数据创建三个组…