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: 配置导入(推荐)



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]#

部署 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


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

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


#查看ruoyi-monitor 是否被Sentinel 所管理
#根据上面SVC地址,浏览器登录,用户名和密码都是sentinel
http://192.168.3.12:8080

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 服务
[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>
[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
[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]#




浙公网安备 33010602011771号