RuoYi Cloud 微服务迁移上Kubernetes私有云综合案例

 

 

迁移流程和环境准备

应用迁移至Kubernetes的流程

  • 熟悉业务流程和组件依赖
  • 制作业务容器镜像
  • 准备相关资源:CM/Secret/RBAC/数据持久化
  • 准备相关依赖服务: MySQL/Redis/MQ/OSS/Nacos/Sentinel等
  • 准备工作负载的资源用于创建和管理应用Pod
  • 准备相关应用的SVC 暴露应用
  • Ingress 对外发布应用
  • 可观测性实现


环境准备

  • kubernetes 每个节点内存至少8G
  • 提供动态PV置备的StorageClass名称为sc-nfs
  • 部署MetalLB提供LoadBalancer Service
  • 部署ingress-nginx

192.168.3.60 master

192.168.3.63 node 

 

部署 Redis

kubectl create ns ruoyi

git clone https://gitee.com/lbtooth/RuoYi-Cloud.git

cd RuoYi-Cloud/kubernetes/redis/

pwd

/root/RuoYi-Cloud/kubernetes-Cloud/kubernetes/redis

[root@master1 redis]# ls
00-namespace.yaml  01-redis-configmap.yaml  02-redis-headless-svc.yaml  03-redis-external-svc.yaml  04-redis-pvc.yaml  05-redis-statefulset.yaml

 

kubectl apply -f .

kubectl get pod,svc,pvc -n ruoyi

 

[root@master1 redis]# kubectl get pod,svc,pvc -n ruoyi 
NAME          READY   STATUS    RESTARTS   AGE
pod/redis-0   0/1     Running   0          28s

NAME                     TYPE           CLUSTER-IP     EXTERNAL-IP    PORT(S)          AGE
service/redis-external   LoadBalancer   10.97.15.141   192.168.3.11   6379:30079/TCP   28s
service/redis-headless   ClusterIP      None           <none>         6379/TCP         28s

NAME                              STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS   VOLUMEATTRIBUTESCLASS   AGE
persistentvolumeclaim/redis-pvc   Bound    pvc-efab4a3b-6da7-4bb6-92d6-b9ab8f84b352   20Gi       RWO            sc-nfs         <unset>                 28s
[root@master1 redis]# 

#测试访问

dnf install redis -y

redis-cli -h 192.168.3.11

auth 123456

keys *

 

部署 Sentinel Dashboard

cd /root/RuoYi-Cloud/kubernetes/sentinel

 

kubectl apply -f ./

kubectl get pod,svc -n ruoyi

oot@master1 sentinel]# kubectl get pod,svc -n ruoyi
NAME                                      READY   STATUS    RESTARTS   AGE
pod/redis-0                               1/1     Running   0          12m
pod/sentinel-dashboard-5f5cdd79fb-4mn7k   1/1     Running   0          56s

NAME                        TYPE           CLUSTER-IP      EXTERNAL-IP    PORT(S)          AGE
service/redis-external      LoadBalancer   10.97.15.141    192.168.3.11   6379:30079/TCP   12m
service/redis-headless      ClusterIP      None            <none>         6379/TCP         12m
service/sentinel-external   LoadBalancer   10.99.140.232   192.168.3.12   8080:30888/TCP   56s

 

#根据上面SVC地址,浏览器登录,用户名和密码都是sentinel

http://192.168.3.12:8080

 

部署 MySQL

cd /root/RuoYi-Cloud/kubernetes/mysql

kubectl apply -f .

kubectl get pod,svc,pvc,pv -n ruoyi 

 

root@master1 mysql]# kubectl get pod,svc,pvc,pv -n ruoyi 
NAME                                      READY   STATUS    RESTARTS   AGE
pod/mysql-0                               1/1     Running   0          2m5s
pod/redis-0                               1/1     Running   0          17m
pod/sentinel-dashboard-5f5cdd79fb-4mn7k   1/1     Running   0          5m37s

