30分钟上线!ruoyi-vue-pro云原生部署实战:从Docker到K8s的无缝迁移

【免费下载链接】ruoyi-vue-pro 🔥 官方推荐 🔥 RuoYi-Vue 全新 Pro 版本,优化重构所有功能。基于 Spring Boot + MyBatis Plus + Vue & Element 实现的后台管理系统 + 微信小程序,支持 RBAC 动态权限、数据权限、SaaS 多租户、Flowable 工作流、三方登录、支付、短信、商城、CRM、ERP、AI 大模型等功能。你的 ⭐️ Star ⭐️,是作者生发的动力! 【免费下载链接】ruoyi-vue-pro 项目地址: https://gitcode.com/GitHub_Trending/ruoy/ruoyi-vue-pro

你还在为传统部署的繁琐流程头疼吗?服务器配置冲突、环境依赖复杂、扩缩容困难...这些问题是否让你错失业务良机?本文将带你基于ruoyi-vue-pro项目,从零开始实现云原生部署,30分钟内完成从代码到服务的全流程,让你的应用具备弹性伸缩、高可用的企业级能力。

读完本文你将掌握:

  • Docker镜像构建的最佳实践
  • Kubernetes资源配置方案
  • 多环境部署的自动化流程
  • 服务健康检查与监控配置

为什么选择云原生部署?

传统部署方式存在诸多痛点:环境一致性难以保证、部署流程繁琐、扩展能力有限。而云原生架构通过容器化技术,将应用及其依赖打包成标准化单元,实现了环境无关性和快速扩缩容。

ruoyi-vue-pro作为一款功能全面的后台管理系统,支持RBAC动态权限、数据权限、SaaS多租户等企业级特性,其云原生部署方案具有以下优势:

  • 环境一致性:通过Docker容器确保开发、测试、生产环境一致
  • 弹性伸缩:基于Kubernetes实现流量高峰自动扩容,低谷自动缩容
  • 高可用性:多副本部署结合健康检查,确保服务持续可用
  • 自动化运维:简化部署流程,减少人工操作失误

项目已提供完整的Docker部署支持,我们可以在此基础上扩展Kubernetes部署能力。相关Docker配置文件可参考:script/docker/Docker-HOWTO.md

环境准备与前置条件

在开始部署前,请确保你的环境满足以下要求:

软件/工具 版本要求 用途
Docker 20.10+ 容器化应用
Docker Compose v2+ 本地测试容器编排
Kubernetes 1.21+ 容器编排平台
kubectl 与K8s版本匹配 K8s命令行工具
Maven 3.6+ 项目构建
Git 2.30+ 代码管理

基础环境检查

# 检查Docker版本
docker --version

# 检查Kubernetes集群状态
kubectl get nodes

# 检查Maven版本
mvn --version

如果你的环境尚未准备好Kubernetes集群,可以使用Minikube或Kind搭建本地测试环境:

# 使用Minikube启动单节点K8s集群
minikube start --driver=docker --memory=4096 --cpus=2

Docker镜像构建与优化

ruoyi-vue-pro项目已提供Docker构建相关配置,我们需要基于现有配置进行优化,以适应Kubernetes环境。

项目Docker结构

项目的Docker相关文件组织如下:

script/docker/
├── Docker-HOWTO.md          # Docker部署文档
├── docker-compose.yml       # Docker Compose配置
├── docker.env               # 环境变量配置
├── yudao-server/            # 后端服务Dockerfile
└── yudao-ui-admin/          # 前端UI Dockerfile

后端服务镜像构建

后端服务Dockerfile位于script/docker/yudao-server/Dockerfile,我们需要确保构建出的镜像满足以下要求:

  • 精简基础镜像
  • 合理分层,提高缓存利用率
  • 非root用户运行
  • 健康检查配置

优化后的构建命令:

# 创建Maven缓存卷,加速构建
docker volume create --name yudao-maven-repo

# 使用Maven容器构建项目
docker run -it --rm --name yudao-maven \
  -v yudao-maven-repo:/root/.m2 \
  -v $PWD:/usr/src/mymaven \
  -w /usr/src/mymaven \
  maven:3.8-openjdk-11 mvn clean package '-Dmaven.test.skip=true'

# 构建后端服务镜像
docker build -t yudao-server:latest -f script/docker/yudao-server/Dockerfile .

前端UI镜像构建

前端UI使用Node.js构建,相关配置位于script/docker/yudao-ui-admin/Dockerfile

