【Kubernetes 实战】(二)部署 Ruoyi-Cloud —— 部署服务

RuoYi-Cloud Kubernetes 集群部署完整指南

项目地址:https://gitee.com/huyiming52/k8s-demo-ktt

📋 目录

  1. 前置条件
  2. 环境准备
  3. 部署基础服务
  4. 部署应用服务
  5. [部署 Nginx](#部署 Nginx)
  6. 验证与测试
  7. 常见问题

前置条件

硬件要求

  • 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 Master
  • redis-sentinel-0/1/2: Redis Sentinel (3个哨兵)
2.2 配置文件说明
  • 02-redis/redis-configmap.yaml: Redis Master 配置
  • 02-redis/redis-master-service.yaml: Redis Master Service
  • 02-redis/redis-master-statefulset.yaml: Redis Master StatefulSet
  • 02-redis/redis-sentinel-configmap.yaml: Sentinel 配置
  • 02-redis/redis-sentinel-service.yaml: Sentinel Service
  • 02-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.yaml
  • 06-auth/auth-deployment.yaml
  • 07-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 地址错误

解决:

  1. 登录 Nacos 控制台

  2. 修改 application-dev.yml,确保 Redis 地址为:

    yaml 复制代码
    spring:
      redis:
        host: redis-master.ruoyi-cloud.svc.cluster.local
        port: 6379
        password: password
  3. 重启相关服务:

    bash 复制代码
    kubectl 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_ACTIVEdev
  • 确认 Nacos 中配置文件名为 application-dev.ymlruoyi-gateway-dev.yml

5. 前端页面卡在"加载系统资源"

原因:

  1. 前端文件未正确部署
  2. API 请求路径配置错误

解决:

  1. 检查 Nginx Pod 中是否有前端文件:

    bash 复制代码
    kubectl exec -it -n ruoyi-cloud <nginx-pod> -- ls -la /usr/share/nginx/html/
  2. 检查浏览器 Console 是否有错误

  3. 检查 Network 标签页,确认 /prod-api/xxx 请求是否正常

6. MySQL 数据丢失

原因: PV 没有 nodeAffinity,Pod 被调度到不同节点

解决:

  1. 为 PV 添加 nodeAffinity
  2. 删除并重新创建 PV
  3. 参考 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 部署无状态服务

技术支持

如遇到问题,请检查:

  1. Kubernetes 集群状态:kubectl get nodes
  2. Pod 状态和事件:kubectl describe pod -n ruoyi-cloud <pod-name>
  3. 应用日志:kubectl logs -n ruoyi-cloud <pod-name>
  4. Nacos 配置是否正确导入
  5. 网络连接是否正常
相关推荐
淼澄研学1 小时前
Proliferate开源框架技术解析与Docker部署实操
docker·容器·开源
浪兎兎2 小时前
Docker 容器技术笔记
笔记·docker·容器
Zhu7584 小时前
在Docker环境离线部署最新版Harbor
运维·docker·容器
大大大大晴天4 小时前
K8S 在大数据里的真正价值:适用场景、收益边界与不适合的地方
大数据·云原生
众人皆醒我独醉4 小时前
流量路由:Istio 与 Knative 的集成
面试·kubernetes·llm
众人皆醒我独醉4 小时前
模型加载:storage-initializer 与节点级缓存
面试·kubernetes·gpu
Henry-SAP4 小时前
AI与机器人信息新闻
人工智能·云原生·sap·erp
阿里云云原生5 小时前
深入解析阿里云 SysOM AI Profiling:如何实现零侵入的AI作业全生命周期观测?
云原生
SakitamaX5 小时前
pod管理及其相关实验
运维·kubernetes