NAME                        TYPE           CLUSTER-IP       EXTERNAL-IP    PORT(S)          AGE
service/mysql-external      LoadBalancer   10.105.210.128   192.168.3.13   3306:30036/TCP   2m5s
service/mysql-headless      ClusterIP      None             <none>         3306/TCP         2m5s
service/redis-external      LoadBalancer   10.97.15.141     192.168.3.11   6379:30079/TCP   17m
service/redis-headless      ClusterIP      None             <none>         6379/TCP         17m
service/sentinel-external   LoadBalancer   10.99.140.232    192.168.3.12   8080:30888/TCP   5m37s

NAME                              STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS   VOLUMEATTRIBUTESCLASS   AGE
persistentvolumeclaim/mysql-pvc   Bound    pvc-4ce4fac7-3ca4-4bc0-9089-1f6b229fffac   20Gi       RWO            sc-nfs         <unset>                 2m5s
persistentvolumeclaim/redis-pvc   Bound    pvc-efab4a3b-6da7-4bb6-92d6-b9ab8f84b352   20Gi       RWO            sc-nfs         <unset>                 17m

NAME                                                        CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM             STORAGECLASS   VOLUMEATTRIBUTESCLASS   REASON   AGE
persistentvolume/pvc-4ce4fac7-3ca4-4bc0-9089-1f6b229fffac   20Gi       RWO            Delete           Bound    ruoyi/mysql-pvc   sc-nfs         <unset>                          2m5s
persistentvolume/pvc-efab4a3b-6da7-4bb6-92d6-b9ab8f84b352   20Gi       RWO            Delete           Bound    ruoyi/redis-pvc   sc-nfs         <unset>                          17m
[root@master1 mysql]# 
[root@master1 mysql]# 

 

#验证

kubectl exec -it -n ruoyi mysql-0 -- sh

mysql -unacos -p123456     

show databases;

show tables in nacos;

 

kubectl run client-test-$RANDOM --image registry.cn-beijing.aliyuncs.com/wangxiaochun/admin-box:v0.2 --restart=Never --rm -it --command -- /bin/bash
host mysql-headless.ruoyi

root@client-test-28791 /# host mysql-headless.ruoyi
mysql-headless.ruoyi.svc.cluster.local has address 10.244.1.16

 

部署 Nacos 服务发现和配置中心

准备 Nacos 的 MySQL 相关表

Nacos 使用 MySQL 数据库需要准备相关的数据库和表结构

dnf install mysql -y

#连接MySQL对应的SVC,导入表结构

pwd

/root/RuoYi-Cloud/kubernetes/mysql

#连接MySQL对应的SVC,导入表结构

mysql -unacos -p123456 -h192.168.3.13 nacos < ./mysql-schema.sql

#验证表已生成

mysql -unacos -p123456 -h192.168.3.13 nacos -e 'show tables;'

 部署 Nacos

 cd /root/RuoYi-Cloud/kubernetes/nacos

kubectl apply -f ./

kubectl get pod -n ruoyi 

[root@master1 nacos]# kubectl get pod -n ruoyi 
NAME                                  READY   STATUS    RESTARTS      AGE
mysql-0                               1/1     Running   0             16m
nacos-0                               1/1     Running   0             3m13s
nacos-1                               1/1     Running   0             2m15s
nacos-2                               1/1     Running   1 (35s ago)   89s
redis-0                               1/1     Running   0             32m
sentinel-dashboard-5f5cdd79fb-4mn7k   1/1     Running   0             20m

 

 

#测试访问

kubectl run client-test-$RANDOM --image registry.cn-beijing.aliyuncs.com/wangxiaochun/admin-box:v0.2 --restart=Never --rm -it --command -- /bin/bash

host nacos-headless.ruoyi

kubectl get svc -n ruoyi

root@master1 nacos]# kubectl get svc -n ruoyi
NAME                TYPE           CLUSTER-IP       EXTERNAL-IP    PORT(S)                               AGE
mysql-external      LoadBalancer   10.105.210.128   192.168.3.13   3306:30036/TCP                        17m
mysql-headless      ClusterIP      None             <none>         3306/TCP                              17m
nacos-external      LoadBalancer   10.99.162.196    192.168.3.14   8848:30048/TCP                        3m51s
nacos-headless      ClusterIP      None             <none>         8848/TCP,9848/TCP,9849/TCP,7848/TCP   3m51s
redis-external      LoadBalancer   10.97.15.141     192.168.3.11   6379:30079/TCP                        33m
redis-headless      ClusterIP      None             <none>         6379/TCP                              33m
sentinel-external   LoadBalancer   10.99.140.232    192.168.3.12   8080:30888/TCP                        21m

 