# 构建前端镜像
docker build -t yudao-ui-admin:latest -f script/docker/yudao-ui-admin/Dockerfile .

镜像推送至仓库

构建完成后,需要将镜像推送到Kubernetes可访问的镜像仓库。如果使用私有仓库:

# 登录私有仓库
docker login registry.example.com

# 为镜像打标签
docker tag yudao-server:latest registry.example.com/ruoyi-vue-pro/yudao-server:latest
docker tag yudao-ui-admin:latest registry.example.com/ruoyi-vue-pro/yudao-ui-admin:latest

# 推送镜像
docker push registry.example.com/ruoyi-vue-pro/yudao-server:latest
docker push registry.example.com/ruoyi-vue-pro/yudao-ui-admin:latest

如果使用Minikube本地环境,可以直接使用本地镜像:

# 将本地镜像加载到Minikube节点
minikube image load yudao-server:latest
minikube image load yudao-ui-admin:latest

Kubernetes资源配置

Kubernetes使用YAML文件定义资源对象,我们需要为ruoyi-vue-pro创建以下资源:

  • Deployment:管理应用副本
  • Service:暴露服务访问
  • Ingress:HTTP/HTTPS路由
  • ConfigMap:配置管理
  • Secret:敏感信息管理
  • PersistentVolumeClaim:持久化存储

命名空间创建

首先创建独立的命名空间,隔离应用资源:

# ruoyi-namespace.yaml
apiVersion: v1
kind: Namespace
metadata:
  name: ruoyi-vue-pro
  labels:
    name: ruoyi-vue-pro

应用配置:

kubectl apply -f ruoyi-namespace.yaml

数据库与缓存部署

ruoyi-vue-pro需要MySQL和Redis作为依赖服务,在生产环境中建议使用云服务商提供的托管服务。对于测试环境,我们可以使用Kubernetes部署:

# mysql-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: mysql
  namespace: ruoyi-vue-pro
spec:
  replicas: 1
  selector:
    matchLabels:
      app: mysql
  template:
    metadata:
      labels:
        app: mysql
    spec:
      containers:
      - name: mysql
        image: mysql:8
        ports:
        - containerPort: 3306
        env:
        - name: MYSQL_DATABASE
          value: "ruoyi-vue-pro"
        - name: MYSQL_ROOT_PASSWORD
          valueFrom:
            secretKeyRef:
              name: mysql-secrets
              key: root-password
        volumeMounts:
        - name: mysql-data
          mountPath: /var/lib/mysql
        - name: init-sql
          mountPath: /docker-entrypoint-initdb.d
      volumes:
      - name: mysql-data
        persistentVolumeClaim:
          claimName: mysql-pvc
      - name: init-sql
        configMap:
          name: mysql-init-sql

完整的MySQL和Redis部署配置可参考项目的Docker Compose配置:script/docker/docker-compose.yml

后端服务部署

后端服务部署配置示例:

# server-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: yudao-server
  namespace: ruoyi-vue-pro
spec:
  replicas: 2  # 部署2个副本保证高可用
  selector:
    matchLabels:
      app: yudao-server
  strategy:
    rollingUpdate:
      maxSurge: 1
      maxUnavailable: 0
    type: RollingUpdate
  template:
    metadata:
      labels:
        app: yudao-server
    spec:
      containers:
      - name: yudao-server
        image: yudao-server:latest  # 替换为你的镜像地址
        ports:
        - containerPort: 48080
        env:
        - name: SPRING_PROFILES_ACTIVE
          value: "production"
        - name: MYSQL_HOST
          value: "mysql"
        - name: MYSQL_PORT
          value: "3306"
        - name: MYSQL_DATABASE
          value: "ruoyi-vue-pro"
        - name: MYSQL_USERNAME
          valueFrom:
            secretKeyRef:
              name: mysql-secrets
              key: username
        - name: MYSQL_PASSWORD
          valueFrom:
            secretKeyRef:
              name: mysql-secrets
              key: password
        - name: REDIS_HOST
          value: "redis"
        - name: REDIS_PORT
          value: "6379"
        resources:
          requests:
            memory: "512Mi"
            cpu: "500m"
          limits:
            memory: "1Gi"
            cpu: "1000m"
        livenessProbe:
          httpGet:
            path: /actuator/health/liveness
            port: 48080
          initialDelaySeconds: 60
          periodSeconds: 10
        readinessProbe:
          httpGet:
            path: /actuator/health/readiness
            port: 48080
          initialDelaySeconds: 30
          periodSeconds: 5

