RuoYi-Cloud Kubernetes 集群部署完整指南
📋 目录
前置条件
硬件要求
- Master 节点: 1台 (2核4G以上)
- Worker 节点: 2台 (4核8G以上)
- 存储空间: 每个 Worker 节点至少 50GB 可用空间
软件要求
- Kubernetes v1.24+
- containerd 或 Docker
- kubectl 已配置
- Maven 3.6+ (用于构建后端)
- Node.js 16+ (用于构建前端)
网络要求
- 所有节点之间网络互通
- Worker 节点可访问外网(拉取镜像)
- 开放端口:
- 30080: Nginx HTTP
- 30306: MySQL (可选,外部访问)
- 30848: Nacos 控制台 (可选)
环境准备
1. 创建命名空间
bash
kubectl apply -f 00-namespace.yaml
2. 创建 StorageClass 和 PV
bash
kubectl apply -f storage-class.yaml
注意 : 此文件包含 MySQL、Redis 的 PV 配置,需要根据实际节点名称修改 nodeAffinity。
3. 创建 Secrets
bash
kubectl apply -f 00-secrets.yaml
包含以下 Secret:
mysql-secret: MySQL root 密码redis-secret: Redis 密码nacos-secret: Nacos 数据库密码
部署基础服务
1. MySQL 部署
1.1 配置文件说明
01-mysql/mysql-configmap.yaml: MySQL 配置文件01-mysql/mysql-service.yaml: MySQL Service (ClusterIP)01-mysql/mysql-statefulset.yaml: MySQL StatefulSet (主从复制)
1.2 部署命令
bash
# 应用配置
kubectl apply -f 01-mysql/mysql-configmap.yaml
kubectl apply -f 01-mysql/mysql-service.yaml
kubectl apply -f 01-mysql/mysql-statefulset.yaml
# 监控部署状态
kubectl get pods -n ruoyi-cloud -l app=mysql -w
1.3 验证部署
bash
# 检查 Pod 状态
kubectl get pods -n ruoyi-cloud -l app=mysql
# 应该看到:
# mysql-0 1/1 Running 0 xx
# mysql-1 1/1 Running 0 xx
# 测试连接
kubectl exec -it -n ruoyi-cloud mysql-0 -- mysql -uroot -ppassword -e "SHOW DATABASES;"
# 应该看到 ry-cloud, ry-config, ry-seata 等数据库
1.4 初始化数据库
如果数据库为空,需要导入 SQL 脚本:
bash
# 在 K8s Master 节点执行
kubectl cp sql/ry_20260417.sql ruoyi-cloud/mysql-0:/tmp/ry-cloud.sql
kubectl exec -it -n ruoyi-cloud mysql-0 -- mysql -uroot -ppassword ry-cloud < /tmp/ry-cloud.sql
kubectl cp sql/ry_config_20260311.sql ruoyi-cloud/mysql-0:/tmp/ry-config.sql
kubectl exec -it -n ruoyi-cloud mysql-0 -- mysql -uroot -ppassword ry-config < /tmp/ry-config.sql
kubectl cp sql/ry_seata_20210128.sql ruoyi-cloud/mysql-0:/tmp/ry-seata.sql
kubectl exec -it -n ruoyi-cloud mysql-0 -- mysql -uroot -ppassword ry-seata < /tmp/ry-seata.sql
2. Redis 部署
2.1 架构说明
采用 1主2哨兵 高可用架构:
redis-master-0: Redis Masterredis-sentinel-0/1/2: Redis Sentinel (3个哨兵)
2.2 配置文件说明
02-redis/redis-configmap.yaml: Redis Master 配置02-redis/redis-master-service.yaml: Redis Master Service02-redis/redis-master-statefulset.yaml: Redis Master StatefulSet02-redis/redis-sentinel-configmap.yaml: Sentinel 配置02-redis/redis-sentinel-service.yaml: Sentinel Service02-redis/redis-sentinel-statefulset.yaml: Sentinel StatefulSet
2.3 部署命令
bash
# 按顺序应用配置
kubectl apply -f 02-redis/redis-configmap.yaml
kubectl apply -f 02-redis/redis-master-service.yaml
kubectl apply -f 02-redis/redis-master-statefulset.yaml
kubectl apply -f 02-redis/redis-sentinel-configmap.yaml
kubectl apply -f 02-redis/redis-sentinel-service.yaml
kubectl apply -f 02-redis/redis-sentinel-statefulset.yaml
# 监控部署状态
kubectl get pods -n ruoyi-cloud -l app=redis -w
2.4 验证部署
bash
# 检查 Pod 状态
kubectl get pods -n ruoyi-cloud -l app=redis
# 应该看到:
# redis-master-0 1/1 Running 0 xx
# redis-sentinel-0 1/1 Running 0 xx
# redis-sentinel-1 1/1 Running 0 xx
# redis-sentinel-2 1/1 Running 0 xx
# 测试 Redis 连接
kubectl exec -it -n ruoyi-cloud redis-master-0 -- redis-cli -a password ping
# 应该返回 PONG
# 查看 Sentinel 状态
kubectl exec -it -n ruoyi-cloud redis-sentinel-0 -- redis-cli -p 26379 sentinel master mymaster
2.5 注意事项
- Redis 使用 Alpine 镜像,启动脚本使用
sh而非bash - 密码通过 Secret 注入,ConfigMap 中使用占位符
${REDIS_PASSWORD} - Sentinel quorum 设置为 2(3个哨兵中的多数)
3. Nacos 部署
3.1 架构说明
采用 2节点集群 模式,数据持久化到 MySQL。
3.2 配置文件说明
03-nacos/nacos-configmap.yaml: Nacos 配置文件(application.properties)03-nacos/nacos-headless-service.yaml: Headless Service(集群通信)03-nacos/nacos-service.yaml: NodePort Service(控制台访问)03-nacos/nacos-statefulset.yaml: Nacos StatefulSet
3.3 部署命令
bash
# 按顺序应用配置
kubectl apply -f 03-nacos/nacos-configmap.yaml
kubectl apply -f 03-nacos/nacos-headless-service.yaml
kubectl apply -f 03-nacos/nacos-service.yaml
kubectl apply -f 03-nacos/nacos-statefulset.yaml
# 监控部署状态
kubectl get pods -n ruoyi-cloud -l app=nacos -w
3.4 验证部署
bash
# 检查 Pod 状态
kubectl get pods -n ruoyi-cloud -l app=nacos
# 应该看到:
# nacos-0 1/1 Running 0 xx
# nacos-1 1/1 Running 0 xx
# 查看日志确认启动成功
kubectl logs -n ruoyi-cloud nacos-0 --tail=50 | grep "Nacos started successfully"
# 测试 Nacos API
kubectl exec -it -n ruoyi-cloud nacos-0 -- curl http://localhost:8848/nacos/v1/console/health/readiness
# 应该返回 OK
3.5 访问 Nacos 控制台
http://<任意节点IP>:30848/nacos
用户名/密码: nacos/nacos
3.6 导入配置到 Nacos
在 Nacos 控制台中导入以下配置文件(格式:YAML):
application-dev.yml:
yaml
spring:
autoconfigure:
exclude: com.alibaba.druid.spring.boot3.autoconfigure.DruidDataSourceAutoConfigure
redis:
host: redis-master.ruoyi-cloud.svc.cluster.local
port: 6379
password: password
database: 0
feign:
sentinel:
enabled: true
okhttp:
enabled: true
httpclient:
enabled: false
client:
config:
default:
connectTimeout: 10000
readTimeout: 10000
compression:
request:
enabled: true
min-request-size: 8192
response:
enabled: true
management:
endpoints:
web:
exposure:
include: '*'
ruoyi-gateway-dev.yml:
yaml
spring:
redis:
host: redis-master.ruoyi-cloud.svc.cluster.local
port: 6379
password: password
database: 0
cloud:
gateway:
server:
webflux:
discovery:
locator:
lowerCaseServiceId: true
enabled: true
routes:
- id: ruoyi-auth
uri: lb://ruoyi-auth
predicates:
- Path=/auth/**
filters:
- StripPrefix=1
- id: ruoyi-system
uri: lb://ruoyi-system
predicates:
- Path=/system/**
filters:
- StripPrefix=1
security:
captcha:
enabled: true
type: math
xss:
enabled: true
excludeUrls:
- /system/notice
ignore:
whites:
- /auth/logout
- /auth/login
- /auth/register
ruoyi-auth-dev.yml:
yaml
spring:
redis:
host: redis-master.ruoyi-cloud.svc.cluster.local
port: 6379
password: password
database: 0
ruoyi-system-dev.yml:
yaml
spring:
redis:
host: redis-master.ruoyi-cloud.svc.cluster.local
port: 6379
password: password
database: 0
部署应用服务
前置步骤:构建并推送 Docker 镜像
1. 编译后端项目
bash
cd /path/to/RuoYi-Cloud-master
# 清理并打包(跳过测试)
mvn clean package -DskipTests
2. 构建 Docker 镜像
bash
cd docker
# Gateway
mkdir -p ruoyi/gateway/jar
cp ../ruoyi-gateway/target/ruoyi-gateway.jar ruoyi/gateway/jar/
docker build -t your-registry.com/ruoyi/ruoyi-gateway:latest -f ruoyi/gateway/dockerfile .
# Auth
mkdir -p ruoyi/auth/jar
cp ../ruoyi-auth/target/ruoyi-auth.jar ruoyi/auth/jar/
docker build -t your-registry.com/ruoyi/ruoyi-auth:latest -f ruoyi/auth/dockerfile .
# System
mkdir -p ruoyi/modules/system/jar
cp ../../ruoyi-modules/ruoyi-system/target/ruoyi-modules-system.jar ruoyi/modules/system/jar/
docker build -t your-registry.com/ruoyi/ruoyi-modules-system:latest -f ruoyi/modules/system/dockerfile .
注意 : 替换 your-registry.com 为你的实际镜像仓库地址。
3. 推送镜像
bash
docker push your-registry.com/ruoyi/ruoyi-gateway:latest
docker push your-registry.com/ruoyi/ruoyi-auth:latest
docker push your-registry.com/ruoyi/ruoyi-modules-system:latest
4. 更新 Deployment 中的镜像地址
编辑以下文件,将镜像地址改为你的实际地址:
05-gateway/gateway-deployment.yaml06-auth/auth-deployment.yaml07-system/system-deployment.yaml
1. Gateway 部署
1.1 配置文件说明
05-gateway/gateway-deployment.yaml: Gateway Deployment (2副本)05-gateway/gateway-service.yaml: Gateway Service (ClusterIP)
1.2 部署命令
bash
kubectl apply -f 05-gateway/gateway-deployment.yaml
kubectl apply -f 05-gateway/gateway-service.yaml
# 监控部署状态
kubectl get pods -n ruoyi-cloud -l app=gateway -w
1.3 验证部署
bash
# 检查 Pod 状态
kubectl get pods -n ruoyi-cloud -l app=gateway
# 应该看到:
# gateway-xxx-xxx 1/1 Running 0 xx
# gateway-xxx-xxx 1/1 Running 0 xx
# 查看日志确认启动成功
kubectl logs -n ruoyi-cloud -l app=gateway --tail=50 | grep "Started RuoYiGatewayApplication"
# 测试健康检查
kubectl exec -it -n ruoyi-cloud <gateway-pod-name> -- curl http://localhost:8080/actuator/health
2. Auth 部署
2.1 配置文件说明
06-auth/auth-deployment.yaml: Auth Deployment (2副本)06-auth/auth-service.yaml: Auth Service (ClusterIP)
2.2 部署命令
bash
kubectl apply -f 06-auth/auth-deployment.yaml
kubectl apply -f 06-auth/auth-service.yaml
# 监控部署状态
kubectl get pods -n ruoyi-cloud -l app=auth -w
2.3 验证部署
bash
# 检查 Pod 状态
kubectl get pods -n ruoyi-cloud -l app=auth
# 查看日志
kubectl logs -n ruoyi-cloud -l app=auth --tail=50 | grep "Started RuoYiAuthApplication"
3. System 部署
3.1 配置文件说明
07-system/system-deployment.yaml: System Deployment (2副本)07-system/system-service.yaml: System Service (ClusterIP)
3.2 部署命令
bash
kubectl apply -f 07-system/system-deployment.yaml
kubectl apply -f 07-system/system-service.yaml
# 监控部署状态
kubectl get pods -n ruoyi-cloud -l app=system -w
3.3 验证部署
bash
# 检查 Pod 状态
kubectl get pods -n ruoyi-cloud -l app=system
# 查看日志
kubectl logs -n ruoyi-cloud -l app=system --tail=50 | grep "Started RuoYiSystemApplication"
部署 Nginx
1. 构建前端
bash
cd /path/to/RuoYi-Cloud-master/ruoyi-ui
# 安装依赖
npm install
# 构建生产版本
npm run build:prod
这会生成 dist 目录。
2. 上传前端文件到 Worker 节点
bash
# 在 K8s Master 节点执行
# 压缩前端文件
cd /path/to/ruoyi-ui
tar czf ruoyi-ui-dist.tar.gz dist/
# 传输到 worker 节点
scp ruoyi-ui-dist.tar.gz root@k8s-worker-1:/tmp/
scp ruoyi-ui-dist.tar.gz root@k8s-worker-2:/tmp/
# 在 worker 节点解压
ssh root@k8s-worker-1 "mkdir -p /data/nginx-html && tar xzf /tmp/ruoyi-ui-dist.tar.gz -C /data/nginx-html/ --strip-components=1"
ssh root@k8s-worker-2 "mkdir -p /data/nginx-html && tar xzf /tmp/ruoyi-ui-dist.tar.gz -C /data/nginx-html/ --strip-components=1"
# 设置权限
ssh root@k8s-worker-1 "chmod -R 755 /data/nginx-html/"
ssh root@k8s-worker-2 "chmod -R 755 /data/nginx-html/"
3. 配置文件说明
10-nginx/nginx-configmap.yaml: Nginx 配置文件10-nginx/nginx-deployment.yaml: Nginx Deployment (2副本)10-nginx/nginx-service.yaml: Nginx Service (NodePort 30080)
4. 部署命令
bash
kubectl apply -f 10-nginx/nginx-configmap.yaml
kubectl apply -f 10-nginx/nginx-deployment.yaml
kubectl apply -f 10-nginx/nginx-service.yaml
# 监控部署状态
kubectl get pods -n ruoyi-cloud -l app=nginx -w
5. 验证部署
bash
# 检查 Pod 状态
kubectl get pods -n ruoyi-cloud -l app=nginx
# 应该看到:
# nginx-xxx-xxx 1/1 Running 0 xx
# nginx-xxx-xxx 1/1 Running 0 xx
# 验证文件挂载
POD_NAME=$(kubectl get pod -n ruoyi-cloud -l app=nginx -o jsonpath='{.items[0].metadata.name}')
kubectl exec -it -n ruoyi-cloud $POD_NAME -- ls -la /usr/share/nginx/html/ | head -10
6. 访问前端
http://<任意节点IP>:30080
应该能看到 RuoYi 登录页面。
验证与测试
1. 检查所有服务状态
bash
kubectl get all -n ruoyi-cloud
应该看到:
- MySQL: 2个 Pod (StatefulSet)
- Redis: 4个 Pod (1 Master + 3 Sentinel)
- Nacos: 2个 Pod (StatefulSet)
- Gateway: 2个 Pod (Deployment)
- Auth: 2个 Pod (Deployment)
- System: 2个 Pod (Deployment)
- Nginx: 2个 Pod (Deployment)
2. 测试 API 接口
bash
# 测试验证码接口
curl http://<节点IP>:30080/prod-api/captchaImage
# 应该返回 JSON 数据,包含验证码图片的 base64 编码
3. 测试登录
在浏览器访问 http://<节点IP>:30080,使用默认账号登录:
- 用户名: admin
- 密码: admin123
4. 检查日志
bash
# 查看所有服务的日志
kubectl logs -n ruoyi-cloud -l app=gateway --tail=20
kubectl logs -n ruoyi-cloud -l app=auth --tail=20
kubectl logs -n ruoyi-cloud -l app=system --tail=20
# 查看是否有错误
kubectl logs -n ruoyi-cloud -l app=gateway | grep -i "error\|exception"
5. 检查资源使用情况
bash
kubectl top pods -n ruoyi-cloud
常见问题
1. Pod 一直处于 Pending 状态
原因: PVC 未绑定或资源不足
解决:
bash
# 检查 PVC 状态
kubectl get pvc -n ruoyi-cloud
# 检查 PV 是否创建
kubectl get pv
# 查看 Pod 事件
kubectl describe pod -n ruoyi-cloud <pod-name> | tail -30
2. Pod 处于 CrashLoopBackOff 状态
原因: 应用启动失败
解决:
bash
# 查看日志
kubectl logs -n ruoyi-cloud <pod-name> --tail=100
# 查看上一次崩溃的日志
kubectl logs -n ruoyi-cloud <pod-name> --previous --tail=100
3. Redis 连接失败
症状 : 日志显示 Unable to connect to localhost:6379
原因: Nacos 配置中 Redis 地址错误
解决:
-
登录 Nacos 控制台
-
修改
application-dev.yml,确保 Redis 地址为:yamlspring: redis: host: redis-master.ruoyi-cloud.svc.cluster.local port: 6379 password: password -
重启相关服务:
bashkubectl delete pod -n ruoyi-cloud -l app=gateway kubectl delete pod -n ruoyi-cloud -l app=auth kubectl delete pod -n ruoyi-cloud -l app=system
4. Nacos 配置查询不到
原因: Profile 不匹配
解决:
- 确认 Deployment 中
SPRING_PROFILES_ACTIVE为dev - 确认 Nacos 中配置文件名为
application-dev.yml、ruoyi-gateway-dev.yml等
5. 前端页面卡在"加载系统资源"
原因:
- 前端文件未正确部署
- API 请求路径配置错误
解决:
-
检查 Nginx Pod 中是否有前端文件:
bashkubectl exec -it -n ruoyi-cloud <nginx-pod> -- ls -la /usr/share/nginx/html/ -
检查浏览器 Console 是否有错误
-
检查 Network 标签页,确认
/prod-api/xxx请求是否正常
6. MySQL 数据丢失
原因: PV 没有 nodeAffinity,Pod 被调度到不同节点
解决:
- 为 PV 添加 nodeAffinity
- 删除并重新创建 PV
- 参考
storage-class.yaml中的配置
7. 镜像拉取失败
原因: 无法访问 Docker Hub
解决 :
使用国内镜像源,例如:
yaml
image: docker.m.daocloud.io/library/nginx:1.24-alpine
或在所有节点配置镜像加速器。
维护操作
重启服务
bash
# 重启单个服务
kubectl rollout restart deployment/<service-name> -n ruoyi-cloud
# 示例:重启 Gateway
kubectl rollout restart deployment/gateway -n ruoyi-cloud
扩容/缩容
bash
# 扩容到 3 个副本
kubectl scale deployment gateway --replicas=3 -n ruoyi-cloud
# 缩容到 1 个副本
kubectl scale deployment gateway --replicas=1 -n ruoyi-cloud
查看日志
bash
# 实时查看日志
kubectl logs -n ruoyi-cloud -l app=<service-name> -f
# 查看最近 100 行日志
kubectl logs -n ruoyi-cloud -l app=<service-name> --tail=100
进入容器调试
bash
kubectl exec -it -n ruoyi-cloud <pod-name> -- sh
备份与恢复
备份 MySQL 数据
bash
# 在 K8s Master 节点执行
kubectl exec -it -n ruoyi-cloud mysql-0 -- mysqldump -uroot -ppassword --all-databases > /tmp/mysql-backup-$(date +%Y%m%d).sql
# 复制到本地
scp root@<K8s-Master-IP>:/tmp/mysql-backup-*.sql ./
恢复 MySQL 数据
bash
# 上传备份文件
scp mysql-backup-20260506.sql root@<K8s-Master-IP>:/tmp/
# 恢复数据
kubectl cp /tmp/mysql-backup-20260506.sql ruoyi-cloud/mysql-0:/tmp/restore.sql
kubectl exec -it -n ruoyi-cloud mysql-0 -- mysql -uroot -ppassword < /tmp/restore.sql
附录
A. 常用命令速查
bash
# 查看所有资源
kubectl get all -n ruoyi-cloud
# 查看 Pod 状态
kubectl get pods -n ruoyi-cloud -o wide
# 查看 Service
kubectl get svc -n ruoyi-cloud
# 查看 PV/PVC
kubectl get pv
kubectl get pvc -n ruoyi-cloud
# 查看 ConfigMap
kubectl get cm -n ruoyi-cloud
# 查看 Secret
kubectl get secret -n ruoyi-cloud
# 删除所有 Pod(强制重建)
kubectl delete pod -n ruoyi-cloud --all --force --grace-period=0
B. 端口映射表
| 服务 | 内部端口 | NodePort | 说明 |
|---|---|---|---|
| Nginx | 80 | 30080 | 前端访问入口 |
| MySQL | 3306 | 30306 | 数据库(可选) |
| Nacos | 8848 | 30848 | 配置中心控制台 |
| Gateway | 8080 | - | 内部服务 |
| Redis | 6379 | - | 内部服务 |
C. 服务发现域名
在 K8s 集群内,服务可以通过以下域名访问:
<service-name>.<namespace>.svc.cluster.local
示例:
- MySQL: mysql.ruoyi-cloud.svc.cluster.local:3306
- Redis: redis-master.ruoyi-cloud.svc.cluster.local:6379
- Nacos: nacos.ruoyi-cloud.svc.cluster.local:8848
- Gateway: gateway.ruoyi-cloud.svc.cluster.local:8080
更新日志
- 2026-05-06: 初始版本,包含完整的部署流程
- 基于 RuoYi-Cloud 微服务架构
- Kubernetes v1.24+
- 采用 StatefulSet 部署有状态服务
- 采用 Deployment 部署无状态服务
技术支持
如遇到问题,请检查:
- Kubernetes 集群状态:
kubectl get nodes - Pod 状态和事件:
kubectl describe pod -n ruoyi-cloud <pod-name> - 应用日志:
kubectl logs -n ruoyi-cloud <pod-name> - Nacos 配置是否正确导入
- 网络连接是否正常