#浏览器访问,登录用户和密码: nacos/nacos
http://192.168.3.14:8848/nacos/

 

实现 Nacos 的配置中心

方法2: 配置导入(推荐)

 

 

 

09140f368befb2e9360973a5bb5c5c91

 

50ba66625ecb5bbf3410fd9d67cef1e7

 

 

 

4d3a46f7a1c81f83c40c10bc9a637ef3

 ls -hl nacos_config_export_prod.zip 

#将配置信息导入Prod名称空间

curl --location --request POST 'http://192.168.3.14:8848/nacos/v1/cs/configs?import=true&namespace=prod'     --form 'policy=OVERWRITE' --form 'file=@"./nacos_config_export_prod.zip"'

oot@master1 nacos]# curl --location --request POST 'http://192.168.3.14:8848/nacos/v1/cs/configs?import=true&namespace=prod'     --form 'policy=OVERWRITE' --form 'file=@"./nacos_config_export_prod.zip"'
{"code":200,"message":"导入成功","data":{"succCount":9,"skipCount":0}}[root@master1 nacos]# 

 

 

65cdc85c5e333022349ed092594cc4b8

 

 部署 RuoYi-Cloud 微服务后端 JAVA 应用

准备 RuoYi-Cloud 数据库和表
查看RuoYi-Cloud 微服务需要使用数据库名称的ry-cloud,ry-seata和相关的表

 

#查看数据库SVC地址

[root@master1 nacos]# kubectl get svc -n ruoyi 
NAME                TYPE           CLUSTER-IP       EXTERNAL-IP    PORT(S)                               AGE
mysql-external      LoadBalancer   10.105.210.128   192.168.3.13   3306:30036/TCP                        29m
mysql-headless      ClusterIP      None             <none>         3306/TCP                              29m
nacos-external      LoadBalancer   10.99.162.196    192.168.3.14   8848:30048/TCP                        16m
nacos-headless      ClusterIP      None             <none>         8848/TCP,9848/TCP,9849/TCP,7848/TCP   16m
redis-external      LoadBalancer   10.97.15.141     192.168.3.11   6379:30079/TCP                        45m
redis-headless      ClusterIP      None             <none>         6379/TCP                              45m
sentinel-external   LoadBalancer   10.99.140.232    192.168.3.12   8080:30888/TCP                        33m

 

cd /root

#创建ry-cloud和ry-seata数据库及相关表

mysql -uroot -p123456 -h192.168.3.13

create database `ry-cloud`;

create user ruoyi@'%' identified by '123456';

grant all on `ry-cloud`.* to ruoyi@'%';

use ry-cloud

#导入ry_20231130.sql数据到数据库ry-cloud中

source RuoYi-Cloud/sql/ry_20231130.sql

#导入quartz.sql 调度数据到数据库ry-cloud中

source RuoYi-Cloud/sql/quartz.sql

#导入ry_seata.sql seata 分布式事务到数据库ry-seata中

source RuoYi-Cloud/sql/ry_seata_20210128.sql

show databases;

show tables in `ry-cloud`;

#验证ruoyi用户访问数据库

mysql -uruoyi -p123456 -h192.168.3.13 ry-cloud -e 'show tables'

 

 

 RuoYi-Cloud 微服务 JAVA 服务构建和打包

 

ruoyi-monitor 服务

cd /root/RuoYi-Cloud/kubernetes/java/ruoyi-monitor/

kubectl apply -f ./

kubectl get pod -n ruoyi

[root@master1 ruoyi-monitor]# kubectl get pod -n ruoyi
NAME                                  READY   STATUS    RESTARTS      AGE
mysql-0                               1/1     Running   0             41m
nacos-0                               1/1     Running   0             28m
nacos-1                               1/1     Running   0             27m
nacos-2                               1/1     Running   1 (25m ago)   26m
redis-0                               1/1     Running   0             57m
ruoyi-monitor-746cbbc4b4-5rjxg        1/1     Running   0             2m25s
sentinel-dashboard-5f5cdd79fb-4mn7k   1/1     Running   0             45m

 