服务暴露与Ingress配置

创建Service暴露后端服务:

# server-service.yaml
apiVersion: v1
kind: Service
metadata:
  name: yudao-server
  namespace: ruoyi-vue-pro
spec:
  selector:
    app: yudao-server
  ports:
  - port: 80
    targetPort: 48080
  type: ClusterIP

前端服务类似配置,然后通过Ingress配置HTTP路由:

# ingress.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: ruoyi-vue-pro-ingress
  namespace: ruoyi-vue-pro
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /
    nginx.ingress.kubernetes.io/ssl-redirect: "false"
spec:
  rules:
  - host: ruoyi.example.com  # 替换为你的域名
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: yudao-ui-admin
            port:
              number: 80
      - path: /prod-api
        pathType: Prefix
        backend:
          service:
            name: yudao-server
            port:
              number: 80

部署流程自动化

为提高部署效率,我们可以基于项目现有的部署脚本,扩展Kubernetes部署能力。

部署脚本分析

项目已提供一个shell部署脚本script/shell/deploy.sh,该脚本实现了备份、停止、部署、启动、健康检查等功能。我们可以借鉴其逻辑,实现Kubernetes环境的部署脚本。

Kubernetes部署脚本

创建一个Kubernetes部署脚本k8s-deploy.sh

#!/bin/bash
set -e

# 环境配置
NAMESPACE="ruoyi-vue-pro"
REPO="registry.example.com/ruoyi-vue-pro"
VERSION="latest"

# 构建镜像
build_images() {
  echo "[build] 开始构建后端服务镜像..."
  docker build -t $REPO/yudao-server:$VERSION -f script/docker/yudao-server/Dockerfile .
  
  echo "[build] 开始构建前端服务镜像..."
  docker build -t $REPO/yudao-ui-admin:$VERSION -f script/docker/yudao-ui-admin/Dockerfile .
  
  # 推送镜像
  echo "[build] 推送镜像到仓库..."
  docker push $REPO/yudao-server:$VERSION
  docker push $REPO/yudao-ui-admin:$VERSION
}

# 部署Kubernetes资源
deploy_k8s() {
  echo "[deploy] 部署数据库和缓存..."
  kubectl apply -f k8s/mysql/ -n $NAMESPACE
  kubectl apply -f k8s/redis/ -n $NAMESPACE
  
  # 等待数据库就绪
  echo "[deploy] 等待数据库就绪..."
  kubectl wait --for=condition=ready pod -l app=mysql -n $NAMESPACE --timeout=300s
  
  echo "[deploy] 部署后端服务..."
  sed "s|IMAGE_REPO|$REPO|g; s|IMAGE_TAG|$VERSION|g" k8s/server/deployment.yaml | kubectl apply -f - -n $NAMESPACE
  
  echo "[deploy] 部署前端服务..."
  sed "s|IMAGE_REPO|$REPO|g; s|IMAGE_TAG|$VERSION|g" k8s/ui/deployment.yaml | kubectl apply -f - -n $NAMESPACE
  
  echo "[deploy] 部署Ingress..."
  kubectl apply -f k8s/ingress.yaml -n $NAMESPACE
}

# 检查部署状态
check_status() {
  echo "[status] 检查部署状态..."
  kubectl get pods -n $NAMESPACE
  
  echo "[status] 检查服务状态..."
  kubectl get services -n $NAMESPACE
  
  echo "[status] 检查Ingress状态..."
  kubectl get ingress -n $NAMESPACE
}

# 主流程
main() {
  build_images
  deploy_k8s
  check_status
  
  echo "[success] 部署完成!"
  echo "[success] 访问地址: http://$(kubectl get ingress ruoyi-vue-pro-ingress -n $NAMESPACE -o jsonpath='{.spec.rules[0].host}')"
}

main

CI/CD集成建议

为实现完全自动化部署,建议将部署流程集成到CI/CD管道中。以Jenkins为例,可以创建一个Pipeline任务,配置如下:

pipeline {
  agent any
  
  stages {
    stage('Checkout') {
      steps {
        git url: 'https://gitcode.com/GitHub_Trending/ruoy/ruoyi-vue-pro.git', branch: 'master'
      }
    }
    
    stage('Build & Test') {
      steps {
        sh 'mvn clean package -Dmaven.test.skip=true'
      }
    }
    
    stage('Build & Push Images') {
      steps {
        sh './k8s-deploy.sh build_images'
      }
    }
    
    stage('Deploy to K8s') {
      steps {
        sh './k8s-deploy.sh deploy_k8s'
      }
    }
    
    stage('Verify Deployment') {
      steps {
        sh './k8s-deploy.sh check_status'
      }
    }
  }
}

