当前位置: 首页 > article >正文

RuoYi前后端分离项目在K8s中的高可用部署实践(附避坑指南)

RuoYi前后端分离项目在Kubernetes中的高可用部署实战当企业级应用需要从单体架构向云原生转型时Kubernetes无疑是最佳选择之一。本文将深入探讨如何在生产环境中实现RuoYi这一流行开源框架的高可用部署涵盖从集群规划到故障恢复的全流程实战经验。1. 环境规划与集群搭建1.1 基础设施准备一个典型的Kubernetes生产环境需要至少三个节点组成控制平面两个工作节点作为计算资源池。以下是推荐的硬件配置节点类型CPU核心数内存容量存储空间网络要求控制平面节点4核8GB100GB1Gbps稳定内网工作节点8核16GB200GB1Gbps高速内网关键配置步骤# 所有节点执行内核参数调整 cat EOF | sudo tee /etc/modules-load.d/k8s.conf overlay br_netfilter EOF modprobe overlay modprobe br_netfilter # 网络参数优化 cat EOF | sudo tee /etc/sysctl.d/k8s.conf net.bridge.bridge-nf-call-iptables 1 net.ipv4.ip_forward 1 net.bridge.bridge-nf-call-ip6tables 1 EOF sysctl --system提示生产环境务必关闭swap分区避免kubelet运行异常1.2 容器运行时配置Containerd作为推荐的容器运行时需要特别优化其配置[plugins.io.containerd.grpc.v1.cri.containerd] snapshotter overlayfs default_runtime_name runc [plugins.io.containerd.grpc.v1.cri.containerd.runtimes.runc] runtime_type io.containerd.runc.v2 [plugins.io.containerd.grpc.v1.cri.containerd.runtimes.runc.options] SystemdCgroup true2. 私有镜像仓库建设2.1 Harbor企业级部署相比简单的Docker RegistryHarbor提供了更完善的企业级功能# 下载Harbor离线安装包 wget https://github.com/goharbor/harbor/releases/download/v2.8.2/harbor-offline-installer-v2.8.2.tgz tar xvf harbor-offline-installer-v2.8.2.tgz cd harbor # 修改harbor.yml配置 hostname: registry.yourdomain.com https: port: 443 certificate: /etc/ssl/certs/yourdomain.crt private_key: /etc/ssl/private/yourdomain.key harbor_admin_password: YourStrongPassword # 执行安装 ./install.sh2.2 跨集群镜像同步在多集群环境下可以通过Harbor的复制功能实现镜像同步在Harbor管理界面创建复制规则选择源项目与目标项目配置触发模式手动/事件驱动设置过滤器按标签/名称3. RuoYi应用容器化改造3.1 后端服务优化Java应用的Dockerfile需要特别关注JVM参数优化FROM eclipse-temurin:17-jdk-jammy ENV JAVA_OPTS-XX:UseG1GC \ -XX:MaxRAMPercentage75.0 \ -XX:HeapDumpOnOutOfMemoryError \ -Dfile.encodingUTF-8 COPY target/ruoyi-admin.jar /app/ WORKDIR /app ENTRYPOINT [sh, -c, exec java ${JAVA_OPTS} -jar ruoyi-admin.jar]3.2 前端静态资源处理Nginx配置需要优化缓存策略server { listen 80; server_name ruoyi.example.com; location / { root /usr/share/nginx/html; try_files $uri $uri/ /index.html; # 静态资源缓存配置 location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg)$ { expires 365d; add_header Cache-Control public, no-transform; } } location /prod-api/ { proxy_pass http://ruoyi-backend-service:8080/; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; # 连接超时设置 proxy_connect_timeout 60s; proxy_read_timeout 600s; proxy_send_timeout 600s; } }4. Kubernetes资源编排策略4.1 有状态服务部署MySQL和Redis需要采用StatefulSet确保数据持久化apiVersion: apps/v1 kind: StatefulSet metadata: name: mysql spec: serviceName: mysql replicas: 1 selector: matchLabels: app: mysql template: metadata: labels: app: mysql spec: containers: - name: mysql image: mysql:8.0 env: - name: MYSQL_ROOT_PASSWORD value: yoursecurepassword ports: - containerPort: 3306 volumeMounts: - name: mysql-data mountPath: /var/lib/mysql volumeClaimTemplates: - metadata: name: mysql-data spec: accessModes: [ ReadWriteOnce ] storageClassName: ssd resources: requests: storage: 100Gi4.2 应用健康检查配置完善的探针配置是保障高可用的关键livenessProbe: httpGet: path: /actuator/health port: 8080 initialDelaySeconds: 60 periodSeconds: 10 timeoutSeconds: 5 failureThreshold: 3 readinessProbe: httpGet: path: /actuator/health port: 8080 initialDelaySeconds: 30 periodSeconds: 5 timeoutSeconds: 3 failureThreshold: 1 startupProbe: httpGet: path: /actuator/health port: 8080 failureThreshold: 30 periodSeconds: 105. 高可用与弹性扩展方案5.1 多副本与反亲和性确保服务实例分散在不同节点affinity: podAntiAffinity: requiredDuringSchedulingIgnoredDuringExecution: - labelSelector: matchExpressions: - key: app operator: In values: - ruoyi-backend topologyKey: kubernetes.io/hostname5.2 HPA自动扩缩容基于CPU和内存的自动扩展策略apiVersion: autoscaling/v2 kind: HorizontalPodAutoscaler metadata: name: ruoyi-backend-hpa spec: scaleTargetRef: apiVersion: apps/v1 kind: Deployment name: ruoyi-backend minReplicas: 2 maxReplicas: 10 metrics: - type: Resource resource: name: cpu target: type: Utilization averageUtilization: 70 - type: Resource resource: name: memory target: type: Utilization averageUtilization: 806. 网络与安全加固6.1 Ingress流量管理使用Nginx Ingress实现高级路由apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: ruoyi-ingress annotations: nginx.ingress.kubernetes.io/rewrite-target: / nginx.ingress.kubernetes.io/ssl-redirect: true spec: ingressClassName: nginx tls: - hosts: - ruoyi.example.com secretName: ruoyi-tls rules: - host: ruoyi.example.com http: paths: - path: / pathType: Prefix backend: service: name: ruoyi-frontend port: number: 80 - path: /prod-api pathType: Prefix backend: service: name: ruoyi-backend port: number: 80806.2 网络策略隔离限制不必要的Pod间通信apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: ruoyi-backend-policy spec: podSelector: matchLabels: app: ruoyi-backend policyTypes: - Ingress ingress: - from: - podSelector: matchLabels: app: ruoyi-frontend ports: - protocol: TCP port: 80807. 监控与日志方案7.1 Prometheus监控配置关键指标监控示例apiVersion: monitoring.coreos.com/v1 kind: ServiceMonitor metadata: name: ruoyi-monitor spec: selector: matchLabels: app: ruoyi-backend endpoints: - port: http path: /actuator/prometheus interval: 15s scrapeTimeout: 10s7.2 集中式日志收集Fluent Bit配置示例[INPUT] Name tail Path /var/log/containers/*ruoyi*.log Parser docker Tag ruoyi.* Mem_Buf_Limit 5MB Skip_Long_Lines On [OUTPUT] Name es Match * Host elasticsearch Port 9200 Logstash_Format On Replace_Dots On Retry_Limit False8. 常见问题排查指南8.1 镜像拉取失败处理当遇到镜像拉取问题时可按以下步骤排查检查节点到镜像仓库的网络连通性验证Secret配置是否正确查看containerd日志获取详细错误journalctl -u containerd -n 100 -f尝试手动拉取镜像测试crictl pull your-registry/ruoyi-backend:latest8.2 数据库连接问题数据库连接异常的典型排查流程验证Service DNS解析kubectl run -it --rm --imagealpine dns-test -- nslookup ruoyi-mysql-service检查网络策略是否允许流量测试从应用Pod直接连接数据库kubectl exec -it ruoyi-backend-pod -- telnet ruoyi-mysql-service 3306查看数据库日志确认认证问题在真实生产环境中部署RuoYi时我们发现初始化SQL脚本的执行顺序对系统启动至关重要。通过引入Init Container确保依赖服务就绪系统稳定性得到了显著提升。对于前端静态资源采用CDN加速后页面加载时间减少了60%以上。