kubectl get svc -n ruoyi

oot@master1 ruoyi-monitor]# 
[root@master1 ruoyi-monitor]# kubectl get svc -n ruoyi 
NAME                     TYPE           CLUSTER-IP       EXTERNAL-IP    PORT(S)                               AGE
mysql-external           LoadBalancer   10.105.210.128   192.168.3.13   3306:30036/TCP                        41m
mysql-headless           ClusterIP      None             <none>         3306/TCP                              41m
nacos-external           LoadBalancer   10.99.162.196    192.168.3.14   8848:30048/TCP                        28m
nacos-headless           ClusterIP      None             <none>         8848/TCP,9848/TCP,9849/TCP,7848/TCP   28m
redis-external           LoadBalancer   10.97.15.141     192.168.3.11   6379:30079/TCP                        57m
redis-headless           ClusterIP      None             <none>         6379/TCP                              57m
ruoyi-monitor-external   LoadBalancer   10.96.189.214    192.168.3.15   8080:30010/TCP                        2m33s
sentinel-external        LoadBalancer   10.99.140.232    192.168.3.12   8080:30888/TCP                        4

 

 #nacos 界面查看ruoyi-monitor 是否注册到nacos

27ea6b9e08e60e84a9ba37771def2b2d

 

bbec224a2d4ce21b7114e42d0a2ebec0

 

#查看用户名和密码,若依的用户名和密码在nacos 的ruoyi-monitor-prod.yml 中查看

c1f990e81c0a306c4a9f0b0e4771406a

 

 

#查看到的用户名:ruoyi ,密码:123456 登录Ruoyi-Monitor

http://192.168.3.15:8080/

 

9c98dc0a08cc0419dfc76a4008d05466

 

a9b4fcaa110ff43a0cea05bf3ce63a10

 

#查看ruoyi-monitor 是否被Sentinel 所管理

#根据上面SVC地址,浏览器登录,用户名和密码都是sentinel

http://192.168.3.12:8080

bf3bdaebf437e820d250d0b2b66dfa86

 

ruoyi-gateway 服务

cd /root/RuoYi-Cloud/kubernetes/java/ruoyi-gateway

kubectl apply -f ./

kubectl get pod -n ruoyi 

kubectl get svc -n ruoyi 

 

ruoyi-system 服务

cd /root/RuoYi-Cloud/kubernetes/java/ruoyi-system

kubectl apply -f ruoyi-system-deployment.yaml

kubectl get pod -n ruoyi 

 

cd /root/RuoYi-Cloud/kubernetes/java/ruoyi-auth

kubectl apply -f ruoyi-auth-deployment.yaml

kubectl get pod -n ruoyi 

 

ruoyi-job 服务

cd /root/RuoYi-Cloud/kubernetes/java/ruoyi-job

kubectl apply -f ruoyi-job-deployment.yaml

kubectl get pod -n ruoyi 

 

 ruoyi-file 服务

cd  /root/RuoYi-Cloud/kubernetes/java/ruoyi-file

kubectl apply -f ruoyi-file-deployment.yaml

kubectl get pod -n ruoyi 

 

ruoyi-gen 服务

cd /root/RuoYi-Cloud/kubernetes/java/ruoyi-gen
kubectl apply -f ruoyi-gen-deployment.yaml
kubectl get pod -n ruoyi 
 
 
 
 
 
 
部署 RuoYi-Cloud 微服务前端 RuoYi-UI 服务
 ruoyi-ui 前端服务部署
cd /root/RuoYi-Cloud/kubernetes/nginx/
kubectl apply -f ./
 
kubectl get pod -n ruoyi 
[root@master1 nginx]# kubectl get pod -n ruoyi -o wide

