【Linux运维大神系列】k8s项目部署实战

目录

微服务项目部署

什么是微服务?

微服务项目介绍

微服务组件介绍

k8s中部署微服务项目

微服务注册中心Nacos

微服务流量控制Sentinel

微服务链路追踪Skywalking

部署微服务数据层

微服务Ruoyi-Cloud组件部署

部署ruoyi-api-system模块

部署ruoyi-auth认证中心

部署ruoyi-gateway网关模块

部署ruoyi-monitor监控中心

部署ruoyi-ui前端框架

微服务项目部署

什么是微服务?

传统项目特点:传统项目就是把所有的业务功能写在一个项目中,最终打包成一个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熔断和降级组件:由阿里巴巴开源的一款轻量级的流量控制、熔断和降级组件,在微服务架构中,起到以下作用:

  1. 流量控制:在微服务环境中,由于服务之间存在大量的通信,因此需要对这些通信的流量进行控制,以防止因为流量过大而导致服务崩溃。Sentinel可以通过定义一些流量控制规则(例如,限制单位时间内的请求次数)来实现流量控制。

  2. 熔断机制:当某个服务出现问题(例如,响应时间过长或者失败率过高)时,为了防止问题扩大,可以通过熔断机制将这个服务"断开",即停止向这个服务发送请求。这可以避免问题服务影响到其他服务或整个系统。

  3. 降级处理:降级处理是指当某个服务出现问题或者系统负载过高时,暂时停止提供部分功能,只提供核心功能,以此来保护系统的稳定。Sentinel可以通过定义一些降级规则来实现降级处理。

Sentinel在微服务架构中起到了保护系统稳定性和可用性的重要作用,它可以帮助微服务系统在面临流量过大、服务出问题等情况时,做出相应的处理,防止整个系统的瘫痪。

  • Ribbon服务调用组件:是开源的一个云中间件,在微服务架构中,一个微服务可能会有多个实例在运行。Ribbon可以将客户端的请求分发到不同的微服务实例上,实现负载均衡。

  • Sidecar是一种架构的设计模式,是指为主应用程序提供了额外的附加功能,如监控、配置、网络通信、代理等。

  • 异构服务:在微服务架构中,"异构服务"指的是使用不同的技术栈(如编程语言、数据库、框架等)创建的服务。因为它可以让每个微服务根据自己的业务需求和技术需求选择最适合的技术栈。

    例如,一些服务可能更适合使用Java和Spring Boot来开发,而其他服务可能更适合使用Python和Django。同样,一些服务可能更适合使用关系型数据库如MySQL,而其他服务可能更适合使用非关系型数据库如MongoDB。

    异构性的优点包括更大的灵活性。开发团队可以根据每个服务的具体需求选择最适合的技术,而不是被迫使用一个统一的技术栈。

Zipkin/SkyWalking链路追踪组件:Apache SkyWalking在微服务架构中提供了链路追踪的功能,起到以下作用:

  1. 分布式追踪:SkyWalking可以为微服务架构中的每个服务调用提供追踪数据,帮助开发者理解各个服务之间的交互和依赖关系,找出性能瓶颈或故障源头。

  2. 性能监控:SkyWalking收集各种性能指标,包括服务、服务实例和端点的响应时间、吞吐量等,使开发者能够实时掌握系统的性能状态。

  3. 拓扑图分析:SkyWalking能够展示微服务架构中服务之间的拓扑关系,使系统的调用关系一目了然。

  4. 告警:SkyWalking可以根据预设的规则生成告警,及时通知开发者系统存在的问题。

  5. 度量聚合:SkyWalking不仅可以收集和展示实时的监控数据,还可以聚合这些数据,提供更长时间范围内的性能趋势分析。

  6. 支持服务网格:SkyWalking可以与服务网格(如Istio等)集成,为服务网格提供观察性分析。

总的来说,SkyWalking是一个强大的观察性工具,能够帮助开发者更好地理解和优化微服务系统的性能和稳定性。

Spring Boot Admin服务监控组件:用于管理和监控Spring Boot应用程序,但是Spring Boot Admin Server并不适用于生产环境,因为它会暴露一些敏感信息,可能会带来安全风险。在生产环境中,应该使用更专业的监控系统,如Prometheus、Grafana等。

Quartz任务调度组件:主要用于管理和调度后台任务,可以集成到任何Java应用程序中,在微服务架构中,起到以下作用:

  1. 定时任务:Quartz可以用于执行定时任务,例如每天凌晨清理日志,每小时汇总统计数据等。

  2. 重复任务:Quartz也可以用于执行重复的任务,例如每隔5分钟检查系统状态,每隔10分钟同步数据等。

  3. 长时间运行的任务:对于一些需要运行很长时间的任务,例如数据处理和分析,也可以使用Quartz来调度和管理。

  4. 集群任务调度:Quartz还提供了集群支持,可以在多个节点上均衡执行任务,提高系统的可用性和性能。

  5. 作业持久化:Quartz支持作业的持久化,即使应用程序重启,持久化的作业也不会丢失,会在合适的时候继续执行。

  6. 灵活的调度策略: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,微服务项目部署成功

相关推荐
懒鸟一枚1 小时前
k8s 之 Kubernetes服务发布基础
云原生·容器·kubernetes
杰克崔1 小时前
android的lmkd的实现及代码分析
android·linux·运维·服务器·车载系统
Codefengfeng1 小时前
webshell流量分析-Practice1
linux·web安全
BullSmall1 小时前
从2026年春晚 详细分析未来IT行业的发展
linux·运维·服务器·数据库
星融元asterfusion1 小时前
打破“黑盒”:RoCE小工具为RDMA网络运维带来可视化曙光
运维·rdma·会话追踪
Exquisite.1 小时前
4、云原生 --- nginx
运维·nginx
你的论文学长1 小时前
从 Base Code 生成到 AST 语义重构:详解学术长文本的自动化质控方案
运维·人工智能·重构·自动化·论文
林姜泽樾2 小时前
centOS改中文输入法教程
linux·运维·服务器·centos
小杰帅气2 小时前
POSIX信号量
linux·运维·服务器