目录
微服务项目部署
什么是微服务?
传统项目特点:传统项目就是把所有的业务功能写在一个项目中,最终打包成一个war包,然后进行部署运行。

传统项目是一个进程包含了所有的业务功能,功能越多,项目就复杂。随着代码的增多,构建和部署的时间也会增加,每次功能的变更或Bug的修复,甚至添加一个简单的功能,都需要重新打包整个项目代码。某个功能出现问题可能影响整个应用。
微服务项目特点:微服务是一种将一个完整的项目拆分成一个个独立的小应用(微服务)每个应用运行在自己进程中。如下图:

一个微服务只关注一个特定的业务功能,所以它业务清晰、代码量较少,易于维护,启动更快。 传统项目只要有修改,就得重新部署整个应用,微服务解决了这样的问题。一般来说,对某个微服务进行修改,只需要重新部署这个服务即可。
微服务项目介绍
RuoYi-Cloud 是通过 Java EE (Java企业版) 开发的微服务架构权限管理系统。基于经典技术组合(Spring Boot、Spring Cloud & Alibaba),内置模块如:部门管理、角色用户、菜单及按钮授权、数据权限、系统参数、日志管理、代码生成等。在线定时任务配置;支持集群,支持多数据源。
简单来说:基于Spring Boot、Spring Cloud & Alibaba的分布式微服务架构权限管理系统。
文档地址:http://doc.ruoyi.vip/ruoyi-cloud/
代码下载:https://gitee.com/y_project/RuoYi-Cloud
Spring是什么?是一个开源的Java开发框架,用于简化Java程序的开发。
Spring Boot是什么?是基于Spring的全新框架,对比于Spring框架更加的简洁高效,目的是以最快的速度来启动和运行Java项目。
Spring Cloud是什么?是一套微服务开发框架。
Spring Cloud Alibaba是什么?是阿里巴巴推出的微服务一站式开发框架。
微服务组件介绍
- Gateway网关组件:在微服务架构中,网关起到了路由的作用,例如,用户需要请求一个特定的微服务,而这个请求会先通过网关,然后网关会将其路由到正确的微服务。
-
Auth认证组件:负责处理身份认证和权限授权,在微服务架构中,起到以下作用:
1.身份认证(Authentication):在用户使用系统之前,系统需要验证用户的身份,以确保他们是谁。身份认证通常通过用户名和密码、令牌(Token)、多因素认证等方式进行。认证成功后,用户可以进一步使用系统。
2.权限授权(Authorization):在用户的身份被认证后,系统还需要确定用户可以访问哪些资源,执行哪些操作。这就是授权的过程。授权是基于用户的角色、权限列表等进行的。
在微服务架构中,通常会有一个专门的Auth服务,负责处理所有微服务的认证和授权。这样,每个微服务不需要自己处理认证和授权,只需要向Auth服务询问用户是否已经认证,以及他们是否有权限访问特定的资源或执行特定的操作。
-
Nacos服务注册组件:由阿里巴巴开发并开源的服务发现和服务配置平台,在微服务架构中,起到以下作用:
1.服务发现和服务注册:在微服务架构中,由于有大量的微服务,并且它们都需要互相通信,因此服务发现和服务注册成为必不可少的部分。Nacos提供了一个服务注册中心,可以让微服务在启动时注册自己的信息,例如服务的名称、IP地址、端口号等。同时,Nacos也提供了服务发现的功能,允许微服务找到并调用其他的微服务。
2.动态服务配置:在微服务架构中,微服务的配置信息(如数据库连接参数、外部API接口地址等)可能需要根据环境或业务需求进行变动。Nacos允许将这些配置信息集中存储和管理,并在配置信息发生变动时,动态地推送给相应的微服务,无需重启服务即可更新配置。
Nacos在微服务架构中起到了至关重要的作用,它让服务之间的通信和配置管理变得更加简单、灵活和高效。
Sentinel熔断和降级组件:由阿里巴巴开源的一款轻量级的流量控制、熔断和降级组件,在微服务架构中,起到以下作用:
流量控制:在微服务环境中,由于服务之间存在大量的通信,因此需要对这些通信的流量进行控制,以防止因为流量过大而导致服务崩溃。Sentinel可以通过定义一些流量控制规则(例如,限制单位时间内的请求次数)来实现流量控制。
熔断机制:当某个服务出现问题(例如,响应时间过长或者失败率过高)时,为了防止问题扩大,可以通过熔断机制将这个服务"断开",即停止向这个服务发送请求。这可以避免问题服务影响到其他服务或整个系统。
降级处理:降级处理是指当某个服务出现问题或者系统负载过高时,暂时停止提供部分功能,只提供核心功能,以此来保护系统的稳定。Sentinel可以通过定义一些降级规则来实现降级处理。
Sentinel在微服务架构中起到了保护系统稳定性和可用性的重要作用,它可以帮助微服务系统在面临流量过大、服务出问题等情况时,做出相应的处理,防止整个系统的瘫痪。
-
Ribbon服务调用组件:是开源的一个云中间件,在微服务架构中,一个微服务可能会有多个实例在运行。Ribbon可以将客户端的请求分发到不同的微服务实例上,实现负载均衡。
-
Sidecar是一种架构的设计模式,是指为主应用程序提供了额外的附加功能,如监控、配置、网络通信、代理等。
-
异构服务:在微服务架构中,"异构服务"指的是使用不同的技术栈(如编程语言、数据库、框架等)创建的服务。因为它可以让每个微服务根据自己的业务需求和技术需求选择最适合的技术栈。
例如,一些服务可能更适合使用Java和Spring Boot来开发,而其他服务可能更适合使用Python和Django。同样,一些服务可能更适合使用关系型数据库如MySQL,而其他服务可能更适合使用非关系型数据库如MongoDB。
异构性的优点包括更大的灵活性。开发团队可以根据每个服务的具体需求选择最适合的技术,而不是被迫使用一个统一的技术栈。
Zipkin/SkyWalking链路追踪组件:Apache SkyWalking在微服务架构中提供了链路追踪的功能,起到以下作用:
分布式追踪:SkyWalking可以为微服务架构中的每个服务调用提供追踪数据,帮助开发者理解各个服务之间的交互和依赖关系,找出性能瓶颈或故障源头。
性能监控:SkyWalking收集各种性能指标,包括服务、服务实例和端点的响应时间、吞吐量等,使开发者能够实时掌握系统的性能状态。
拓扑图分析:SkyWalking能够展示微服务架构中服务之间的拓扑关系,使系统的调用关系一目了然。
告警:SkyWalking可以根据预设的规则生成告警,及时通知开发者系统存在的问题。
度量聚合:SkyWalking不仅可以收集和展示实时的监控数据,还可以聚合这些数据,提供更长时间范围内的性能趋势分析。
支持服务网格:SkyWalking可以与服务网格(如Istio等)集成,为服务网格提供观察性分析。
总的来说,SkyWalking是一个强大的观察性工具,能够帮助开发者更好地理解和优化微服务系统的性能和稳定性。
Spring Boot Admin服务监控组件:用于管理和监控Spring Boot应用程序,但是Spring Boot Admin Server并不适用于生产环境,因为它会暴露一些敏感信息,可能会带来安全风险。在生产环境中,应该使用更专业的监控系统,如Prometheus、Grafana等。
Quartz任务调度组件:主要用于管理和调度后台任务,可以集成到任何Java应用程序中,在微服务架构中,起到以下作用:
定时任务:Quartz可以用于执行定时任务,例如每天凌晨清理日志,每小时汇总统计数据等。
重复任务:Quartz也可以用于执行重复的任务,例如每隔5分钟检查系统状态,每隔10分钟同步数据等。
长时间运行的任务:对于一些需要运行很长时间的任务,例如数据处理和分析,也可以使用Quartz来调度和管理。
集群任务调度:Quartz还提供了集群支持,可以在多个节点上均衡执行任务,提高系统的可用性和性能。
作业持久化:Quartz支持作业的持久化,即使应用程序重启,持久化的作业也不会丢失,会在合适的时候继续执行。
灵活的调度策略:Quartz提供了丰富的调度策略,例如简单的定时调度,也可以使用Cron表达式进行复杂的调度。
因此,在微服务架构中,Quartz可以作为一个重要的组件,帮助你管理和调度各种后台任务。
-
RabbitMQ、KAFKA消息队列:在高并发场景下,直接的服务调用可能会导致被调用服务的负载过大,而消息队列可以作为一个缓冲,暂存大量的请求,通过调整消费者的处理能力,实现流量的平滑处理。 在微服务架构中,各个服务可能需要共享一些数据,这些数据可以通过消息队列进行传递,实现数据的共享。
-
ELK:日志收集、过滤、展示。
-
Minio和FastDFS都是分布式文件存储系统, 主要用于处理大量的非结构化数据,例如图片、视频、日志文件等。
-
Elasticsearch数据库:任何需要进行快速搜索和分析的数据都可以存储在Elasticsearch中,例如:电子邮件、论坛帖子、文章、、网站访问记录等等。
-
Redis提供数据的缓存,加速用户的访问。
-
Apache NiFi是一个开源的数据流自动化工具,在微服务架构中,可以帮助数据流动于不同的系统之间,帮助各个服务之间进行数据的交互。
-
MySQL提供关系型数据的持久化存储。
k8s中部署微服务项目
先部署微服务治理层,比如:Nacos、sentinel、Skywalking等;在部署微服务层各个模块,最后接入前端UI;
微服务注册中心Nacos
创建名称空间
bash
[root@master01 ~]#kubectl create ns ruoyi-cloud
namespace/ruoyi-cloud created
部署nacos数据库
bash
#创建工作目录
mkdir ruoyi-cloud
cd ruoyi-cloud/
#创建文件
apiVersion: v1
kind: Service
metadata:
name: nacos-mysql-svc
namespace: ruoyi-cloud
spec:
clusterIP: None
selector:
app: nacos-mysql
ports:
- port: 3306
targetPort: 3306
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: nacos-mysql
namespace: ruoyi-cloud
spec:
serviceName: "nacos-mysql-svc"
replicas: 1
selector:
matchLabels:
app: nacos-mysql
template:
metadata:
labels:
app: nacos-mysql
spec:
containers:
- name: db
image: mysql:5.7
args:
- "--character-set-server=utf8"
env:
- name: MYSQL_ROOT_PASSWORD
value: admin123456
- name: MYSQL_DATABASE
value: ry-config
ports:
- containerPort: 3306
volumeMounts:
- name: data
mountPath: /var/lib/mysql/
volumeClaimTemplates:
- metadata:
name: data
spec:
accessModes: ["ReadWriteMany"]
storageClassName: "nfs-client"
resources:
requests:
storage: 5Gi
#创建mysql
[root@master01 ~/rouyi-cloud]#kubectl create -f nacos-mysql.yml
service/nacos-mysql-svc created
statefulset.apps/nacos-mysql created
#查看mysql
[root@master01 ~/rouyi-cloud]#kubectl get pod -n ruoyi-cloud
NAME READY STATUS RESTARTS AGE
nacos-mysql-0 1/1 Running 0 35s
#解析mysql的域名
[root@master01 ~/rouyi-cloud]#dig nacos-mysql-0.nacos-mysql-svc.ruoyi-cloud.svc.cluster.local @172.18.235.2 +short
172.18.30.95
导入ruoyi-cloud配置文件ry_config_2022xxxx.sql至ry-config库中
bash
#在harbor节点克隆项目然后把表文件拷贝到当前master节点导入
[root@harbor ~]# yum install git -y
[root@harbor ~]# git clone https://gitee.com/y_project/RuoYi-Cloud.git
[root@harbor ~]# scp RuoYi-Cloud/sql/ry_config_20220929.sql 10.0.0.110:/root/ruoyi-cloud
#如果没有MySQL的客户端工具需要提前安装
#下载MySQL仓库
[root@k8s-master01 ruoyi-cloud]# rpm -ivh https://dev.mysql.com/get/mysql57-community-release-el7-10.noarch.rpm
#导入GPG密钥文件
[root@k8s-master01 ruoyi-cloud]# rpm --import https://repo.mysql.com/RPM-GPG-KEY-mysql-2022
#安装MySQL客户端工具包
[root@k8s-master01 ruoyi-cloud]# yum install -y mysql-community-client-5.7.43-1.el7.x86_64
#导入表文件到ry_config库中
[root@k8s-master01 ruoyi-cloud]# mysql -h172.16.85.198 -uroot -padmin123456 ry-config < ry_config_20220929.sql
#进入数据库验证
[root@master01 ~/rouyi-cloud]#kubectl exec -it nacos-mysql-0 -n ruoyi-cloud -- mysql -uroot -padmin123456
mysql> use ry-config
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
Database changed
mysql> show tables;
+----------------------+
| Tables_in_ry-config |
+----------------------+
| config_info |
| config_info_aggr |
| config_info_beta |
| config_info_gray |
| config_info_tag |
| config_tags_relation |
| group_capacity |
| his_config_info |
| permissions |
| roles |
| tenant_capacity |
| tenant_info |
| users |
+----------------------+
13 rows in set (0.00 sec)
部署Nacos可参考官方提供的方案:https://github.com/nacos-group/nacos-k8s/tree/master/deploy/nacos
bash
[root@master01 ~/rouyi-cloud]#cat nacos.yml
#通过configMap保存数据库的信息,数据库信息根据根据实际情况修改
apiVersion: v1
kind: ConfigMap
metadata:
namespace: ruoyi-cloud
name: nacos-cm
data:
mysql.host: "nacos-mysql-0.nacos-mysql-svc.ruoyi-cloud.svc.cluster.local"
mysql.db.name: "ry-config"
mysql.port: "3306"
mysql.user: "root"
mysql.password: "admin123456"
---
#headless service
apiVersion: v1
kind: Service
metadata:
name: nacos-svc
namespace: ruoyi-cloud
spec:
clusterIP: None
selector:
app: nacos
ports:
#8848是Nacos服务的默认端口,用于处理客户端的请求
- name: server
port: 8848
targetPort: 8848
#9848端口在Nacos集群模式下用于节点间的心跳检测以及负载均衡
- name: client-rpc
port: 9848
targetPort: 9848
#9849端口主要用于Nacos集群模式下内部节点间进行数据复制等操作
- name: raft-rpc
port: 9849
targetPort: 9849
#兼容1.4.x版本的选举端口
- name: old-raft-rpc
port: 7848
targetPort: 7848
---
#Nacos作为服务注册与配置中心,必须要有一个稳定的地址,通过StatefulSet进行部署最佳
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: nacos
namespace: ruoyi-cloud
spec:
serviceName: "nacos-svc"
replicas: 2
selector:
matchLabels:
app: nacos
template:
metadata:
labels:
app: nacos
spec:
#设置Pod亲和性或反亲调度
affinity:
#设置反亲和性规则,即不希望Pod被调度到同一节点上
podAntiAffinity:
#这个属性表示调度时必须满足的反亲和性规则,如果这些条件不能满足Pod将无法被调度
requiredDuringSchedulingIgnoredDuringExecution:
#选择具有特定标签的 Pod
- labelSelector:
matchExpressions:
- key: app
operator: In
values: ["nacos"]
#在同一个环境下避免Pod被调度到同一节点上
topologyKey: "kubernetes.io/hostname"
#initContainers用于初始化Pod的环境,例如设置网络,安装软件包等,它们在Pod的主容器启动之前运行,并且必须在主容器启动之前成功完成
initContainers:
- name: peer-finder-plugin-install
image: nacos/nacos-peer-finder-plugin:1.1
imagePullPolicy: Always
volumeMounts:
- name: data
mountPath: /home/nacos/plugins/peer-finder
subPath: peer-finder
containers:
- name: nacos
image: nacos/nacos-server:v2.1.1
resources:
requests:
memory: "800Mi"
cpu: "500m"
ports:
- name: client-port
containerPort: 8848
- name: client-rpc
containerPort: 9848
- name: raft-rpc
containerPort: 9849
- name: old-raft-rpc
containerPort: 7848
env:
#设置Nacos的运行模式,"cluster"表示Nacos在集群模式下运行
- name: MODE
value: "cluster"
#表示Nacos的版本号
- name: NACOS_VERSION
value: 2.1.1
#表示Nacos集群的副本数量
- name: NACOS_REPLICAS
value: "3"
#表示Nacos的service名称
- name: SERVICE_NAME
value: "nacos-svc"
#表示Nacos服务的域名
- name: DOMAIN_NAME
value: "cluster.local"
#表示Nacos服务的端口号
- name: NACOS_SERVER_PORT
value: "8848"
#表示Nacos应用的端口号
- name: NACOS_APPLICATION_PORT
value: "8848"
#表示Nacos集群中的节点通信使用主机名而非IP地址
- name: PREFER_HOST_MODE
value: "hostname"
#这段代码将POD_NAMESPACE环境变量的值设置为当前Pod的namespace名称
- name: POD_NAMESPACE
valueFrom:
fieldRef:
apiVersion: v1
fieldPath: metadata.namespace
#MySQL主机地址从configMap的key中获取
- name: MYSQL_SERVICE_HOST
valueFrom:
configMapKeyRef:
name: nacos-cm
key: mysql.host
#MySQL的库名称从configMap的key中获取
- name: MYSQL_SERVICE_DB_NAME
valueFrom:
configMapKeyRef:
name: nacos-cm
key: mysql.db.name
#MySQL的端口从configMap的key中获取
- name: MYSQL_SERVICE_PORT
valueFrom:
configMapKeyRef:
name: nacos-cm
key: mysql.port
#MySQL的用户名从configMap的key中获取
- name: MYSQL_SERVICE_USER
valueFrom:
configMapKeyRef:
name: nacos-cm
key: mysql.user
#MySQL的用户密码从configMap的key中获取
- name: MYSQL_SERVICE_PASSWORD
valueFrom:
configMapKeyRef:
name: nacos-cm
key: mysql.password
volumeMounts:
- name: data
mountPath: /home/nacos/plugins/peer-finder
subPath: peer-finder
- name: data
mountPath: /home/nacos/data
subPath: data
- name: data
mountPath: /home/nacos/logs
subPath: logs
#在pvc模板中按照实际情况指定动态存储的名称
volumeClaimTemplates:
- metadata:
name: data
spec:
storageClassName: "nfs-client"
accessModes: ["ReadWriteMany"]
resources:
requests:
storage: 20Gi
bash
#创建pod
[root@master01 ~/rouyi-cloud]#kubectl create -f nacos.yml
configmap/nacos-cm created
service/nacos-svc created
statefulset.apps/nacos created
#查看pod
[root@master01 ~/rouyi-cloud]#kubectl get pod -n ruoyi-cloud
NAME READY STATUS RESTARTS AGE
nacos-0 1/1 Running 0 20s
nacos-1 1/1 Running 0 7s
nacos-mysql-0 1/1 Running 0 122m
创建ingress实现外部域名访问
bash
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
#指定名称空间
namespace: ruoyi-cloud
name: nacos-ingress
spec:
ingressClassName: "nginx"
rules:
- host: web.nacos-demo.com
http:
paths:
- path: /nacos
pathType: Prefix
backend:
service:
name: nacos-svc
port:
name: server
#创建ingress
[root@master01 ~/rouyi-cloud]#kubectl create -f nacos-ingress.yml
ingress.networking.k8s.io/nacos-ingress created
#查看ingress
[root@master01 ~/rouyi-cloud]#kubectl get ing -n ruoyi-cloud
NAME CLASS HOSTS ADDRESS PORTS AGE
nacos-ingress nginx web.nacos-demo.com 10.96.119.59 80 37s
配置本地解析,访问nacos:web.nacos-demo.com/nacos/
用户名/密码:nacos