相关文章:

RuoYi前后端分离项目在K8s中的高可用部署实践(附避坑指南)

RuoYi前后端分离项目在Kubernetes中的高可用部署实战 当企业级应用需要从单体架构向云原生转型时,Kubernetes无疑是最佳选择之一。本文将深入探讨如何在生产环境中实现RuoYi这一流行开源框架的高可用部署,涵盖从集群规划到故障恢复的全流程实战经验。 1.…...

PyTorch实战:解决MNIST数据集下载失败的两种高效方案

1. 为什么你的MNIST数据集总是下载失败? 每次用PyTorch跑手写数字识别项目,最让人头疼的就是MNIST数据集下载卡住不动。我刚开始学深度学习那会儿,这个问题至少浪费了我三个下午的时间。后来才发现,这其实是个经典的老问题——主要…...

NDK toolchains文件夹详解:为什么你的Android项目找不到arm-linux-androideabi工具链?

NDK工具链架构演进解析:从arm-linux-androideabi到现代ABI的迁移指南 当你在Android Studio中看到"No toolchains found in the NDK toolchains folder for ABI with prefix: arm-linux-androideabi"这个错误时,这实际上反映了Android NDK生态…...

canFestival实战(3)-----SDO高效收发技巧与性能优化

1. SDO报文收发基础与性能瓶颈分析 在嵌入式CanOpen通信中,SDO(Service Data Object)作为关键的服务数据通道,其性能直接影响设备间参数配置效率。许多开发者在初次使用canFestival时,常会遇到SDO响应延迟、通信超时等…...

