【Kubernetes 实战】(二)部署 Ruoyi-Cloud —— 部署服务 RuoYi-Cloud Kubernetes 集群部署完整指南项目地址https://gitee.com/huyiming52/k8s-demo-ktt 目录前置条件环境准备部署基础服务MySQLRedisNacos部署应用服务GatewayAuthSystem部署 Nginx验证与测试常见问题前置条件硬件要求Master 节点: 1台 (2核4G以上)Worker 节点: 2台 (4核8G以上)存储空间: 每个 Worker 节点至少 50GB 可用空间软件要求Kubernetes v1.24containerd 或 Dockerkubectl 已配置Maven 3.6 (用于构建后端)Node.js 16 (用于构建前端)网络要求所有节点之间网络互通Worker 节点可访问外网拉取镜像开放端口30080: Nginx HTTP30306: MySQL (可选外部访问)30848: Nacos 控制台 (可选)环境准备1. 创建命名空间kubectl apply-f00-namespace.yaml2. 创建 StorageClass 和 PVkubectl apply-fstorage-class.yaml注意: 此文件包含 MySQL、Redis 的 PV 配置需要根据实际节点名称修改nodeAffinity。3. 创建 Secretskubectl apply-f00-secrets.yaml包含以下 Secretmysql-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 部署命令# 应用配置kubectl apply-f01-mysql/mysql-configmap.yaml kubectl apply-f01-mysql/mysql-service.yaml kubectl apply-f01-mysql/mysql-statefulset.yaml# 监控部署状态kubectl get pods-nruoyi-cloud-lappmysql-w1.3 验证部署# 检查 Pod 状态kubectl get pods-nruoyi-cloud-lappmysql# 应该看到# mysql-0 1/1 Running 0 xx# mysql-1 1/1 Running 0 xx# 测试连接kubectlexec-it-nruoyi-cloud mysql-0 -- mysql-uroot-ppassword-eSHOW DATABASES;# 应该看到 ry-cloud, ry-config, ry-seata 等数据库1.4 初始化数据库如果数据库为空需要导入 SQL 脚本# 在 K8s Master 节点执行kubectlcpsql/ry_20260417.sql ruoyi-cloud/mysql-0:/tmp/ry-cloud.sql kubectlexec-it-nruoyi-cloud mysql-0 -- mysql-uroot-ppasswordry-cloud/tmp/ry-cloud.sql kubectlcpsql/ry_config_20260311.sql ruoyi-cloud/mysql-0:/tmp/ry-config.sql kubectlexec-it-nruoyi-cloud mysql-0 -- mysql-uroot-ppasswordry-config/tmp/ry-config.sql kubectlcpsql/ry_seata_20210128.sql ruoyi-cloud/mysql-0:/tmp/ry-seata.sql kubectlexec-it-nruoyi-cloud mysql-0 -- mysql-uroot-ppasswordry-seata/tmp/ry-seata.sql2. 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 StatefulSet2.3 部署命令# 按顺序应用配置kubectl apply-f02-redis/redis-configmap.yaml kubectl apply-f02-redis/redis-master-service.yaml kubectl apply-f02-redis/redis-master-statefulset.yaml kubectl apply-f02-redis/redis-sentinel-configmap.yaml kubectl apply-f02-redis/redis-sentinel-service.yaml kubectl apply-f02-redis/redis-sentinel-statefulset.yaml# 监控部署状态kubectl get pods-nruoyi-cloud-lappredis-w2.4 验证部署# 检查 Pod 状态kubectl get pods-nruoyi-cloud-lappredis# 应该看到# 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 连接kubectlexec-it-nruoyi-cloud redis-master-0 -- redis-cli-apasswordping# 应该返回 PONG# 查看 Sentinel 状态kubectlexec-it-nruoyi-cloud redis-sentinel-0 -- redis-cli-p26379sentinel master mymaster2.5 注意事项Redis 使用 Alpine 镜像启动脚本使用sh而非bash密码通过 Secret 注入ConfigMap 中使用占位符${REDIS_PASSWORD}Sentinel quorum 设置为 23个哨兵中的多数3. Nacos 部署3.1 架构说明采用2节点集群模式数据持久化到 MySQL。3.2 配置文件说明03-nacos/nacos-configmap.yaml: Nacos 配置文件application.properties03-nacos/nacos-headless-service.yaml: Headless Service集群通信03-nacos/nacos-service.yaml: NodePort Service控制台访问03-nacos/nacos-statefulset.yaml: Nacos StatefulSet3.3 部署命令# 按顺序应用配置kubectl apply-f03-nacos/nacos-configmap.yaml kubectl apply-f03-nacos/nacos-headless-service.yaml kubectl apply-f03-nacos/nacos-service.yaml kubectl apply-f03-nacos/nacos-statefulset.yaml# 监控部署状态kubectl get pods-nruoyi-cloud-lappnacos-w3.4 验证部署# 检查 Pod 状态kubectl get pods-nruoyi-cloud-lappnacos# 应该看到# nacos-0 1/1 Running 0 xx# nacos-1 1/1 Running 0 xx# 查看日志确认启动成功kubectl logs-nruoyi-cloud nacos-0--tail50|grepNacos started successfully# 测试 Nacos APIkubectlexec-it-nruoyi-cloud nacos-0 --curlhttp://localhost:8848/nacos/v1/console/health/readiness# 应该返回 OK3.5 访问 Nacos 控制台http://任意节点IP:30848/nacos 用户名/密码: nacos/nacos3.6 导入配置到 Nacos在 Nacos 控制台中导入以下配置文件格式YAMLapplication-dev.yml:spring:autoconfigure:exclude:com.alibaba.druid.spring.boot3.autoconfigure.DruidDataSourceAutoConfigureredis:host:redis-master.ruoyi-cloud.svc.cluster.localport:6379password:passworddatabase:0feign:sentinel:enabled:trueokhttp:enabled:truehttpclient:enabled:falseclient:config:default:connectTimeout:10000readTimeout:10000compression:request:enabled:truemin-request-size:8192response:enabled:truemanagement:endpoints:web:exposure:include:*ruoyi-gateway-dev.yml:spring:redis:host:redis-master.ruoyi-cloud.svc.cluster.localport:6379password:passworddatabase:0cloud:gateway:server:webflux:discovery:locator:lowerCaseServiceId:trueenabled:trueroutes:-id:ruoyi-authuri:lb://ruoyi-authpredicates:-Path/auth/**filters:-StripPrefix1-id:ruoyi-systemuri:lb://ruoyi-systempredicates:-Path/system/**filters:-StripPrefix1security:captcha:enabled:truetype:mathxss:enabled:trueexcludeUrls:-/system/noticeignore:whites:-/auth/logout-/auth/login-/auth/registerruoyi-auth-dev.yml:spring:redis:host:redis-master.ruoyi-cloud.svc.cluster.localport:6379password:passworddatabase:0ruoyi-system-dev.yml:spring:redis:host:redis-master.ruoyi-cloud.svc.cluster.localport:6379password:passworddatabase:0部署应用服务前置步骤构建并推送 Docker 镜像1. 编译后端项目cd/path/to/RuoYi-Cloud-master# 清理并打包跳过测试mvn clean package-DskipTests2. 构建 Docker 镜像cddocker# Gatewaymkdir-pruoyi/gateway/jarcp../ruoyi-gateway/target/ruoyi-gateway.jar ruoyi/gateway/jar/dockerbuild-tyour-registry.com/ruoyi/ruoyi-gateway:latest-fruoyi/gateway/dockerfile.# Authmkdir-pruoyi/auth/jarcp../ruoyi-auth/target/ruoyi-auth.jar ruoyi/auth/jar/dockerbuild-tyour-registry.com/ruoyi/ruoyi-auth:latest-fruoyi/auth/dockerfile.# Systemmkdir-pruoyi/modules/system/jarcp../../ruoyi-modules/ruoyi-system/target/ruoyi-modules-system.jar ruoyi/modules/system/jar/dockerbuild-tyour-registry.com/ruoyi/ruoyi-modules-system:latest-fruoyi/modules/system/dockerfile.注意: 替换your-registry.com为你的实际镜像仓库地址。3. 推送镜像dockerpush your-registry.com/ruoyi/ruoyi-gateway:latestdockerpush your-registry.com/ruoyi/ruoyi-auth:latestdockerpush your-registry.com/ruoyi/ruoyi-modules-system:latest4. 更新 Deployment 中的镜像地址编辑以下文件将镜像地址改为你的实际地址05-gateway/gateway-deployment.yaml06-auth/auth-deployment.yaml07-system/system-deployment.yaml1. Gateway 部署1.1 配置文件说明05-gateway/gateway-deployment.yaml: Gateway Deployment (2副本)05-gateway/gateway-service.yaml: Gateway Service (ClusterIP)1.2 部署命令kubectl apply-f05-gateway/gateway-deployment.yaml kubectl apply-f05-gateway/gateway-service.yaml# 监控部署状态kubectl get pods-nruoyi-cloud-lappgateway-w1.3 验证部署# 检查 Pod 状态kubectl get pods-nruoyi-cloud-lappgateway# 应该看到# gateway-xxx-xxx 1/1 Running 0 xx# gateway-xxx-xxx 1/1 Running 0 xx# 查看日志确认启动成功kubectl logs-nruoyi-cloud-lappgateway--tail50|grepStarted RuoYiGatewayApplication# 测试健康检查kubectlexec-it-nruoyi-cloudgateway-pod-name--curlhttp://localhost:8080/actuator/health2. Auth 部署2.1 配置文件说明06-auth/auth-deployment.yaml: Auth Deployment (2副本)06-auth/auth-service.yaml: Auth Service (ClusterIP)2.2 部署命令kubectl apply-f06-auth/auth-deployment.yaml kubectl apply-f06-auth/auth-service.yaml# 监控部署状态kubectl get pods-nruoyi-cloud-lappauth-w2.3 验证部署# 检查 Pod 状态kubectl get pods-nruoyi-cloud-lappauth# 查看日志kubectl logs-nruoyi-cloud-lappauth--tail50|grepStarted RuoYiAuthApplication3. System 部署3.1 配置文件说明07-system/system-deployment.yaml: System Deployment (2副本)07-system/system-service.yaml: System Service (ClusterIP)3.2 部署命令kubectl apply-f07-system/system-deployment.yaml kubectl apply-f07-system/system-service.yaml# 监控部署状态kubectl get pods-nruoyi-cloud-lappsystem-w3.3 验证部署# 检查 Pod 状态kubectl get pods-nruoyi-cloud-lappsystem# 查看日志kubectl logs-nruoyi-cloud-lappsystem--tail50|grepStarted RuoYiSystemApplication部署 Nginx1. 构建前端cd/path/to/RuoYi-Cloud-master/ruoyi-ui# 安装依赖npminstall# 构建生产版本npmrun build:prod这会生成dist目录。2. 上传前端文件到 Worker 节点# 在 K8s Master 节点执行# 压缩前端文件cd/path/to/ruoyi-uitarczf ruoyi-ui-dist.tar.gz dist/# 传输到 worker 节点scpruoyi-ui-dist.tar.gz rootk8s-worker-1:/tmp/scpruoyi-ui-dist.tar.gz rootk8s-worker-2:/tmp/# 在 worker 节点解压sshrootk8s-worker-1mkdir -p /data/nginx-html tar xzf /tmp/ruoyi-ui-dist.tar.gz -C /data/nginx-html/ --strip-components1sshrootk8s-worker-2mkdir -p /data/nginx-html tar xzf /tmp/ruoyi-ui-dist.tar.gz -C /data/nginx-html/ --strip-components1# 设置权限sshrootk8s-worker-1chmod -R 755 /data/nginx-html/sshrootk8s-worker-2chmod -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. 部署命令kubectl apply-f10-nginx/nginx-configmap.yaml kubectl apply-f10-nginx/nginx-deployment.yaml kubectl apply-f10-nginx/nginx-service.yaml# 监控部署状态kubectl get pods-nruoyi-cloud-lappnginx-w5. 验证部署# 检查 Pod 状态kubectl get pods-nruoyi-cloud-lappnginx# 应该看到# nginx-xxx-xxx 1/1 Running 0 xx# nginx-xxx-xxx 1/1 Running 0 xx# 验证文件挂载POD_NAME$(kubectl get pod-nruoyi-cloud-lappnginx-ojsonpath{.items[0].metadata.name})kubectlexec-it-nruoyi-cloud$POD_NAME--ls-la/usr/share/nginx/html/|head-106. 访问前端http://任意节点IP:30080应该能看到 RuoYi 登录页面。验证与测试1. 检查所有服务状态kubectl get all-nruoyi-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 接口# 测试验证码接口curlhttp://节点IP:30080/prod-api/captchaImage# 应该返回 JSON 数据包含验证码图片的 base64 编码3. 测试登录在浏览器访问http://节点IP:30080使用默认账号登录用户名: admin密码: admin1234. 检查日志# 查看所有服务的日志kubectl logs-nruoyi-cloud-lappgateway--tail20kubectl logs-nruoyi-cloud-lappauth--tail20kubectl logs-nruoyi-cloud-lappsystem--tail20# 查看是否有错误kubectl logs-nruoyi-cloud-lappgateway|grep-ierror\|exception5. 检查资源使用情况kubectltoppods-nruoyi-cloud常见问题1. Pod 一直处于 Pending 状态原因: PVC 未绑定或资源不足解决:# 检查 PVC 状态kubectl get pvc-nruoyi-cloud# 检查 PV 是否创建kubectl getpv# 查看 Pod 事件kubectl describe pod-nruoyi-cloudpod-name|tail-302. Pod 处于 CrashLoopBackOff 状态原因: 应用启动失败解决:# 查看日志kubectl logs-nruoyi-cloudpod-name--tail100# 查看上一次崩溃的日志kubectl logs-nruoyi-cloudpod-name--previous--tail1003. Redis 连接失败症状: 日志显示Unable to connect to localhost:6379原因: Nacos 配置中 Redis 地址错误解决:登录 Nacos 控制台修改application-dev.yml确保 Redis 地址为spring:redis:host:redis-master.ruoyi-cloud.svc.cluster.localport:6379password:password重启相关服务kubectl delete pod-nruoyi-cloud-lappgateway kubectl delete pod-nruoyi-cloud-lappauth kubectl delete pod-nruoyi-cloud-lappsystem4. Nacos 配置查询不到原因: Profile 不匹配解决:确认 Deployment 中SPRING_PROFILES_ACTIVE为dev确认 Nacos 中配置文件名为application-dev.yml、ruoyi-gateway-dev.yml等5. 前端页面卡在加载系统资源原因:前端文件未正确部署API 请求路径配置错误解决:检查 Nginx Pod 中是否有前端文件kubectlexec-it-nruoyi-cloudnginx-pod--ls-la/usr/share/nginx/html/检查浏览器 Console 是否有错误检查 Network 标签页确认/prod-api/xxx请求是否正常6. MySQL 数据丢失原因: PV 没有 nodeAffinityPod 被调度到不同节点解决:为 PV 添加 nodeAffinity删除并重新创建 PV参考storage-class.yaml中的配置7. 镜像拉取失败原因: 无法访问 Docker Hub解决:使用国内镜像源例如image:docker.m.daocloud.io/library/nginx:1.24-alpine或在所有节点配置镜像加速器。维护操作重启服务# 重启单个服务kubectl rollout restart deployment/service-name-nruoyi-cloud# 示例重启 Gatewaykubectl rollout restart deployment/gateway-nruoyi-cloud扩容/缩容# 扩容到 3 个副本kubectl scale deployment gateway--replicas3-nruoyi-cloud# 缩容到 1 个副本kubectl scale deployment gateway--replicas1-nruoyi-cloud查看日志# 实时查看日志kubectl logs-nruoyi-cloud-lappservice-name-f# 查看最近 100 行日志kubectl logs-nruoyi-cloud-lappservice-name--tail100进入容器调试kubectlexec-it-nruoyi-cloudpod-name--sh备份与恢复备份 MySQL 数据# 在 K8s Master 节点执行kubectlexec-it-nruoyi-cloud mysql-0 -- mysqldump-uroot-ppassword--all-databases/tmp/mysql-backup-$(date%Y%m%d).sql# 复制到本地scprootK8s-Master-IP:/tmp/mysql-backup-*.sql ./恢复 MySQL 数据# 上传备份文件scpmysql-backup-20260506.sql rootK8s-Master-IP:/tmp/# 恢复数据kubectlcp/tmp/mysql-backup-20260506.sql ruoyi-cloud/mysql-0:/tmp/restore.sql kubectlexec-it-nruoyi-cloud mysql-0 -- mysql-uroot-ppassword/tmp/restore.sql附录A. 常用命令速查# 查看所有资源kubectl get all-nruoyi-cloud# 查看 Pod 状态kubectl get pods-nruoyi-cloud-owide# 查看 Servicekubectl get svc-nruoyi-cloud# 查看 PV/PVCkubectl getpvkubectl get pvc-nruoyi-cloud# 查看 ConfigMapkubectl get cm-nruoyi-cloud# 查看 Secretkubectl get secret-nruoyi-cloud# 删除所有 Pod强制重建kubectl delete pod-nruoyi-cloud--all--force--grace-period0B. 端口映射表服务内部端口NodePort说明Nginx8030080前端访问入口MySQL330630306数据库可选Nacos884830848配置中心控制台Gateway8080-内部服务Redis6379-内部服务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 nodesPod 状态和事件kubectl describe pod -n ruoyi-cloud pod-name应用日志kubectl logs -n ruoyi-cloud pod-nameNacos 配置是否正确导入网络连接是否正常