首页
/ RuoYi-Cloud-Plus云原生:K8s部署完全指南

RuoYi-Cloud-Plus云原生:K8s部署完全指南

2026-02-04 04:34:11作者:侯霆垣

概述

RuoYi-Cloud-Plus是基于Spring Cloud Alibaba的微服务权限管理系统,采用云原生架构设计。本文将详细介绍如何将RuoYi-Cloud-Plus部署到Kubernetes集群中,实现真正的云原生部署。

架构设计

微服务架构图

flowchart TD
    A[用户请求] --> B[Ingress/Nginx]
    B --> C[Gateway服务]
    C --> D[Auth认证服务]
    C --> E[System系统服务]
    C --> F[Gen代码生成服务]
    C --> G[Resource资源服务]
    C --> H[Workflow工作流服务]
    
    I[Nacos注册中心] --> C
    I --> D
    I --> E
    I --> F
    I --> G
    I --> H
    
    J[Redis缓存] --> C
    K[MySQL数据库] --> C
    L[MinIO存储] --> C

核心组件依赖关系

组件 作用 部署方式
Nacos 服务注册与配置中心 StatefulSet
MySQL 关系型数据库 StatefulSet
Redis 缓存数据库 StatefulSet
MinIO 对象存储 Deployment
Gateway API网关 Deployment
业务服务 各微服务模块 Deployment

环境准备

系统要求

资源类型 最低配置 推荐配置
Kubernetes版本 v1.20+ v1.24+
CPU 4核 8核
内存 8GB 16GB
存储 50GB 100GB
节点数 3个 5个

工具准备

# 必需工具
kubectl version --client
helm version
docker version

# 可选工具
k9s -  Kubernetes CLI管理工具
lens - Kubernetes图形化管理工具

Docker镜像构建

多阶段构建优化

# 构建阶段
FROM bellsoft/liberica-openjdk-rocky:17.0.15 as builder
WORKDIR /app
COPY . .
RUN ./mvnw clean package -DskipTests

# 运行阶段
FROM bellsoft/liberica-openjdk-rocky:17.0.15-cds
LABEL maintainer="RuoYi-Cloud-Plus Team"

RUN mkdir -p /ruoyi/logs /ruoyi/temp /ruoyi/skywalking/agent

WORKDIR /ruoyi
ENV SERVER_PORT=8080 LANG=C.UTF-8 LC_ALL=C.UTF-8
EXPOSE ${SERVER_PORT}