NAME                                  READY   STATUS    RESTARTS       AGE     IP             NODE          NOMINATED NODE   READINESS GATES
mysql-0                               1/1     Running   4 (24m ago)    15h     10.244.1.100   node1.org     <none>           <none>
nacos-0                               1/1     Running   6 (24m ago)    31m     10.244.1.98    node1.org     <none>           <none>
redis-0                               1/1     Running   4 (24m ago)    15h     10.244.1.105   node1.org     <none>           <none>
ruoyi-auth-7f8fdd6f9f-d9bxd           1/1     Running   2 (13m ago)    16m     10.244.1.112   node1.org     <none>           <none>
ruoyi-file-587659f979-4m4f4           1/1     Running   2 (10m ago)    12m     10.244.1.113   node1.org     <none>           <none>
ruoyi-gateway-779d65bc97-tnpm9        1/1     Running   0              20m     10.244.1.108   node1.org     <none>           <none>
ruoyi-gen-f8f6c656-zv56d              1/1     Running   1 (14m ago)    15m     10.244.0.5     master1.org   <none>           <none>
ruoyi-job-54b6957f8f-mxv7l            1/1     Running   0              8m51s   10.244.0.6     master1.org   <none>           <none>
ruoyi-monitor-746cbbc4b4-qk2rj        1/1     Running   0              19m     10.244.1.109   node1.org     <none>           <none>
ruoyi-nginx-7899759558-rl8q5          1/1     Running   0              6m33s   10.244.1.115   node1.org     <none>           <none>
ruoyi-system-864c997576-mbvmh         1/1     Running   0              18m     10.244.1.110   node1.org     <none>           <none>
sentinel-dashboard-5f5cdd79fb-4mn7k   1/1     Running   15 (24m ago)   15h     10.244.1.99    node1.org     <none>           <none>

 

kubectl apply -f nginx-svc.yaml -f nginx-ingress.yaml
kubectl get svc -n ruoyi 
[root@master1 nginx]# 
[root@master1 nginx]# kubectl get svc -n ruoyi -o wide   
NAME                     TYPE           CLUSTER-IP       EXTERNAL-IP    PORT(S)                               AGE     SELECTOR
mysql-external           LoadBalancer   10.105.210.128   192.168.3.13   3306:30036/TCP                        15h     app=mysql
mysql-headless           ClusterIP      None             <none>         3306/TCP                              15h     app=mysql
nacos-external           LoadBalancer   10.99.162.196    192.168.3.14   8848:30048/TCP                        15h     app=nacos
nacos-headless           ClusterIP      None             <none>         8848/TCP,9848/TCP,9849/TCP,7848/TCP   15h     app=nacos
redis-external           LoadBalancer   10.97.15.141     192.168.3.11   6379:30079/TCP                        15h     app=redis
redis-headless           ClusterIP      None             <none>         6379/TCP                              15h     app=redis
ruoyi-gateway-external   LoadBalancer   10.104.233.75    192.168.3.15   8080:30486/TCP                        17m     app=ruoyi-gateway,project=ruoyi
ruoyi-gateway-headless   ClusterIP      None             <none>         8080/TCP                              17m     app=ruoyi-gateway,project=ruoyi
ruoyi-monitor-external   LoadBalancer   10.101.219.245   192.168.3.16   8080:30010/TCP                        16m     app=ruoyi-monitor,project=ruoyi
ruoyi-nginx              LoadBalancer   10.111.172.114   192.168.3.17   80:30762/TCP                          3m26s   app=ruoyi-nginx
sentinel-external        LoadBalancer   10.99.140.232    192.168.3.12   8080:30888/TCP                        15h     app=sentinel-dashboard

 

kubectl get ingress -n ruoyi 
[root@master1 nginx]# kubectl get ingress -n ruoyi 
NAME            CLASS   HOSTS            ADDRESS        PORTS   AGE
ruoyi-ingress   nginx   ruoyi.ming.org   192.168.3.10   80      7m27s
[root@master1 nginx]# 

 

#做域名解析
192.168.3.10 ruoyi.ming.org 

 

74bc22b1e275c61a8443c52782f84c6a

 

 

86da9c593551dafc945efd63a5b0c204

 

ec320043-3a96-4148-8c9a-1c3cc6c5bf79

 

80ee773421f9ab9a50cfbdd59b729653

 

posted @ 2026-08-17 21:42  minger_lcm  阅读(15)  评论(0)    收藏  举报