微服务流量控制Sentinel
如果需要自己制作镜像也很简单(在harbor主机制作)
bash
#下载Sentinel的jar包
[root@harbor ~]# mkdir sentinel
[root@harbor ~]# cd sentinel
[root@harbor ~]# wget https://github.com/alibaba/Sentinel/releases/download/1.8.5/sentinel-dashboard-1.8.5.jar
#编写dockerfile
[root@harbor sentinel]# cat dockerfile
FROM openjdk:8-jre-alpine
COPY ./sentinel-dashboard-1.8.5.jar /sentinel-dashboard.jar
#定义启动jar包脚本
COPY ./entrypoint.sh /
RUN chmod +x /entrypoint.sh
#暴露程序的端口号、API端口
EXPOSE 8718 8719
CMD ["/bin/sh","-c","/entrypoint.sh"]
#编写启动脚本
[root@harbor sentinel]# cat entrypoint.sh
java -Xms100m -Xmx100m -Dserver.port=8718 \
-Dcsp.sentinel.dashboard.server=localhost:8718 \
-Dproject.name=sentinel-dashboard \
-Dcsp.sentinel.api.port=8719 \
-jar sentinel-dashboard.jar
#构建镜像
[root@harbor sentinel]# docker build -f dockerfile -t sentinel:v1.8.5 .
#上传镜像到harbor(在harbor中创建一个名为sentinel的公开仓库)
[root@harbor harbor]# docker tag sentinel:v1.8.5 192.168.0.25/sentinel/sentinel:v1.8.5
[root@harbor harbor]# docker push 192.168.0.25/sentinel/sentinel:v1.8.5
在k8s中通过Deployment部署Sentinel
bash
apiVersion: apps/v1
kind: Deployment
metadata:
name: sentinel-server
namespace: ruoyi-cloud
spec:
replicas: 1
selector:
matchLabels:
app: sentinel
template:
metadata:
labels:
app: sentinel
spec:
containers:
- name: sentinel
image: 49.235.163.3/sentinel/sentinel:v1.8.5
ports:
- name: server
containerPort: 8718
- name: api
containerPort: 8719
---
apiVersion: v1
kind: Service
metadata:
name: sentinel-svc
namespace: ruoyi-cloud
spec:
selector:
app: sentinel
ports:
- name: server
port: 8718
targetPort: 8718
- name: api
port: 8719
targetPort: 8719
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: sentinel-ingress
namespace: ruoyi-cloud
spec:
ingressClassName: "nginx"
rules:
- host: web.sentinel-demo.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: sentinel-svc
port:
name: server
#创建Pod
kubectl create -f sentinel.yml
#查看Pod
kubectl get pod -n ruoyi-cloud
NAME READY STATUS RESTARTS AGE
sentinel-server-5dfb86bfc5-bs62b 1/1 Running 0 2m35s
配置本地解析,访问sentinel:http://web.sentinel-demo.com/,用户名/密码:sentinel