COPY --from=builder /app/target/*.jar ./app.jar

ENTRYPOINT java -Djava.security.egd=file:/dev/./urandom \
           -Dserver.port=${SERVER_PORT} \
           -XX:+HeapDumpOnOutOfMemoryError \
           -XX:+UseZGC \
           ${JAVA_OPTS} \
           -jar app.jar

镜像构建脚本

#!/bin/bash

# 构建所有服务镜像
SERVICES=("gateway" "auth" "system" "gen" "resource" "workflow")

for service in "${SERVICES[@]}"; do
    echo "构建 ruoyi-${service} 镜像..."
    docker build -t ruoyi/${service}:2.4.1 -f ruoyi-${service}/Dockerfile .
done

# 推送到镜像仓库
for service in "${SERVICES[@]}"; do
    docker tag ruoyi/${service}:2.4.1 registry.example.com/ruoyi/${service}:2.4.1
    docker push registry.example.com/ruoyi/${service}:2.4.1
done

Kubernetes部署配置

Namespace配置

apiVersion: v1
kind: Namespace
metadata:
  name: ruoyi-cloud
  labels:
    name: ruoyi-cloud
    environment: production

ConfigMap配置

apiVersion: v1
kind: ConfigMap
metadata:
  name: ruoyi-common-config
  namespace: ruoyi-cloud
data:
  application-common.yml: |
    spring:
      cloud:
        nacos:
          discovery:
            server-addr: nacos.ruoyi-cloud.svc.cluster.local:8848
          config:
            server-addr: nacos.ruoyi-cloud.svc.cluster.local:8848
      datasource:
        dynamic:
          primary: master
          strict: false
          datasource:
            master:
              url: jdbc:mysql://mysql.ruoyi-cloud.svc.cluster.local:3306/ry-cloud
              username: root
              password: ruoyi123
              driver-class-name: com.mysql.cj.jdbc.Driver
      redis:
        host: redis.ruoyi-cloud.svc.cluster.local
        port: 6379
        database: 0

Gateway服务部署

apiVersion: apps/v1
kind: Deployment
metadata:
  name: ruoyi-gateway
  namespace: ruoyi-cloud
  labels:
    app: ruoyi-gateway
spec:
  replicas: 2
  selector:
    matchLabels:
      app: ruoyi-gateway
  template:
    metadata:
      labels:
        app: ruoyi-gateway
    spec:
      containers:
      - name: ruoyi-gateway
        image: registry.example.com/ruoyi/gateway:2.4.1
        ports:
        - containerPort: 8080
        env:
        - name: JAVA_OPTS
          value: "-Xms512m -Xmx1024m"
        - name: SPRING_PROFILES_ACTIVE
          value: "prod"
        resources:
          requests:
            memory: "512Mi"
            cpu: "250m"
          limits:
            memory: "1024Mi"
            cpu: "500m"
        livenessProbe:
          httpGet:
            path: /actuator/health
            port: 8080
          initialDelaySeconds: 60
          periodSeconds: 10
        readinessProbe:
          httpGet:
            path: /actuator/health
            port: 8080
          initialDelaySeconds: 30
          periodSeconds: 5
---
apiVersion: v1
kind: Service
metadata:
  name: ruoyi-gateway
  namespace: ruoyi-cloud
spec:
  selector:
    app: ruoyi-gateway
  ports:
  - port: 8080
    targetPort: 8080
  type: ClusterIP

Nacos StatefulSet配置

apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: nacos
  namespace: ruoyi-cloud
spec:
  serviceName: "nacos"
  replicas: 3
  selector:
    matchLabels:
      app: nacos
  template:
    metadata:
      labels:
        app: nacos
    spec:
      containers:
      - name: nacos
        image: nacos/nacos-server:2.2.0
        ports:
        - containerPort: 8848
          name: client
        - containerPort: 9848
          name: raft
        - containerPort: 9849
          name: metrics
        env:
        - name: MODE
          value: "cluster"
        - name: PREFER_HOST_MODE
          value: "hostname"
        - name: NACOS_SERVERS
          value: "nacos-0.nacos.ruoyi-cloud.svc.cluster.local:8848 nacos-1.nacos.ruoyi-cloud.svc.cluster.local:8848 nacos-2.nacos.ruoyi-cloud.svc.cluster.local:8848"
        volumeMounts:
        - name: nacos-data
          mountPath: /home/nacos/data
        - name: nacos-logs
          mountPath: /home/nacos/logs
  volumeClaimTemplates:
  - metadata:
      name: nacos-data
    spec:
      accessModes: [ "ReadWriteOnce" ]
      storageClassName: "nfs-storage"
      resources:
        requests:
          storage: 10Gi

数据库部署

MySQL StatefulSet

apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: mysql
  namespace: ruoyi-cloud
spec:
  serviceName: mysql
  replicas: 1
  selector:
    matchLabels:
      app: mysql
  template:
    metadata:
      labels:
        app: mysql
    spec:
      containers:
      - name: mysql
        image: mysql:8.0.42
        env:
        - name: MYSQL_ROOT_PASSWORD
          value: "ruoyi123"
        - name: MYSQL_DATABASE
          value: "ry-cloud"
        - name: TZ
          value: "Asia/Shanghai"
        ports:
        - containerPort: 3306
        volumeMounts:
        - name: mysql-data
          mountPath: /var/lib/mysql
        - name: mysql-config
          mountPath: /etc/mysql/conf.d
        resources:
          requests:
            memory: "1Gi"
            cpu: "500m"
          limits:
            memory: "2Gi"
            cpu: "1"
        livenessProbe:
          exec:
            command: ["mysqladmin", "ping", "-h", "localhost"]
          initialDelaySeconds: 30
          periodSeconds: 10
        readinessProbe:
          exec:
            command: ["mysql", "-uroot", "-pruoyi123", "-e", "SELECT 1"]
          initialDelaySeconds: 5
          periodSeconds: 5
      volumes:
      - name: mysql-config
        configMap:
          name: mysql-config
  volumeClaimTemplates:
  - metadata:
      name: mysql-data
    spec:
      accessModes: [ "ReadWriteOnce" ]
      storageClassName: "ssd-storage"
      resources:
        requests:
          storage: 20Gi

网络配置

Ingress配置

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: ruoyi-ingress
  namespace: ruoyi-cloud
  annotations:
    nginx.ingress.kubernetes.io/proxy-body-size: "50m"
    nginx.ingress.kubernetes.io/ssl-redirect: "false"
    nginx.ingress.kubernetes.io/rewrite-target: /$2
spec:
  ingressClassName: nginx
  rules:
  - host: ruoyi.example.com
    http:
      paths:
      - path: /(/|$)(.*)
        pathType: Prefix
        backend:
          service:
            name: ruoyi-gateway
            port:
              number: 8080

监控与日志

Prometheus监控配置

apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
  name: ruoyi-services
  namespace: ruoyi-cloud
  labels:
    release: prometheus
spec:
  selector:
    matchLabels:
      app.kubernetes.io/part-of: ruoyi-cloud
  namespaceSelector:
    matchNames:
    - ruoyi-cloud
  endpoints:
  - port: http
    interval: 30s
    path: /actuator/prometheus

应用性能监控

# SkyWalking Sidecar注入
apiVersion: apps/v1
kind: Deployment
metadata:
  name: ruoyi-system
  namespace: ruoyi-cloud
spec:
  template:
    spec:
      containers:
      - name: ruoyi-system
        # ... 其他配置
        env:
        - name: SW_AGENT_NAME
          value: "ruoyi-system"
        - name: SW_AGENT_COLLECTOR_BACKEND_SERVICES
          value: "skywalking-oap.skywalking.svc.cluster.local:11800"

部署流程

自动化部署脚本

#!/bin/bash

set -e

# 定义颜色输出
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
NC='\033[0m'

echo -e "${GREEN}开始部署 RuoYi-Cloud-Plus 到 Kubernetes...${NC}"

# 创建命名空间
kubectl apply -f namespace.yaml

# 部署基础设施
echo -e "${YELLOW}部署基础设施组件...${NC}"
kubectl apply -f mysql/
kubectl apply -f redis/
kubectl apply -f nacos/

# 等待基础设施就绪
echo -e "${YELLOW}等待基础设施就绪...${NC}"
kubectl wait --for=condition=ready pod -l app=mysql -n ruoyi-cloud --timeout=300s
kubectl wait --for=condition=ready pod -l app=nacos -n ruoyi-cloud --timeout=300s

# 初始化数据库
echo -e "${YELLOW}初始化数据库...${NC}"
kubectl exec -it $(kubectl get pod -l app=mysql -n ruoyi-cloud -o jsonpath='{.items[0].metadata.name}') \
  -- mysql -uroot -pruoyi123 ry-cloud < sql/ry-cloud.sql

# 部署业务服务
echo -e "${YELLOW}部署业务服务...${NC}"
kubectl apply -f gateway/
kubectl apply -f auth/
kubectl apply -f system/
kubectl apply -f gen/
kubectl apply -f resource/
kubectl apply -f workflow/

# 部署网络配置
echo -e "${YELLOW}部署网络配置...${NC}"
kubectl apply -f ingress/

echo -e "${GREEN}部署完成!${NC}"
echo -e "访问地址: http://ruoyi.example.com"
echo -e "Nacos控制台: http://nacos.ruoyi-cloud.svc.cluster.local:8848/nacos"

故障排除

常见问题及解决方案

问题现象 可能原因 解决方案
服务无法注册到Nacos 网络策略限制 检查NetworkPolicy配置
数据库连接失败 服务发现问题 验证DNS解析和Service配置
内存不足 JVM配置不当 调整JVM参数和资源限制
启动超时 依赖服务未就绪 添加initContainer等待依赖

健康检查命令

# 检查所有Pod状态
kubectl get pods -n ruoyi-cloud -o wide

# 查看服务日志
kubectl logs -f deployment/ruoyi-gateway -n ruoyi-cloud

# 检查服务发现
kubectl exec -it deployment/ruoyi-gateway -n ruoyi-cloud -- curl nacos:8848

# 监控资源使用
kubectl top pods -n ruoyi-cloud

最佳实践

1. 资源优化配置

# 资源请求和限制配置示例
resources:
  requests:
    memory: "512Mi"
    cpu: "250m"
  limits:
    memory: "1024Mi" 
    cpu: "500m"

2. 高可用性设计

# 多副本部署
replicas: 3
# 反亲和性配置
affinity:
  podAntiAffinity:
    preferredDuringSchedulingIgnoredDuringExecution:
    - weight: 100
      podAffinityTerm:
        labelSelector:
          matchExpressions:
          - key: app
            operator: In
            values:
            - ruoyi-gateway
        topologyKey: kubernetes.io/hostname

3. 安全配置

# 安全上下文
securityContext:
  runAsNonRoot: true
  runAsUser: 1000
  runAsGroup: 1000
  readOnlyRootFilesystem: true
  capabilities:
    drop:
    - ALL

总结

通过本文的详细指导,您可以成功将RuoYi-Cloud-Plus部署到Kubernetes集群中。云原生部署不仅提供了更好的弹性和可扩展性,还大大简化了运维复杂度。建议在生产环境中结合CI/CD流水线实现自动化部署,并配置完善的监控告警体系。

记住,成功的K8s部署不仅仅是技术的实现,更是对架构设计、资源规划、安全策略和运维流程的综合考量。

登录后查看全文
热门项目推荐
相关项目推荐