springboot项目部署到K8S

在这里插入图片描述

java后台
创建harbor镜像拉取Secret:kubectl create secret docker-registry harbor-regcred \--docker-server= \ #harbor仓库地址--docker-username= \  #harbor 账号--docker-password= \ #harbor密码-n productionDockerfile
FROM *harbor地址*/library/custom-jdk:1.8.0-alpineLABEL maintainer="Winter Lee"# 设置时区并安装字体包
RUN apk add --no-cache tzdata fontconfig ttf-dejavu && \cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && \echo "Asia/Shanghai" > /etc/timezone# 创建目录
RUN mkdir -p \/home/backend/jar_28888 \/home/backend/etc \/home/logs \/home/app/logs && \# 修改目录权限chmod -R 777 /home/appWORKDIR /home# 使用 ARG 定义动态路径
ARG JAR_PATH
COPY ${JAR_PATH} /home/backend/jar_28888/admin.jarVOLUME /app/logs
EXPOSE 28888# 添加无头模式参数并优化JVM参数
ENTRYPOINT ["java", \"-Djava.awt.headless=true", \"-Xms512m", \"-Xmx2048m", \"-DLOG_PATH=/app/logs", \"-jar", \"/jono/backend/jar_28888/admin.jar"]JEKINS构建镜像推送到harbor私服pipeline {agent anyparameters {gitParameter(name: 'TAG_NAME',type: 'PT_TAG',description: '选择要构建的 Git 标签',branch: 'test',tagFilter: '*',sortMode: 'DESCENDING',defaultValue: '')}environment {HARBOR_REG   = "harbor地址"PROJECT_NAME = "项目名称"IMAGE_NAME   = "镜像名称"// 使用Harbor凭证(需先在Jenkins创建)HARBOR_CRED = credentials('de3f0156-4c04-445d-9621-2f966ba40f28')}stages {stage('Checkout Code') {steps {checkout([$class: 'GitSCM',branches: [[name: "refs/tags/${params.TAG_NAME}"]],extensions: [[$class: 'CloneOption', depth: 0, shallow: false]],userRemoteConfigs: [[url: '代码仓库地址',credentialsId: '代码仓库凭证',refspec: '+refs/heads/*:refs/remotes/origin/* +refs/tags/*:refs/tags/*']]])}}stage('Maven Build') {steps {dir('.') {timeout(time: 15, unit: 'MINUTES') {sh 'mvn clean package -P sit'}sh 'ls -l target/admin.jar'}}}// 新增:准备镜像标签stage('Prepare Image Tag') {steps {script {// 清理标签名(替换非法字符为横杠,转小写)env.IMAGE_TAG = params.TAG_NAME.replaceAll(/[^a-zA-Z0-9\\.-]/, '-').toLowerCase()echo "使用镜像标签: ${env.IMAGE_TAG}"}}}stage('Docker Build') {steps {script {// 安全登录Harborsh "echo ${HARBOR_CRED_PSW} | docker login -u ${HARBOR_CRED_USR} --password-stdin ${HARBOR_REG}"// 使用Git标签名作为镜像标签sh """docker build \\--build-arg JAR_PATH=target/admin.jar \\-t ${HARBOR_REG}/${PROJECT_NAME}/${IMAGE_NAME}:${env.IMAGE_TAG} \\-f env/sit/Dockerfile \\."""}}}stage('Push to Harbor') {steps {script {// 推送指定标签的镜像sh "docker push ${HARBOR_REG}/${PROJECT_NAME}/${IMAGE_NAME}:${env.IMAGE_TAG}"}}}}post {always {script {// 清理本地镜像sh "docker rmi ${HARBOR_REG}/${PROJECT_NAME}/${IMAGE_NAME}:${env.IMAGE_TAG} || true"sh "docker logout ${HARBOR_REG}"}cleanWs()}}
}K8s部署 yaml文件## admin-deployment.yaml 
apiVersion: apps/v1
kind: Deployment
metadata:name: admin-productionnamespace: production  # 建议使用独立命名空间labels:app: adminenv: production
spec:replicas: 2revisionHistoryLimit: 5 #进行滚动更新后,保留的历史版本数strategy:type: RollingUpdaterollingUpdate:maxSurge: 25%       # 最大激增Pod数maxUnavailable: 25% # 最大不可用Pod数selector:matchLabels:app: adminenv: productiontemplate:metadata:labels:app: adminenv: productionspec:securityContext:    # 安全上下文runAsUser: 1000runAsGroup: 3000fsGroup: 2000containers:- name: adminimage: *代码仓库地址/项目名称*/admin:44-sit-202505231400ports:- containerPort: 28888volumeMounts:- name: etc-volumemountPath: /home/backend/etcreadOnly: true  # 根据实际需求设置读写权限resources:        # 资源限制(根据实际需求调整)limits:cpu: "1"memory: 1Girequests:cpu: "0.5"memory: 512MilivenessProbe:    # 存活探针httpGet:path: /admin/captchaImageport: 28888initialDelaySeconds: 30periodSeconds: 10readinessProbe:   # 就绪探针httpGet:path: /admin/captchaImageport: 28888initialDelaySeconds: 20periodSeconds: 5volumes:- name: etc-volumehostPath:path: /tmp/etctype: DirectoryOrCreateimagePullSecrets:   # 镜像拉取凭证(需提前创建)- name: harbor-regcredaffinity:           # 调度策略podAntiAffinity:preferredDuringSchedulingIgnoredDuringExecution:- weight: 100podAffinityTerm:labelSelector:matchExpressions:- key: appoperator: Invalues: ["admin"]topologyKey: kubernetes.io/hostname
## admin-service.yaml 
apiVersion: v1
kind: Service
metadata:name: admin-servicenamespace: production
spec:type: NodePort         # 根据实际网络架构选择selector:app: adminenv: productionports:- protocol: TCPport: 28888targetPort: 28888nodePort: 31000滚动更新: 
只有修改了 deployment 配置文件中的 template 中的属性后,才会触发更新操作修改 nginx 版本号
kubectl set image deployment/nginx-deployment nginx=nginx:1.9.1kubectl set image deployment/admin-production *harbor地址*/*项目名称*/admin=44-sit-202505231400或者通过 kubectl edit deployment/nginx-deployment 进行修改查看滚动更新的过程
kubectl rollout status deploy <deployment_name>查看部署描述,最后展示发生的事件列表也可以看到滚动更新过程
kubectl describe deploy <deployment_name>通过 kubectl get deployments 获取部署信息,UP-TO-DATE 表示已经有多少副本达到了配置中要求的数目通过 kubectl get rs 可以看到增加了一个新的 rs通过 kubectl get pods 可以看到所有 pod 关联的 rs 变成了新的回滚:
有时候你可能想回退一个Deployment,例如,当Deployment不稳定时,比如一直crash looping。默认情况下,kubernetes会在系统中保存前两次的Deployment的rollout历史记录,以便你可以随时会退(你可以修改revision history limit来更改保存的revision数)。案例:
更新 deployment 时参数不小心写错,如 nginx:1.9.1 写成了 nginx:1.91
kubectl set image deployment/nginx-deploy nginx=nginx:1.91监控滚动升级状态,由于镜像名称错误,下载镜像失败,因此更新过程会卡住
kubectl rollout status deployments nginx-deploy结束监听后,获取 rs 信息,我们可以看到新增的 rs 副本数是 2 个
kubectl get rs通过 kubectl get pods 获取 pods 信息,我们可以看到关联到新的 rs 的 pod,状态处于 ImagePullBackOff 状态为了修复这个问题,我们需要找到需要回退的 revision 进行回退
通过 kubectl rollout history deployment/nginx-deploy 可以获取 revison 的列表通过 kubectl rollout history deployment/nginx-deploy --revision=2 可以查看详细信息确认要回退的版本后,可以通过 kubectl rollout undo deployment/nginx-deploy 可以回退到上一个版本也可以回退到指定的 revision
kubectl rollout undo deployment/nginx-deploy --to-revision=2再次通过 kubectl get deployment 和 kubectl describe deployment 可以看到,我们的版本已经回退到对应的 revison 上了可以通过设置 .spec.revisonHistoryLimit 来指定 deployment 保留多少 revison,如果设置为 0,则不允许 deployment 回退了。发布新版本操作流程
1. 修改 YAML 文件
yaml
# deployment.yaml 示例片段
spec:template:spec:containers:- name: your-appimage: local.harbor.com/sw/sw-web:NEW_TAG  # 修改为新镜像标签ports:- containerPort: 8088
2. 应用新配置
bash
# 使用 kubectl apply 更新部署
kubectl apply -f deployment.yaml -n your-namespace# 观察滚动更新进度(实时查看Pod重建过程)
kubectl rollout status deployment/your-deployment -n your-namespace
3. 验证新版本
bash
# 查看当前Pod状态
kubectl get pods -n your-namespace -l app=your-app-label# 检查新版本日志
kubectl logs -f <new-pod-name> -n your-namespace# 执行健康检查(替换为你的健康检查路径)
kubectl exec <new-pod-name> -n your-namespace -- curl -I http://localhost:8088/web/
二、回滚操作流程
方法一:使用 Kubernetes 内置回滚(推荐)
bash
# 1. 查看部署历史版本
kubectl rollout history deployment/your-deployment -n your-namespace# 输出示例
REVISION  CHANGE-CAUSE
1         Initial deployment
2         Update image to v1.2.3
3         Update image to v1.2.4  <--- 当前问题版本# 2. 回滚到指定版本
kubectl rollout undo deployment/your-deployment --to-revision=2 -n your-namespace# 3. 验证回滚状态
kubectl rollout status deployment/your-deployment -n your-namespace
方法二:通过旧版 YAML 文件回滚
bash
# 1. 检出旧版本YAML文件(假设使用Git管理)
git checkout v1.2.3 -- deployment.yaml# 2. 应用旧配置
kubectl apply -f deployment.yaml -n your-namespace --force# 3. 确认回滚完成
kubectl get pods -n your-namespace -l app=your-app-label
三、最佳实践建议
1. 版本追踪策略
bash
# 每次修改YAML文件后提交Git(带版本标签)
git add deployment.yaml
git commit -m "Update to v1.2.4"
git tag v1.2.4
git push origin master --tags
2. 增强部署可靠性
yaml
# 在YAML中添加健康检查
livenessProbe:httpGet:path: /healthzport: 8088initialDelaySeconds: 15periodSeconds: 20readinessProbe:httpGet:path: /readyport: 8088initialDelaySeconds: 5periodSeconds: 10
3. 自动记录变更原因
bash
# 使用 kubectl 注解记录变更信息
kubectl annotate deployment/your-deployment \kubernetes.io/change-cause="Update to v1.2.4 for feature X" \-n your-namespace --overwrite
4. 多环境验证流程
bash
# 先发布到测试环境
kubectl apply -f deployment.yaml -n test-env# 运行自动化测试
curl -X POST http://your-ci-server/run-tests# 测试通过后发布生产
kubectl apply -f deployment.yaml -n prod-env
四、常见问题排查
1. 如果回滚失败
bash
# 查看部署详细状态
kubectl describe deployment/your-deployment -n your-namespace# 检查事件日志
kubectl get events -n your-namespace --sort-by=.metadata.creationTimestamp
2. 保留历史版本数量控制
yaml
# 在YAML中配置 revisionHistoryLimit
spec:revisionHistoryLimit: 5  # 保留最近5个版本更新版本的时候可以添加 --record记录操作内容
[root@k8s-master ~]#  kubectl set image deployment/web-production -n production web=web:v20250523_1.0.0 --record
Flag --record has been deprecated, --record will be removed in the future
deployment.apps/web-production image updated
[root@k8s-master ~]# kubectl rollout history deployment/web-production -n production
deployment.apps/web-production 
REVISION  CHANGE-CAUSE
1         <none>
2         kubectl set image deployment/web-production web=web:v20250523_1.0.0 --namespace=production --record=true查看对应revision的更新内容
kubectl rollout history deployment/web-production -n production --revision=2
deployment.apps/web-production with revision #2
Pod Template:Labels:       app=webenv=productionpod-template-hash=764cdbc6c4Annotations:  kubernetes.io/change-cause: kubectl set image deployment/web-production web=web:v20250523_1.0.0 --namespace=production --record=trueContainers:web:Image:      web:v20250523_1.0.0Port:       8088/TCPHost Port:  0/TCPLimits:cpu:      200mmemory:   1GiRequests:cpu:      100mmemory:   512MiEnvironment:        <none>Mounts:     <none>Volumes:      <none>版本回退操作 
回退到revision 为1的版本
[root@k8s-master ~]# kubectl rollout undo deployment/web-production -n production --to-revision=1
deployment.apps/web-production rolled back
[root@k8s-master ~]# kubectl rollout history deployment/web-production -n production
deployment.apps/web-production 
REVISION  CHANGE-CAUSE
2         kubectl set image deployment/web-production web=web:v20250523_1.0.0 --namespace=production --record=true
3         <none>
查看回滚进度
kubectl rollout status deployment/web-production -n production扩容缩容
kubectl scale --replicas=5 deployment web-production -n production  通过修改replicas的值完成扩容和缩容 暂停和恢复
kubectl rollout pause deploy web-production -n production
kubectl rollout resume deploy web-production -n production

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/pingmian/89365.shtml
繁体地址,请注明出处:http://hk.pswp.cn/pingmian/89365.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【FPGA开发】一文轻松入门Modelsim的基本操作

Modelsim仿真的步骤 &#xff08;1&#xff09;创建新的工程。 &#xff08;2&#xff09;在弹出的窗口中&#xff0c;确定项目名和工作路径&#xff0c;库保持为work不变(如有需要可以根据需求进行更改)。 &#xff08;3&#xff09;添加已经存在的文件&#xff08;rtl代码和t…

服务攻防-Java组件安全FastJson高版本JNDI不出网C3P0编码绕WAF写入文件CI链

服务攻防-Java组件安全&FastJson&高版本JNDI&不出网C3P0&编码绕WAF&写入文件CI链26天 原创 朝阳 Sec朝阳 2025年07月18日 09:23 湖北 标题已修改 演示环境&#xff1a; https://github.com/lemono0/FastJsonParty FastJson全版本Docker漏洞环境(涵盖1.…

【Python】DRF核心组件详解:Mixin与Generic视图

在 Django REST Framework (DRF) 中&#xff0c;mixins.CreateModelMixin、mixins.ListModelMixin、GenericAPIView 和 GenericViewSet 是构建 API 视图的核心组件。以下是对这些组件的主要方法及其职责的简要说明&#xff0c;内容清晰且结构化&#xff1a;1. mixins.CreateMod…

HTML+CSS+JS基础

文章目录&#xff08;一&#xff09;html1.常见标签&#xff08;1&#xff09;注释&#xff08;2&#xff09;标题 h1~h6&#xff08;3&#xff09;段落 p&#xff08;4&#xff09;换行与空格 br \ &#xff08;5&#xff09;格式化标签 b i s u&#xff08;6&#xff09;…

Vue导出Html为Word中包含图片在Microsoft Word显示异常问题

问题背景 碰到一个问题&#xff1a;将包含图片和SVG数学公式的HTML内容导出为Word文档时&#xff0c;将图片都转为ase64格式导出&#xff0c;在WPS Word中显示正常&#xff0c;但是在Microsoft Word中出现图片示异常。具体问题表现 WPS兼容性&#xff1a;在WPS中显示正常&#…

椭圆曲线密码学 Elliptic Curve Cryptography

密码学是研究在存在对抗行为的情况下还能安全通信的技术。即算法加密信息&#xff0c;再算法解密出信息。加密分为两类 1. Symmetric-key Encryption (secret key encryption) 即一种密钥&#xff0c;加密和解密使用同一密钥&#xff0c;可相互转换 2. Asymmetric-key Encry…

wedo牛-----第47节(免费分享图纸)

夸克网盘&#xff1a;https://pan.quark.cn/s/4b40a8d18979 高清图纸源文件&#xff0c;需要的请自取

Unity | AmplifyShaderEditor插件基础(第十集:噪声的种类+火焰制作-下)

目录 一、&#x1f44b;&#x1f3fb;前言 二、圆火焰 三、制作梯度 梯度成品预览 1.GradientSample节点 2.gradient的用法 3.time节点 四、添加颜色 Color节点 五、火焰摇摆 1.X方向的移动 2.Y方向的移动 3.Z方向的移动 4.把xyz组合起来 Panner节点 六、摆放和…

黑马Node.js全套入门教程,nodejs新教程含es6模块化+npm+express+webpack+promise等_ts对象笔记

1.1 什么是运行环境&#xff1f; 运行环境是指代码正常运行所需的必要环境&#xff01;&#xff01;&#xff01;&#xff01;&#xff01; V8引擎负责解析和执行JavaScript代码。内置API是由运行环境提供的特殊接口&#xff0c;只能在所属的运行环境中被调用 1.2 JavaScrip…

React 项目环境变量使用指南

在 React 项目中正确使用环境变量是管理不同环境配置的关键技术。以下是完整的解决方案&#xff1a; 1. 创建环境变量文件 React 项目支持以下环境变量文件&#xff08;按优先级从高到低&#xff09;&#xff1a; .env.development.local (本地开发环境).env.development (开发…

Oracle 关于一些连接故障的总结

积累了几次Oracle客户端连接故障&#xff0c;做下总结。 文章目录1、案例案例1&#xff1a;客户端连接报错ORA-12514案例2&#xff1a;客户端连接报错ORA-28547案例3&#xff1a;客户端连接报错&#xff1a;Got minus one from a read call案例4&#xff1a;客户端连接报错&…

V-USB USB设备模拟原理分析

V-USB USB设备模拟原理分析 通过分析V-USB项目的核心文件&#xff0c;详细解释这个项目是如何在AVR微控制器上模拟USB设备的&#xff1a; 1. 整体架构 V-USB是一个纯软件实现的USB低速设备驱动&#xff0c;主要由以下几个核心文件组成&#xff1a; usbdrv.c : USB协议栈的C语言…

kafka3.6下载安装(传统架构/KRaft模式)+实例测试

知识补充&#xff1a; Kafka 和 ZooKeeper 的关系可以用 “协作依赖” 来概括。在 Kafka 的早期版本&#xff08;Kafka 2.8.0 之前&#xff09;中&#xff0c;ZooKeeper 是 Kafka 的核心依赖&#xff0c;用于管理集群元数据、协调 Broker 和 Controller 选举等关键功能。但从 …

华控智能产品特点——产品生态全景与场景化创新

公司构建 “3X”产品战略&#xff0c;以三大核心场景为基础持续拓展技术外延&#xff1a; 1. 智能安防产品线军工级指纹枪盒&#xff1a;采用6061-T6航空铝材&#xff0c;内嵌震动报警模块&#xff0c;非法开箱触发90dB警鸣。为军工企业定制的双人认证版本需两位授权人员同时验…

爬虫核心原理与入门技巧分析

一、爬虫核心原理&#xff1a;模拟人类浏览的“自动化工具” 简单来说&#xff0c;网络爬虫&#xff08;Web Crawler&#xff09;是一种按照一定规则&#xff0c;自动抓取互联网信息的程序或脚本。其核心原理可以类比人类浏览网页的过程&#xff0c;只不过将手动操作转化为了代…

spring-cloud微服务部署-feign服务间调用

1 准备工作 需要安装并启动nacos&#xff0c;作为服务注册中心。地址&#xff1a;https://nacos.io/ 2 项目结构 parent的pom.xml声明依赖&#xff1a; <dependencyManagement><dependencies><dependency><groupId>org.springframework.boot</gr…

IDEA高效开发:Database Navigator插件安装与核心使用指南

目录 1.前言 2.正文 2.1安装流程 2.1.1IDE内部安装 2.1.2手动下载安装 ⚠️ 避坑指南 2.2使用教程 2.2.1连接数据库 2.2.2查看数据库/表 2.2.3查询数据 2.2.4修改表结构 2.2.5生成代码 2.2.6常见故障排除 3.小结 1.前言 “作为Java开发者&#xff0c;日常与数据…

Maven私服仓库,发布jar到私服仓库,依赖的版本号如何设置,规范是什么

Maven私服仓库&#xff0c;发布jar到私服仓库&#xff0c;依赖的版本号如何设置&#xff0c;规范是什么

量子卷积神经网络:量子计算与深度学习的融合革命

引言&#xff1a;当卷积神经网络遇上量子计算在人工智能与量子计算双重浪潮的交汇处&#xff0c;量子卷积神经网络&#xff08;Quantum Convolutional Neural Network, QCNN&#xff09;正成为突破经典算力瓶颈的关键技术。传统卷积神经网络&#xff08;CNN&#xff09;在图像识…

线程(三) linux 同步

目录 概念补充 条件变量 操作 例:多线程抢票 封装 生产者消费者模型 生产者和消费者之间的关系 BlockQueue(阻塞队列) 单生产单消费 信号量 简介 操作 多生产者多消费者RingQueue(环形队列)代码 sem封装 信号量与锁 小知识 概念补充 同步:在保证数据安全的前…