30分钟上线!ruoyi-vue-pro云原生部署实战:从Docker到K8s的无缝迁移
30分钟上线!ruoyi-vue-pro云原生部署实战:从Docker到K8s的无缝迁移
你还在为传统部署的繁琐流程头疼吗?服务器配置冲突、环境依赖复杂、扩缩容困难...这些问题是否让你错失业务良机?本文将带你基于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集群和应用:
- 部署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
- 为应用添加Prometheus监控注解:
# 在Deployment中添加
annotations:
prometheus.io/scrape: "true"
prometheus.io/path: "/actuator/prometheus"
prometheus.io/port: "48080"
- 导入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。
解决方案:
- 检查StorageClass:
kubectl get sc - 创建默认StorageClass(根据你的K8s环境)
- 或者指定具体的StorageClass在PVC中
网络访问问题
如果无法通过Ingress访问应用,可按以下步骤排查:
- 检查Ingress控制器是否运行:
kubectl get pods -n ingress-nginx - 检查Ingress规则是否正确:
kubectl describe ingress <ingress-name> -n ruoyi-vue-pro - 检查服务是否正常:
kubectl port-forward service/yudao-server 48080:80 -n ruoyi-vue-pro
总结与下一步
通过本文的步骤,我们实现了ruoyi-vue-pro项目的云原生部署,包括Docker镜像构建、Kubernetes资源配置、部署流程自动化和监控配置。这使得系统具备了弹性伸缩、高可用、环境一致性等企业级特性。
后续优化建议
- 实施GitOps:使用ArgoCD或Flux实现声明式GitOps部署
- 服务网格集成:引入Istio实现更细粒度的流量管理和安全控制
- 自动扩缩容:配置HPA(Horizontal Pod Autoscaler)实现基于指标的自动扩缩容
- 多环境管理:使用Helm实现多环境配置管理
学习资源推荐
- 项目官方文档:README.md
- Docker部署指南:script/docker/Docker-HOWTO.md
- Kubernetes官方文档:https://kubernetes.io/docs/home/
- Spring Boot容器化最佳实践:yudao-framework/yudao-spring-boot-starter-web
希望本文能帮助你顺利实现ruoyi-vue-pro的云原生部署。如果觉得本文对你有帮助,请点赞收藏,并关注项目获取更多更新!
下一篇文章我们将介绍如何基于ruoyi-vue-pro实现微服务拆分,敬请期待!
更多推荐

所有评论(0)