项目中已提供Jenkins配置文件,可参考script/jenkins/Jenkinsfile进行集成。

健康检查与监控配置

确保服务稳定运行的关键是配置合理的健康检查和监控。

应用健康检查

ruoyi-vue-pro已集成Spring Boot Actuator,可提供健康检查端点。在Kubernetes部署中,我们已配置以下健康检查:

  • 存活探针(Liveness Probe):检测应用是否运行正常,失败会重启容器
  • 就绪探针(Readiness Probe):检测应用是否准备好接收请求,失败会从服务中移除

相关配置已在Deployment中体现,对应代码实现可查看项目的健康检查配置:

// 健康检查配置类位于yudao-framework中
// yudao-framework/yudao-spring-boot-starter-web/src/main/java/cn/iocoder/yudao/framework/web/config/WebAutoConfiguration.java

监控指标集成

推荐使用Prometheus + Grafana监控Kubernetes集群和应用:

  1. 部署Prometheus和Grafana:
# 使用Helm部署
helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
helm install prometheus prometheus-community/kube-prometheus-stack -n monitoring --create-namespace
  1. 为应用添加Prometheus监控注解:
# 在Deployment中添加
annotations:
  prometheus.io/scrape: "true"
  prometheus.io/path: "/actuator/prometheus"
  prometheus.io/port: "48080"
  1. 导入Grafana仪表盘,监控JVM指标和应用性能。

常见问题与解决方案

服务启动失败

如果后端服务启动失败,可通过以下步骤排查:

# 查看Pod日志
kubectl logs -f <pod-name> -n ruoyi-vue-pro

# 查看容器详细信息
kubectl describe pod <pod-name> -n ruoyi-vue-pro

常见原因及解决方法:

  • 数据库连接失败:检查数据库服务是否正常,连接参数是否正确
  • 资源不足:调整Pod的资源请求和限制
  • 配置错误:检查ConfigMap和Secret配置

持久化存储问题

Kubernetes持久化存储配置较为复杂,如遇到PVC一直处于Pending状态,可能是因为没有可用的StorageClass。

解决方案:

  1. 检查StorageClass:kubectl get sc
  2. 创建默认StorageClass(根据你的K8s环境)
  3. 或者指定具体的StorageClass在PVC中

网络访问问题

如果无法通过Ingress访问应用,可按以下步骤排查:

  1. 检查Ingress控制器是否运行:kubectl get pods -n ingress-nginx
  2. 检查Ingress规则是否正确:kubectl describe ingress <ingress-name> -n ruoyi-vue-pro
  3. 检查服务是否正常:kubectl port-forward service/yudao-server 48080:80 -n ruoyi-vue-pro

总结与下一步

通过本文的步骤,我们实现了ruoyi-vue-pro项目的云原生部署,包括Docker镜像构建、Kubernetes资源配置、部署流程自动化和监控配置。这使得系统具备了弹性伸缩、高可用、环境一致性等企业级特性。

后续优化建议

  1. 实施GitOps:使用ArgoCD或Flux实现声明式GitOps部署
  2. 服务网格集成:引入Istio实现更细粒度的流量管理和安全控制
  3. 自动扩缩容:配置HPA(Horizontal Pod Autoscaler)实现基于指标的自动扩缩容
  4. 多环境管理:使用Helm实现多环境配置管理

学习资源推荐

希望本文能帮助你顺利实现ruoyi-vue-pro的云原生部署。如果觉得本文对你有帮助,请点赞收藏,并关注项目获取更多更新!

下一篇文章我们将介绍如何基于ruoyi-vue-pro实现微服务拆分,敬请期待!

【免费下载链接】ruoyi-vue-pro 🔥 官方推荐 🔥 RuoYi-Vue 全新 Pro 版本,优化重构所有功能。基于 Spring Boot + MyBatis Plus + Vue & Element 实现的后台管理系统 + 微信小程序,支持 RBAC 动态权限、数据权限、SaaS 多租户、Flowable 工作流、三方登录、支付、短信、商城、CRM、ERP、AI 大模型等功能。你的 ⭐️ Star ⭐️,是作者生发的动力! 【免费下载链接】ruoyi-vue-pro 项目地址: https://gitcode.com/GitHub_Trending/ruoy/ruoyi-vue-pro

更多推荐