小白友好教程:用PyTorch 2.8镜像轻松完成深度学习实验

小白友好教程:用PyTorch 2.8镜像轻松完成深度学习实验 1. 为什么选择PyTorch 2.8镜像? 深度学习实验常常因为环境配置问题而变得复杂。PyTorch 2.8镜像解决了这个痛点,它预装了完整的PyTorch环境和CUDA工具包,让你可以立即开始实…...

PowerDMIS调整CAD模型姿态

调整:CAD 调整是可以同时改变3D数模与 PCS 坐标在 MCS 坐标系下的位置与方向。如图可以设置 PCS 坐标系在MCS坐标系的位置方向,“CAD调整”设置后点击“默认”“应用”后就会应用每个导入的CAD数模。操作如下 改变 CAD 与工件坐标系在机械坐标系的方向步…...

GPT-6震撼来袭!OpenAI孤注一掷,能否击退Claude Code?

🔥 开门见山:这次不一样 内部代号 Spud(土豆) 的 GPT-6,**已于 3 月 24 日在德克萨斯 Stargate 数据中心完成预训练,**Greg Brockman 亲口承认它的存在——“这不是增量改进,是我们思考模型开发…...

PowerBuilder(PB)连接SQL数据库的实战指南与常见问题解析

1. PowerBuilder连接SQL数据库的基础准备 第一次用PowerBuilder连SQL数据库的朋友,可能会觉得有点懵。其实整个过程就像给手机装SIM卡——选对运营商(数据库类型)、插对卡槽(配置参数)、开机测试(连接验证&…...

3分钟搞定网易云音乐NCM文件转换:ncmdumpGUI零基础上手指南

3分钟搞定网易云音乐NCM文件转换:ncmdumpGUI零基础上手指南 【免费下载链接】ncmdumpGUI C#版本网易云音乐ncm文件格式转换,Windows图形界面版本 项目地址: https://gitcode.com/gh_mirrors/nc/ncmdumpGUI 你是否曾经遇到过这样的尴尬时刻&#…...

ggb嵌入web网站

目录 嵌入网页: 在同级目录执行; 嵌入网页: 新建页面 aa.html <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>GeoGebra 几何画板 - 交互式数学绘图工具</title><script src="https://cdn.geogebra…...

从零开始:在树莓派4B上开启KVM虚拟化的完整指南(基于ARM架构)

从零开始&#xff1a;在树莓派4B上开启KVM虚拟化的完整指南&#xff08;基于ARM架构&#xff09; 树莓派4B作为一款性价比极高的ARM开发板&#xff0c;其四核Cortex-A72处理器和最高8GB内存的配置&#xff0c;已经能够胜任许多轻量级虚拟化任务。不同于传统x86平台的虚拟化方案…...

FGO-py:智能自动化助手如何彻底改变你的游戏体验

FGO-py&#xff1a;智能自动化助手如何彻底改变你的游戏体验 【免费下载链接】FGO-py 自动爬塔! 自动每周任务! 全自动免配置跨平台的Fate/Grand Order助手.启动脚本,上床睡觉,养肝护发,满加成圣诞了解一下? 项目地址: https://gitcode.com/GitHub_Trending/fg/FGO-py …...

西门子S1500新能源pack线程序(含注释版)- 博图V16梯形图FB应用

西门子PLC S1500新能源pack线程序&#xff08;含触摸屏程序&#xff09; 此项目程序已经实际设备成熟稳定应用&#xff0c;程序都有注释、非常适合用来西门子S1500大型项目学习&#xff0c;包括plc程序和西门子触摸屏程序。 程序运用梯形图FB&#xff0c;本程序用博图V16打开。…...

**Jetpack Compose 中的声明式UI 设计:从传统 XML 到函数式编程的跃迁

Jetpack Compose 中的声明式 U设计&#xff1a;i 从传统 XML 到函数式编程的跃迁 在 Android 开发领域&#xff0c;UI 构建方式正在经历一场由“命令式”向“声明式”的革命。Jetpack Compose 正是这场变革的核心引擎——它不仅重塑了界面开发体验&#xff0c;更通过 Kotlin 的…...

如何快速配置复古翻页时钟:Windows用户的完整指南

如何快速配置复古翻页时钟&#xff1a;Windows用户的完整指南 【免费下载链接】FlipIt Flip Clock screensaver 项目地址: https://gitcode.com/gh_mirrors/fl/FlipIt FlipIt翻页时钟屏保是一款专为Windows系统设计的开源屏幕保护程序&#xff0c;完美复刻经典机械翻页时…...

从厨房小白到AI大模型高手:小白也能轻松掌握的AI学习指南(收藏版)

本文旨在打破对AI大模型的刻板印象&#xff0c;用通俗易懂的语言解释AI大模型的工作原理&#xff0c;并将其比喻为烹饪过程&#xff0c;让读者感到亲切。文章从理解AI的本质入手&#xff0c;逐步引导读者学习如何与AI有效沟通&#xff08;提示词工程&#xff09;、为AI添加知识…...

FGO-py:跨平台全自动FGO助手,彻底解放你的双手

FGO-py&#xff1a;跨平台全自动FGO助手&#xff0c;彻底解放你的双手 【免费下载链接】FGO-py 自动爬塔! 自动每周任务! 全自动免配置跨平台的Fate/Grand Order助手.启动脚本,上床睡觉,养肝护发,满加成圣诞了解一下? 项目地址: https://gitcode.com/GitHub_Trending/fg/FGO…...

如何高效使用LaserGRBL:7大专业技巧完整指南

如何高效使用LaserGRBL&#xff1a;7大专业技巧完整指南 【免费下载链接】LaserGRBL Laser optimized GUI for GRBL 项目地址: https://gitcode.com/gh_mirrors/la/LaserGRBL LaserGRBL是一款专为GRBL控制器优化的激光雕刻软件&#xff0c;通过直观的图形界面让用户轻松…...

Claude Code在哪找教程?2026最全学习渠道盘点:官方/社区/国内平台一次找齐

Claude Code凭借长上下文、终端原生、全链路开发能力&#xff0c;成为2026年AI编程工具的热门选择&#xff0c;但很多国内开发者上手时都会遇到同一个问题&#xff1a;教程在哪找&#xff1f;官方文档看不懂、社区内容太零散、国内适配教程找不到。作为长期使用Claude Code的开…...

CS231n实战解析:从零构建全连接网络与优化器调优

1. 全连接网络基础与CS231n作业解析 第一次接触全连接网络时&#xff0c;我被它的"全连接"特性震撼到了——每个神经元都与前一层的所有神经元相连&#xff0c;就像一张密不透风的网。在CS231n作业中构建FullyConnectedNet时&#xff0c;这种密集连接既带来了强大的表…...

正则表达式实战指南:从基础语法到高级应用

1. 正则表达式基础语法入门 第一次接触正则表达式时&#xff0c;我完全被那些奇怪的符号搞懵了。直到有次需要从上千条日志中提取IP地址&#xff0c;手动处理差点让我崩溃&#xff0c;这才硬着头皮学了正则。现在回想起来&#xff0c;掌握基础语法就像学骑自行车&#xff0c;开…...

Flask调试模式翻车实录:一个变量引发的PIN码RCE与完整利用链分析

Flask调试模式安全风险深度剖析&#xff1a;从变量泄露到系统沦陷的防御指南 当你在深夜赶工一个Flask项目时&#xff0c;一个看似无害的变量未定义错误突然出现在生产环境——这可能是噩梦的开始。去年某电商平台就因类似问题导致用户数据泄露&#xff0c;而根本原因仅仅是开发…...

XPINN:高维复杂几何域分解的物理信息神经网络新范式

1. 物理信息神经网络的进化之路 第一次听说物理信息神经网络&#xff08;PINN&#xff09;是在2017年的一次学术会议上&#xff0c;当时就被它结合深度学习与物理方程的思路惊艳到了。简单来说&#xff0c;PINN就像是个"懂物理的AI"&#xff0c;它不仅能学习数据规律…...

告别笨重电感!用这颗TI电荷泵芯片给运放轻松生成负电源(附完整电路)

用TI电荷泵芯片为运放构建高效负电源的实战指南 在嵌入式系统和精密测量电路中&#xff0c;运算放大器常常需要双电源供电才能发挥最佳性能。然而传统基于电感的负压生成方案不仅占用宝贵PCB空间&#xff0c;还会引入电磁干扰问题。德州仪器&#xff08;TI&#xff09;的TPS60…...

SAM2‑UNeXT vs 传统分割模型:5个真实场景下的性能对比测试

SAM2‑UNeXT vs 传统分割模型&#xff1a;5个真实场景下的性能对比测试 在计算机视觉领域&#xff0c;图像分割技术正经历着从专用模型到通用基础模型的范式转变。传统分割模型如U-Net、DeepLab等虽然在特定任务上表现优异&#xff0c;但面对多样化的应用场景时往往需要大量定制…...

【Linux命令饲养指南】04-Linux系统资源命令:看看你的服务器是“肾虚”还是“猛男”

兄弟们&#xff0c;前面三篇我们学会了在Linux里走路、翻箱倒柜、改文件。今天咱们玩点高级的——给你的服务器做个全身体检。内存剩多少&#xff1f;CPU是几核&#xff1f;哪个进程在偷吃&#xff1f;哪个端口被占用了&#xff1f;学完这篇&#xff0c;你就能像个老中医一样&a…...

Speechless:3步快速备份微博到PDF的终极Chrome扩展指南

Speechless&#xff1a;3步快速备份微博到PDF的终极Chrome扩展指南 【免费下载链接】Speechless 把新浪微博的内容&#xff0c;导出成 PDF 文件进行备份的 Chrome Extension。 项目地址: https://gitcode.com/gh_mirrors/sp/Speechless 你是否曾担心重要的微博内容突然消…...

Claude Code 怎么配置自定义 API 地址?2026 最完整的 3 种方案实测

上周五晚上&#xff0c;我正用 Claude Code 重构一个老项目的后端接口&#xff0c;写到一半突然开始疯狂报 401 Unauthorized。一看账户余额——没了。充值页面又打不开&#xff0c;卡在支付环节转圈圈。当时项目第二天要交&#xff0c;我差点原地爆炸。 折腾到凌晨两点&#…...

如何用Umi-CUT批量去除图片黑边?3分钟掌握高效图片处理技巧

如何用Umi-CUT批量去除图片黑边&#xff1f;3分钟掌握高效图片处理技巧 【免费下载链接】Umi-CUT 项目地址: https://gitcode.com/gh_mirrors/um/Umi-CUT 你是否曾为处理大量图片的黑边而烦恼&#xff1f;Umi-CUT是一款专为批量图片处理设计的开源工具&#xff0c;它能…...

实测Qwen3-TTS:上传10秒音频,AI帮你生成专属配音

实测Qwen3-TTS&#xff1a;上传10秒音频&#xff0c;AI帮你生成专属配音 1. 声音克隆技术的新突破 上周我尝试为一个儿童教育项目制作多语言版配音&#xff0c;传统方案需要聘请至少三位双语配音演员&#xff0c;预算超过2万元。当我用Qwen3-TTS-12Hz-1.7B-Base上传项目负责人…...