从零到生产Ruoyi Cloud微服务在Kubernetes上的完整部署指南当企业级应用从单体架构转向微服务时KubernetesK8s已成为部署和管理这些分布式系统的首选平台。本文将带你深入探索如何将流行的Ruoyi Cloud微服务框架无缝迁移到Kubernetes集群从基础环境准备到生产级部署涵盖全链路实践细节。1. 环境准备与架构设计在开始部署前我们需要对整体架构有清晰认识。Ruoyi Cloud是一个基于Spring Cloud Alibaba的企业级微服务解决方案包含网关、认证、系统管理等多个模块。在Kubernetes环境中这些组件将以容器化方式运行并通过K8s原生服务发现机制相互通信。1.1 基础组件规划Ruoyi Cloud在K8s上的部署需要以下核心组件协同工作有状态服务MySQL 8.0主数据库Redis 7.2缓存服务MinIO对象存储服务无状态服务Nacos 2.3服务注册与配置中心Sentinel 1.8流量控制组件Ruoyi各业务模块网关、认证、系统管理等1.2 集群资源建议根据实践经验建议为测试环境准备以下资源配置节点类型CPU核心内存磁盘数量Master48GB50GB1-3Worker816GB100GB3提示生产环境应根据实际负载情况适当增加资源特别是对于有状态服务节点1.3 网络拓扑设计服务间的通信关系需要提前规划graph LR A[Ruoyi-UI] -- B[Ruoyi-Gateway] B -- C[Auth-Service] B -- D[Sys-Service] B -- E[File-Service] C D E -- F[MySQL] C D E -- G[Redis] E -- H[MinIO]2. 关键配置改造将Ruoyi Cloud迁移到Kubernetes需要对原有配置进行针对性调整主要涉及服务发现、配置中心和持久化存储等方面。2.1 Bootstrap配置改造每个微服务模块的bootstrap.yml需要增加K8s环境专用配置spring: config: activate: on-profile: k8s cloud: nacos: discovery: server-addr: ry-cloud-nacos-service:8848 config: server-addr: ry-cloud-nacos-service:8848 sentinel: transport: dashboard: ry-cloud-sentinel-service:8858关键改动点将硬编码的IP地址替换为K8s Service名称为K8s环境创建独立的profile配置确保服务发现使用集群内部DNS解析2.2 持久化存储适配对于文件上传等需要持久化存储的功能需要调整实现类Primary Service public class MinioSysFileServiceImpl implements ISysFileService { // 修改URL生成逻辑使用NodePort访问地址 public String getUrl(String bucketName, String fileName) { return minioConfig.getImgOuterAccessUrlPrefix() / bucketName / fileName; } }2.3 日志收集方案在容器环境中日志需要输出到标准输出或持久化卷!-- logback.xml配置调整 -- property namelog.path value/opt/project/ruoyi/logs/ruoyi-gateway / appender nameSTDOUT classch.qos.logback.core.ConsoleAppender encoder pattern%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n/pattern /encoder /appender3. Kubernetes资源编排合理的K8s资源定义是部署成功的关键我们需要为每种服务类型设计合适的部署方案。3.1 有状态服务部署以MySQL为例需要配置持久化卷和初始化脚本apiVersion: v1 kind: PersistentVolume metadata: name: ruoyi-cloud-mysql-pv spec: capacity: storage: 10Gi accessModes: - ReadWriteOnce hostPath: path: /pv/ry-cloud/mysql --- apiVersion: v1 kind: PersistentVolumeClaim metadata: name: ruoyi-cloud-mysql-pvc spec: accessModes: - ReadWriteOnce resources: requests: storage: 10Gi --- apiVersion: apps/v1 kind: Deployment metadata: name: ry-cloud-mysql-deployment spec: template: spec: containers: - name: mysql image: mysql:8.0 env: - name: MYSQL_ROOT_PASSWORD value: 123456 volumeMounts: - mountPath: /docker-entrypoint-initdb.d name: init-sql - mountPath: /var/lib/mysql name: mysql-data volumes: - name: init-sql configMap: name: ruoyi-cloud-init-sql-config-map - name: mysql-data persistentVolumeClaim: claimName: ruoyi-cloud-mysql-pvc3.2 无状态服务部署后端服务部署模板以网关为例apiVersion: apps/v1 kind: Deployment metadata: name: ruoyi-cloud-gateway-deployment spec: replicas: 2 template: spec: initContainers: - name: wait-for-dependencies image: busybox command: [sh, -c, until nslookup ry-cloud-mysql-service; do echo waiting; sleep 2; done] containers: - name: gateway image: node63:5000/ruoyi-gateway:1.0 args: [--spring.profiles.activek8s] ports: - containerPort: 8080 readinessProbe: httpGet: path: /actuator/health port: 8080 initialDelaySeconds: 30 periodSeconds: 103.3 服务暴露配置根据不同服务的访问需求采用不同的Service类型服务类型Service类型访问方式示例内部服务ClusterIP集群内部DNS名称ry-cloud-mysql-service管理界面LoadBalancer外部IP端口192.168.10.241:8848前端访问NodePort节点IP固定端口node60:90004. 部署流程与优化4.1 分阶段部署策略为确保服务依赖关系建议按以下顺序部署基础设施层kubectl apply -f 1_ry-cloud-mysql.yml kubectl apply -f 2_ry-cloud-redis.yml中间件层kubectl apply -f 3_ry-cloud-nacos.yml kubectl apply -f 4_ry-cloud-sentinel.yml kubectl apply -f 5_ry-cloud-minio.yml业务服务层kubectl apply -f ry-cloud-backend.yml接入层kubectl apply -f ry-cloud-fronted.yml4.2 健康检查与就绪探针为关键服务添加健康检查配置livenessProbe: httpGet: path: /actuator/health port: 8080 initialDelaySeconds: 120 periodSeconds: 10 readinessProbe: httpGet: path: /actuator/health/readiness port: 8080 initialDelaySeconds: 30 periodSeconds: 54.3 资源限制与调度优化通过资源请求和限制保证服务质量resources: requests: memory: 512Mi cpu: 500m limits: memory: 1Gi cpu: 1使用节点亲和性控制Pod分布affinity: nodeAffinity: requiredDuringSchedulingIgnoredDuringExecution: nodeSelectorTerms: - matchExpressions: - key: kubernetes.io/hostname operator: NotIn values: - node605. 运维与监控5.1 日志收集方案建议采用EFK栈进行日志收集配置Fluentd DaemonSet收集节点日志使用Elasticsearch存储日志数据通过Kibana提供查询界面5.2 监控指标采集Prometheus监控配置示例- job_name: ruoyi-services metrics_path: /actuator/prometheus kubernetes_sd_configs: - role: pod relabel_configs: - source_labels: [__meta_kubernetes_pod_annotation_prometheus_io_scrape] action: keep regex: true5.3 常见问题排查镜像拉取失败kubectl describe pod [pod-name] | grep -A 10 Events服务启动顺序问题kubectl logs [pod-name] -c [init-container-name]资源不足kubectl describe nodes | grep -A 10 Allocatable6. 生产环境进阶建议6.1 高可用架构MySQL配置主从复制Sentinel自动故障转移Redis部署Redis Cluster模式MinIO使用分布式模式部署多个节点6.2 持续交付流水线建议CI/CD流程代码提交触发镜像构建扫描镜像漏洞部署到测试环境验证蓝绿部署到生产环境6.3 安全加固措施为每个服务配置独立的ServiceAccount使用NetworkPolicy限制Pod间通信定期轮换Secret和ConfigMap中的敏感信息在实际项目中我们通过逐步验证的方式确保每个组件稳定运行。特别是在服务依赖管理方面initContainer模式能有效解决启动顺序问题。对于有状态服务建议在生产环境使用云厂商提供的持久化存储方案而非hostPath方式。