微服务链路追踪Skywalking
先部署SkyWalking OAP收集器
bash
apiVersion: apps/v1
kind: Deployment
metadata:
name: skywalking-oap
namespace: ruoyi-cloud
spec:
replicas: 1
selector:
matchLabels:
app: sky-oap
template:
metadata:
labels:
app: sky-oap
spec:
containers:
- name: oap
image: apache/skywalking-oap-server:9.0.0
ports:
#OAP收集器端口11800
- name: agent
containerPort: 11800
#接收前端UI请求的端口
- name: oap
containerPort: 12800
---
apiVersion: v1
kind: Service
metadata:
name: skywalking-oap-svc
namespace: ruoyi-cloud
spec:
selector:
app: sky-oap
ports:
- name: oap
port: 12800
targetPort: 12800
- name: agent
port: 11800
targetPort: 11800
#创建pod
[root@master01 ~/rouyi-cloud]#kubectl create -f skywalking-oap.yml
deployment.apps/skywalking-oap created
service/skywalking-oap-svc created
#查看pod
[root@master01 ~/rouyi-cloud]#kubectl get pod -n ruoyi-cloud
NAME READY STATUS RESTARTS AGE
nacos-0 1/1 Running 1 (58m ago) 84m
nacos-1 1/1 Running 1 (57m ago) 84m
nacos-mysql-0 1/1 Running 1 (57m ago) 3h26m
sentinel-server-68d48f99d9-7gcs6 1/1 Running 0 4m55s
skywalking-oap-757b55888b-hrmz7 1/1 Running 0 36s
部署SkyWalking UI
bash
apiVersion: apps/v1
kind: Deployment
metadata:
name: skywalking-ui
namespace: ruoyi-cloud
spec:
replicas: 1
selector:
matchLabels:
app: sky-ui
template:
metadata:
labels:
app: sky-ui
spec:
containers:
- name: ui
image: apache/skywalking-ui:9.0.0
ports:
- containerPort: 8080
env:
#传递skywalking-OAP的svc地址,这样即使Pod怎么变化通过svc地址都可以找到它
- name: SW_OAP_ADDRESS
value: "http://skywalking-oap-svc:12800"
---
apiVersion: v1
kind: Service
metadata:
name: skywalking-ui-svc
namespace: ruoyi-cloud
spec:
selector:
app: sky-ui
ports:
- name: ui
port: 8080
targetPort: 8080
#创建pod
[root@master01 ~/rouyi-cloud]#kubectl create -f skywalking-ui.yml
deployment.apps/skywalking-ui created
service/skywalking-ui-svc created
#查看pod
[root@master01 ~/rouyi-cloud]#kubectl get pod -n ruoyi-cloud
NAME READY STATUS RESTARTS AGE
nacos-0 1/1 Running 1 (61m ago) 87m
nacos-1 1/1 Running 1 (61m ago) 87m
nacos-mysql-0 1/1 Running 1 (61m ago) 3h29m
sentinel-server-68d48f99d9-7gcs6 1/1 Running 0 8m27s
skywalking-oap-757b55888b-hrmz7 1/1 Running 1 (32s ago) 4m8s
skywalking-ui-7f7fbf5789-8h22t 1/1 Running 0 38s
创建Ingress发布skywalking-ui提供外部访问
bash
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: skywalking-ingress
namespace: ruoyi-cloud
spec:
ingressClassName: "nginx"
rules:
- host: web.skywalking-demo.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: skywalking-ui-svc
port:
name: ui
#创建ingress
[root@master01 ~/rouyi-cloud]#kubectl create -f skywalking-ingress.yml
ingress.networking.k8s.io/skywalking-ingress created
#查看ing
[root@master01 ~/rouyi-cloud]#kubectl get ing -n ruoyi-cloud
NAME CLASS HOSTS ADDRESS PORTS AGE
nacos-ingress nginx web.nacos-demo.com 10.96.119.59 80 88m
sentinel-ingress nginx web.sentinel-demo.com 10.96.119.59 80 12m
skywalking-ingress nginx web.skywalking-demo.com 80 45s
配置本地解析,访问skywalking:http://web.skywalking-demo.com
部署微服务数据层
在k8s集群中部署MySQL与Redis数据库
bash
apiVersion: v1
kind: Service
metadata:
name: ruoyi-mysql-svc
namespace: ruoyi-cloud
spec:
clusterIP: None
selector:
app: ruoyi-mysql
ports:
- port: 3306
targetPort: 3306
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: ruoyi-mysql
namespace: ruoyi-cloud
spec:
serviceName: "ruoyi-mysql-svc"
replicas: 1
selector:
matchLabels:
app: ruoyi-mysql
template:
metadata:
labels:
app: ruoyi-mysql
spec:
containers:
- name: db
image: mysql:5.7
args:
- "--character-set-server=utf8"
env:
- name: MYSQL_ROOT_PASSWORD
value: admin123456
- name: MYSQL_DATABASE
value: ry-cloud
ports:
- containerPort: 3306
volumeMounts:
- name: data
mountPath: /var/lib/mysql/
volumeClaimTemplates:
- metadata:
name: data
spec:
accessModes: ["ReadWriteMany"]
storageClassName: "nfs-client"
resources:
requests:
storage: 5Gi
#创建mysql
[root@master01 ~/rouyi-cloud]#kubectl create -f ruoyi-mysql.yml
service/ruoyi-mysql-svc created
statefulset.apps/ruoyi-mysql created
#解析mysql域名
[root@master01 ~/rouyi-cloud]#dig ruoyi-mysql-0.ruoyi-mysql-svc.ruoyi-cloud.svc.cluster.local @172.18.235.2 +short
172.18.30.102
部署redis
bash
apiVersion: v1
kind: Service
metadata:
name: ruoyi-redis-svc
namespace: ruoyi-cloud
spec:
selector:
app: redis
ports:
- port: 6379
targetPort: 6379
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: ruoyi-redis
namespace: ruoyi-cloud
spec:
replicas: 1
selector:
matchLabels:
app: redis
template:
metadata:
labels:
app: redis
spec:
containers:
- name: redis-cache
image: redis:6.2-alpine
ports:
- containerPort: 6379
#创建pod
[root@master01 ~/rouyi-cloud]#kubectl create -f ruoyi-redis.yml
service/ruoyi-redis-svc created
deployment.apps/ruoyi-redis created
#解析Redis域名(不加Pod名称,通过svc名称解析即可)
[root@master01 ~/rouyi-cloud]#dig @172.18.235.2 ruoyi-redis-svc.ruoyi-cloud.svc.cluster.local +short
10.96.217.179
将RuoYi-Cloud项目所需的数据文件 ry_2025xxxx.sql 表文件导入到ry-cloud库中
bash
[root@master01 ~/rouyi-cloud]#scp 49.235.163.3:/root/RuoYi-Cloud/sql/ry_20250523.sql .
#解析mysql域名
[root@master01 ~/rouyi-cloud]#dig ruoyi-mysql-0.ruoyi-mysql-svc.ruoyi-cloud.svc.cluster.local @172.18.235.2 +short
172.18.30.102
#导入表文件
[root@master01 ~/rouyi-cloud]#mysql -h172.18.30.102 -uroot -padmin123456 ry-cloud < ry_20250523.sql
mysql: [Warning] Using a password on the command line interface can be insecure.
微服务Ruoyi-Cloud组件部署
打包RuoYi-Cloud项目,需要先安装jdk和maven环境(在harbor节点)
bash
#需要Java环境,安装jdk 1.8+
[root@harbor ~]# yum install java-1.8.0-openjdk.x86_64 -y
#下载maven 3.2.x+版本
wget https://archive.apache.org/dist/maven/maven-3/3.5.2/binaries/apache-maven-3.5.2-bin.tar.gz --no-check-certificate
#安装maven
[root@VM-4-2-centos ~]# yum install -y apache-maven-3.5.2-1.el7.noarch.rpm
部署ruoyi-api-system模块
进入RuoYi-Cloud目录打包ruoyi-system项目
bash
[root@harbor ~]# cd RuoYi-Cloud
[root@harbor RuoYi-Cloud]# mvn package -Dmaven.test.skip=true -pl ruoyi-modules/ruoyi-system/ -am
参数说明:
mvn package: Maven 核心生命周期指令:编译代码 → 打包(生成 jar/war 包),但不部署。
-Dmaven.test.skip=true: 跳过单元测试
-pl: --projects 缩写:指定只打包「ruoyi-system」这一个模块。
-am: --also-make 缩写:自动打包「指定模块依赖的所有模块」。
...
[INFO] BUILD SUCCESS #看到这个则成功
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 38.285 s
[INFO] Finished at: 2026-02-24T16:08:56+08:00
[INFO] Final Memory: 101M/270M
[INFO] ------------------------------------------------------------------------
制作ruoyi-system镜像
bash
[root@harbor RuoYi-Cloud]# cd ruoyi-modules/ruoyi-system/
[root@harbor ruoyi-system]# cat dockerfile
#定义基础镜像
FROM openjdk:8-jre-alpine
#拷贝编译后的jar包
COPY ./target/*.jar /ruoyi-modules-system.jar
#拷贝启动脚本
COPY ./entrypoint.sh /
#添加脚本执行权限
RUN chmod +x /entrypoint.sh
#添加SkyWalking Agent客户端程序到容器中,ADD添加宿主机文件到容器中会自动解压tar.gz的压缩文件,而COPY不会自动解压
ADD ./apache-skywalking-java-agent-8.15.0.tgz /
#暴露ruoyi-system端口
EXPOSE 9201
#执行脚本启动程序
CMD ["/bin/sh","-c","/entrypoint.sh"]
准备SkyWalking Agent客户端程序,SkyWalking Agent用于收集应用程序的运行时信息,并进行监视,然后SkyWalking服务端通过连接客户端获取微服务信息,实现链路追踪。
bash
[root@harbor ruoyi-system]# wget https://archive.apache.org/dist/skywalking/java-agent/8.15.0/apache-skywalking-java-agent-8.15.0.tgz
定义entrypoint.sh启动脚本
bash
[root@harbor ruoyi-system]# cat entrypoint.sh
java -javaagent:/skywalking-agent/skywalking-agent.jar \
-Dskywalking.agent.service_name=ruoyi-system \
-Dskywalking.collector.backend_service=skywalking-oap-svc.ruoyi-cloud.svc.cluster.local:11800 \
-Dspring.profiles.active=dev \
-Dspring.cloud.nacos.config.file-extension=yml \
-Dspring.cloud.nacos.discovery.server-addr=nacos-svc.ruoyi-cloud.svc.cluster.local:8848 \
-Dspring.cloud.nacos.config.server-addr=nacos-svc.ruoyi-cloud.svc.cluster.local:8848 \
-jar /ruoyi-modules-system.jar
构建镜像并上传镜像到仓库(创建ruoyi-system公开仓库)
bash
[root@VM-4-2-centos ruoyi-system]# docker build -f dockerfile -t ruoyi-system:v1.0 .
#打标签
[root@harbor ruoyi-system]# docker tag ruoyi-system:v1.0 49.235.163.3/ruoyi-system/ruoyi-system:v1.0
#推送到harbor仓库
[root@harbor ruoyi-system]# docker push 49.235.163.3/ruoyi-system/ruoyi-system:v1.0
修改ruoyi-system连接数据库信息,登录nacos修改ruoyi-system-dev.yml配置文件

bash
# spring配置
spring:
redis:
# 连接redis
host: ruoyi-redis-svc.ruoyi-cloud.svc.cluster.local
port: 6379
password:
cloud:
# 增加连接sentinel信息
sentinel:
# 取消控制台懒加载
eager: true
transport:
# sentinel控制台地址
dashboard: sentinel-svc.ruoyi-cloud.svc.cluster.local:8718
#...........
datasource:
# 连接MySQL,指定MySQL地址、库名、用户名、密码
master:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://ruoyi-mysql-svc.ruoyi-cloud.svc.cluster.local:3306/ry-cloud?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
username: root
password: admin123456
添加配置后,点击右下角的【发布】即可。
通过deployment部署ruoyi-system
bash
apiVersion: apps/v1
kind: Deployment
metadata:
name: ruoyi-system
namespace: ruoyi-cloud
spec:
# 可以运行多个副本
replicas: 1
selector:
matchLabels:
app: system
template:
metadata:
labels:
app: system
spec:
containers:
- name: system
image: 49.235.163.3/ruoyi-system/ruoyi-system:v1.0
ports:
- containerPort: 9201
readinessProbe: #定义就绪探针
tcpSocket: #通过端口探测
port: 9201 #端口
initialDelaySeconds: 30 #容器启动后等待30秒执行探测
periodSeconds: 3 #执行探测频率为3秒
提示:微服务组件如果不直接对外提供访问是不需要service代理的,由gateway从nacos中获取到微服务的地址,然后将请求路由到微服务组件即可。
bash
#创建Pod
kubectl create -f ruoyi-system.yml
#查看pod
[root@master01 ~/rouyi-cloud]#kubectl get pod -n ruoyi-cloud -owide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
nacos-0 1/1 Running 1 (137m ago) 163m 172.18.5.29 worker01 <none> <none>
nacos-1 1/1 Running 1 (137m ago) 163m 172.18.30.100 worker02 <none> <none>
nacos-mysql-0 1/1 Running 4 (46m ago) 4h45m 172.18.30.98 worker02 <none> <none>
ruoyi-mysql-0 1/1 Running 0 66m 172.18.30.102 worker02 <none> <none>
ruoyi-redis-685cccbb84-mwnmt 1/1 Running 0 62m 172.18.5.35 worker01 <none> <none>
ruoyi-system-576dfbd66f-7gfsk 1/1 Running 0 9m21s 172.18.5.36 worker01 <none> <none>
sentinel-server-68d48f99d9-7gcs6 1/1 Running 0 84m 172.18.5.33 worker01 <none> <none>
skywalking-oap-757b55888b-hrmz7 1/1 Running 9 (80s ago) 80m 172.18.30.101 worker02 <none> <none>
skywalking-ui-7f7fbf5789-8h22t 1/1 Running 0 76m 172.18.5.34 worker01 <none> <none>
#查看日志,看是否启动成功
kubectl logs ruoyi-system-576dfbd66f-7gfsk -n ruoyi-cloud
(♥◠‿◠)ノ゙ 系统模块启动成功 ლ(´ڡ`ლ)゙
.-------. ____ __
| _ _ \ \ \ / /
| ( ' ) | \ _. / '
|(_ o _) / _( )_ .'
| (_,_).' __ ___(_ o _)'
| |\ \ | || |(_,_)'
| | \ `' /| `-' /
| | \ / \ /
''-' `'-' `-..-'
在nacos中验证是否注册成功

在sentinel中查看是否监控到ruoyi-system信息

部署ruoyi-auth认证中心
进入RuoYi-Cloud目录打包ruoyi-auth项目
bash
[root@harbor ~]# cd RuoYi-Cloud/
[root@harbor RuoYi-Cloud]# mvn package -Dmaven.test.skip=true -pl ruoyi-auth/ -am
制作ruoyi-auth镜像
bash
[root@harbor RuoYi-Cloud]# cd ruoyi-auth/
[root@harbor ruoyi-auth]# cat dockerfile
FROM openjdk:8-jre-alpine
COPY ./target/*.jar /ruoyi-auth.jar
COPY ./entrypoint.sh /
RUN chmod +x /entrypoint.sh
ADD ./apache-skywalking-java-agent-8.15.0.tgz /
EXPOSE 9200
CMD ["/bin/sh","-c","/entrypoint.sh"]
在当前目录准备SkyWalking Agent客户端程序
bash
[root@harbor ruoyi-auth]# ls
apache-skywalking-java-agent-8.15.0.tgz
定义entrypoint.sh启动脚本
bash
[root@harbor ruoyi-auth]# cat entrypoint.sh
java -javaagent:/skywalking-agent/skywalking-agent.jar \
-Dskywalking.agent.service_name=ruoyi-auth \
-Dskywalking.collector.backend_service=skywalking-oap-svc.ruoyi-cloud.svc.cluster.local:11800 \
-Dspring.profiles.active=dev \
-Dspring.cloud.nacos.config.file-extension=yml \
-Dspring.cloud.nacos.discovery.server-addr=nacos-svc.ruoyi-cloud.svc.cluster.local:8848 \
-Dspring.cloud.nacos.config.server-addr=nacos-svc.ruoyi-cloud.svc.cluster.local:8848 \
-jar /ruoyi-auth.jar
构建镜像并上传镜像到仓库(创建ruoyi-auth公开仓库)
bash
[root@VM-4-2-centos ruoyi-auth]# docker build -f dockerfile -t ruoyi-auth:v1.0 .
#打标签并推送到harbor仓库
[root@VM-4-2-centos ruoyi-auth]# docker tag ruoyi-auth:v1.0 49.235.163.3/ruoyi-auth/ruoyi-auth:v1.0
[root@VM-4-2-centos ruoyi-auth]# docker push 49.235.163.3/ruoyi-auth/ruoyi-auth:v1.0
修改ruoyi-auth连接数据库信息,登录nacos修改 ruoyi-auth-dev.yml 配置文件
bash
spring:
redis:
# 连接Redis
host: ruoyi-redis-svc.ruoyi-cloud.svc.cluster.local
port: 6379
password:
cloud:
# 增加连接sentinel信息
sentinel:
# 取消控制台懒加载
eager: true
transport:
# sentinel控制台地址
dashboard: sentinel-svc.ruoyi-cloud.svc.cluster.local:8718
通过deployment部署ruoyi-auth
bash
[root@master01 ~/rouyi-cloud]#cat ruoyi-auth.yml
apiVersion: apps/v1
kind: Deployment
metadata:
name: ruoyi-auth
namespace: ruoyi-cloud
spec:
replicas: 1
selector:
matchLabels:
app: auth
template:
metadata:
labels:
app: authkubectl logs ruoyi-auth-ddbd78896-r6mgn -n ruoyi-cloud
(♥◠‿◠)ノ゙ 认证授权中心启动成功 ლ(´ڡ`ლ)゙
.-------. ____ __
| _ _ \ \ \ / /
| ( ' ) | \ _. / '
|(_ o _) / _( )_ .'
| (_,_).' __ ___(_ o _)'
| |\ \ | || |(_,_)'
| | \ `' /| `-' /
| | \ / \ /
''-' `'-' `-..-'
spec:
containers:
- name: auth
image: 49.235.163.3/ruoyi-auth/ruoyi-auth:v1.0
ports:
- containerPort: 9200
readinessProbe:
tcpSocket:
port: 9200
initialDelaySeconds: 30 #容器启动后等待30秒执行探测
periodSeconds: 3 #执行探测频率为3秒
#创建pod
[root@master01 ~/rouyi-cloud]#kubectl create -f ruoyi-auth.yml
deployment.apps/ruoyi-auth created
#查看ruoyi-auth日志检查是否启动成功
部署ruoyi-gateway网关模块
进入RuoYi-Cloud目录打包ruoyi-gateway项目
bash
[root@harbor ~]# cd RuoYi-Cloud/
[root@harbor RuoYi-Cloud]# mvn package -Dmaven.test.skip=true -pl ruoyi-gateway/ -am
制作镜像
bash
[root@harbor RuoYi-Cloud]# cd ruoyi-gateway/
[root@harbor ruoyi-gateway]# cat dockerfile
#不要使用alpine镜像,会出现[网关异常处理]请求路径:/code的报错,后续访问ui出现程序异常
FROM openjdk:8-jre
COPY ./target/*.jar /ruoyi-gateway.jar
COPY ./entrypoint.sh /
RUN chmod +x /entrypoint.sh
ADD ./apache-skywalking-java-agent-8.15.0.tgz /
EXPOSE 8080
CMD ["/bin/sh","-c","/entrypoint.sh"]
在当前目录准备SkyWalking Agent客户端程序
bash
[root@harbor ruoyi-gateway]# ls
apache-skywalking-java-agent-8.15.0.tgz
定义entrypoint.sh启动脚本
bash
java -javaagent:/skywalking-agent/skywalking-agent.jar \
-Dskywalking.agent.service_name=ruoyi-gateway \
-Dskywalking.collector.backend_service=skywalking-oap-svc.ruoyi-cloud.svc.cluster.local:11800 \
-Dspring.profiles.active=dev \
-Dspring.cloud.nacos.config.file-extension=yml \
-Dspring.cloud.nacos.discovery.server-addr=nacos-svc.ruoyi-cloud.svc.cluster.local:8848 \
-Dspring.cloud.nacos.config.server-addr=nacos-svc.ruoyi-cloud.svc.cluster.local:8848 \
-jar /ruoyi-gateway.jar
构建镜像并上传镜像到仓库(创建ruoyi-gateway公开仓库)
bash
[root@harbor ruoyi-gateway]# docker build -f dockerfile -t ruoyi-gateway:v1.0 .
#该标签并推送到harbor
[root@VM-4-2-centos ruoyi-gateway]# docker tag ruoyi-gateway:v1.0 49.235.163.3/ruoyi-gateway/ruoyi-gateway:v1.0
[root@VM-4-2-centos ruoyi-gateway]# docker push 49.235.163.3/ruoyi-gateway/ruoyi-gateway:v1.0
修改ruoyi-gateway连接数据库信息,登录nacos修改 ruoyi-gateway-dev.yml 配置文件
bash
spring:
redis:
host: ruoyi-redis-svc.ruoyi-cloud.svc.cluster.local
port: 6379
password:
cloud:
# 增加连接sentinel信息,一定注意该文件自带cloud,不要在增加cloud字段了
sentinel:
# 取消控制台懒加载
eager: true
transport:
# sentinel控制台地址
dashboard: sentinel-svc.ruoyi-cloud.svc.cluster.local:8718
gateway:
通过deployment部署ruoyi-gateway
bash
apiVersion: apps/v1
kind: Deployment
metadata:
name: ruoyi-gateway
namespace: ruoyi-cloud
spec:
replicas: 1
selector:
matchLabels:
app: gateway
template:
metadata:
labels:
app: gateway
spec:
containers:
- name: gateway
image: 49.235.163.3/ruoyi-gateway/ruoyi-gateway:v1.0
ports:
- containerPort: 8080
readinessProbe: #定义就绪探针
tcpSocket: #通过端口探测
port: 8080 #端口
initialDelaySeconds: 30 #容器启动后等待30秒执行探测
periodSeconds: 3 #执行探测频率为3秒
---
apiVersion: v1
kind: Service
metadata:
name: gateway-svc
namespace: ruoyi-cloud
spec:
selector:
app: gateway
ports:
- port: 8080
targetPort: 8080
提示:gateway需要service是应为UI不会通过nacos中获取到gateway地址(UI无法访问nacos,UI直接将请求给网关,网关从nacos中获取各个微服务地址信息),所以需要配置代理给UI连接。
bash
#创建Pod
[root@master01 ~/rouyi-cloud]#kubectl create -f ruoyi-gateway.yml
deployment.apps/ruoyi-gateway created
service/gateway-svc created
#查看pod
[root@master01 ~/rouyi-cloud]#kubectl get pod -n ruoyi-cloud
NAME READY STATUS RESTARTS AGE
nacos-0 1/1 Running 1 (5h43m ago) 6h9m
nacos-1 1/1 Running 1 (5h43m ago) 6h9m
nacos-mysql-0 1/1 Running 4 (4h12m ago) 8h
ruoyi-auth-684c7bb7cf-67mjg 1/1 Running 1 (12m ago) 42m
ruoyi-gateway-9b955dc-bv7v8 1/1 Running 0 54s
ruoyi-mysql-0 1/1 Running 0 4h32m
ruoyi-redis-685cccbb84-mwnmt 1/1 Running 0 4h29m
ruoyi-system-576dfbd66f-7gfsk 1/1 Running 2 (112m ago) 3h35m
sentinel-server-68d48f99d9-7gcs6 1/1 Running 0 4h50m
skywalking-oap-757b55888b-hrmz7 1/1 Running 44 (56s ago) 4h46m
skywalking-ui-7f7fbf5789-8h22t 1/1 Running 1 (172m ago) 4h42m
#查看日志
kubectl logs ruoyi-gateway-9b955dc-bv7v8 -n ruoyi-cloud
部署ruoyi-monitor监控中心
进入RuoYi-Cloud目录打包ruoyi-monitor项目
bash
[root@harbor ~]# cd RuoYi-Cloud/
[root@harbor RuoYi-Cloud]# mvn package -Dmaven.test.skip=true -pl ruoyi-visual/ruoyi-monitor/ -am
制作镜像
bash
[root@harbor RuoYi-Cloud]# cd ruoyi-visual/ruoyi-monitor/
[root@harbor ruoyi-monitor]# cat dockerfile
FROM openjdk:8-jre-alpine
COPY ./target/*.jar /ruoyi-monitor.jar
COPY ./entrypoint.sh /
RUN chmod +x /entrypoint.sh
ADD ./apache-skywalking-java-agent-8.15.0.tgz /
EXPOSE 9100
CMD ["/bin/sh","-c","/entrypoint.sh"]
#在当前目录准备SkyWalking Agent客户端程序
[root@harbor ruoyi-gateway]# ls
apache-skywalking-java-agent-8.15.0.tgz
#定义entrypoint.sh启动脚本
java -javaagent:/skywalking-agent/skywalking-agent.jar \
-Dskywalking.agent.service_name=ruoyi-monitor \
-Dskywalking.collector.backend_service=skywalking-oap-svc.ruoyi-cloud.svc.cluster.local:11800 \
-Dspring.profiles.active=dev \
-Dspring.cloud.nacos.config.file-extension=yml \
-Dspring.cloud.nacos.discovery.server-addr=nacos-svc.ruoyi-cloud.svc.cluster.local:8848 \
-Dspring.cloud.nacos.config.server-addr=nacos-svc.ruoyi-cloud.svc.cluster.local:8848 \
-jar /ruoyi-monitor.jar
构建镜像并上传镜像到仓库(创建ruoyi-monitor公开仓库)
bash
docker build -f dockerfile -t ruoyi-monitor:v1.0 .
#打标签
[root@harbor ruoyi-monitor]# docker tag ruoyi-monitor:v1.0 49.235.163.3/ruoyi-monitor/ruoyi-monitor:v1.0
#推送到harbor仓库
[root@harbor ruoyi-monitor]# docker push 49.235.163.3/ruoyi-monitor/ruoyi-monitor:v1.0
修改ruoyi-monitor用户名与密码,登录nacos修改 ruoyi-monitor-dev.yml 配置文件 (默认不用改)。
bash
# spring
spring:
security:
user:
name: ruoyi
password: 123456
boot:
admin:
ui:
title: 若依服务状态监控
通过deployment部署ruoyi-monitor
bash
#创建pod
[root@master01 ~/rouyi-cloud]#kubectl create -f ruoyi-monitor.yml
deployment.apps/ruoyi-monitor created
service/monitor-svc created
ingress.networking.k8s.io/monitor-ingress created
#查看pod
[root@master01 ~/rouyi-cloud]#kubectl logs skywalget podloud
NAME READY STATUS RESTARTS AGE
nacos-0 1/1 Running 1 (6h27m ago) 6h53m
nacos-1 1/1 Running 1 (6h26m ago) 6h53m
nacos-mysql-0 1/1 Running 4 (4h55m ago) 8h
ruoyi-auth-684c7bb7cf-67mjg 1/1 Running 1 (56m ago) 85m
ruoyi-gateway-9b955dc-bv7v8 1/1 Running 2 (5m22s ago) 44m
ruoyi-monitor-f68b64567-7ndqz 1/1 Running 0 8m44s
ruoyi-mysql-0 1/1 Running 0 5h16m
ruoyi-redis-685cccbb84-mwnmt 1/1 Running 0 5h12m
ruoyi-system-576dfbd66f-7gfsk 1/1 Running 5 (4m47s ago) 4h19m
sentinel-server-68d48f99d9-7gcs6 1/1 Running 0 5h34m
skywalking-oap-757b55888b-hrmz7 1/1 Running 52 (5m22s ago) 5h29m
skywalking-ui-7f7fbf5789-8h22t 1/1 Running 1 (3h36m ago) 5h26m
部署ruoyi-ui前端框架
修改ruoyi-ui连接gateway的地址(在k8s中解析gateway地址然后修改)
bash
#解析gateway地址
[root@master01 ~/rouyi-cloud]#dig gateway-svc.ruoyi-cloud.svc.cluster.local @172.18.235.2 +short
10.96.92.35
#修改配置文件
[root@harbor ~]# cd RuoYi-Cloud/ruoyi-ui/
[root@harbor ruoyi-ui]# vim vue.config.js
#...
devServer: {
host: '0.0.0.0',
port: port,
open: true,
proxy: {
// detail: https://cli.vuejs.org/config/#devserver-proxy
[process.env.VUE_APP_BASE_API]: {
target: `http://gateway-svc.ruoyi-cloud.svc.cluster.local:8080`, #连接网关地址及端口
构建ruoyi-ui前端框架
bash
#构建和打包vue前端项目需要安装npm、nodejs来安装、更新和管理项目的第三方库或工具。
[root@harbor ruoyi-ui]# yum install npm nodejs -y
#安装当前项目的所有依赖,指定依赖的仓库地址
[root@harbor ruoyi-ui]# npm install --registry=https://registry.npmmirror.com
#构建并打包
[root@harbor ruoyi-ui]# npm run build:prod
...
Build complete. The dist directory is ready to be deployed.
制作ruoyi-ui镜像
bash
[root@harbor ruoyi-ui]# cat dockerfile
#定义基础镜像
FROM nginx:1.20.0
#拷贝./dist目录下内容到/code目录即可,端口和启动命令无需定义,nginx镜像本身已经定义好了
COPY ./dist/ /code/
bash
构建镜像并上传镜像到仓库(创建ruoyi-ui公开仓库)
[root@harbor ruoyi-ui]# docker build -f dockerfile -t ruoyi-ui:v1.0 .
[root@harbor ruoyi-ui]# docker tag ruoyi-ui:v1.0 49.235.163.3/ruoyi-ui/ruoyi-ui:v1.0
[root@harbor ruoyi-ui]# docker push 49.235.163.3/ruoyi-ui/ruoyi-ui:v1.0
创建configMap存储ruoyi-ui站点文件
bash
[root@k8s-master01 ruoyi-cloud]# vim ruoyi-ui.conf
server {
listen 80;
server_name web.ruoyi.com; #定义访问的域名
charset utf-8;
root /code; #定义站点目录
location / {
try_files $uri $uri/ /index.html;
index index.html index.htm;
}
location /prod-api/ {
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header REMOTE-HOST $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://gateway-svc.ruoyi-cloud.svc.cluster.local:8080/; #需要修改连接网关地址
}
}
#创建configMap
[root@k8s-master01 ruoyi-cloud]# kubectl -n ruoyi-cloud create configmap ruoyi-ui-conf --from-file=./ruoyi-ui.conf
通过deployment部署ruoyi-ui
bash
apiVersion: apps/v1
kind: Deployment
metadata:
name: ruoyi-ui
namespace: ruoyi-cloud
spec:
replicas: 1
selector:
matchLabels:
app: ui
template:
metadata:
labels:
app: ui
spec:
containers:
- name: ui
image: 49.235.163.3/ruoyi-ui/ruoyi-ui:v1.0
ports:
- containerPort: 80
readinessProbe: #定义就绪探针
tcpSocket: #通过端口探测
port: 80 #端口
initialDelaySeconds: 10 #容器启动后等待10秒执行探测
periodSeconds: 3 #执行探测频率为3秒
volumeMounts:
- name: config
mountPath: /etc/nginx/conf.d/
volumes:
- name: config
configMap:
name: ruoyi-ui-conf
---
apiVersion: v1
kind: Service
metadata:
name: ui-svc
namespace: ruoyi-cloud
spec:
selector:
app: ui
ports:
- port: 80
targetPort: 80
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: ui-ingress
namespace: ruoyi-cloud
spec:
ingressClassName: "nginx"
rules:
- host: "web.ruoyi.com"
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: ui-svc
port:
number: 80
bash
#创建Pod
[root@master01 ~/rouyi-cloud]#kubectl create -f ruoyi-ui.yml
deployment.apps/ruoyi-ui created
service/ui-svc created
ingress.networking.k8s.io/ui-ingress created
#
配置本地解析后,访问:http://web.ruoyi.com,微服务项目部署成功
