写在前面:

若依(RuoYi)Cloud 是一套基于 Spring Cloud、Spring Boot、Vue 等技术栈构建的开源微服务权限管理系统,功能完整、结构清晰,广泛应用于企业级后台系统开发。在实际使用中,将 RuoYi-Cloud 部署到 Kubernetes 上,不仅可以实现微服务的高可用、自动扩缩、统一管理,还能配合 CI/CD 实现持续交付,极大提升开发运维效率。

本篇博客将详细介绍如何通过编写 YAML 文件的方式,将 RuoYi-Cloud 从中间件到业务模块逐步部署到 Kubernetes 集群中,包括 MySQL、Redis、Nacos等中间件的部署配置,以及各个微服务的启动管理等。适合有一定 K8s 基础,希望将若依微服务架构进行容器化部署的开发者与运维人员参考使用,本文分为上下两篇,上篇主要讲解各个中间件的部署,下面主要讲解各个应用服务的部署。

内容概述:

  1. 环境准备

  2. 部署中间件

1. 环境准备

基础环境

项目

版本/说明

Kubernetes

1.28.0

容器运行时

containerd

操作系统

Ubuntu24.02

节点规划

单节点

私有镜像仓库

registry

依赖组件

组件

镜像版本

MySQL

8.0.32-oracle

Redis

6.2

Nacos

2.1.0

2. 部署中间件

部署 MySQL

--- 1. 目录结构准备
mysql
├── configmap.yaml         ## 用于挂载my.cnf的配置文件
├── deployment.yaml        ## 使用deployment 控制器
├── pvc.yaml               ## 数据卷持久化
└── service.yaml           ## 暴露端口,用于测试
--- 2. 部署pvc,这里我使用nfs挂载存储,自行准备nfs共享目录哦
apiVersion: v1
kind: PersistentVolume
metadata:
  name: mysql-pv
  labels:
   apps: mysql
spec:
  accessModes:
  - ReadWriteMany
  nfs:
   ## NFS的服务端地址和共享路径
   server: 192.168.0.160
   path: /data/nfs/mysql
  persistentVolumeReclaimPolicy: Retain
  capacity: 
    storage: 5Gi
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: mysql-pvc
  labels:
    apps: mysql
spec:
  accessModes:
  - ReadWriteMany
  resources:
    requests:
      storage: 2Gi
  volumeName: mysql-pv
--- 3. 部署configmap,这里是为了挂载数据库的配置文件,可以自行修改my.cnf的内容
apiVersion: v1
kind: ConfigMap
metadata:
  name: mysql-config 
data:
  ## 初始化数据库
  MYSQL_ROOT_PASSWORD: "123456"
  MYSQL_DATABASE: "ry-cloud"
  my.cnf: |-
   [client]
   default-character-set=utf8mb4 
   [mysql]
   default-character-set=utf8mb4
   [mysqld]
   init_connect='SET collation_connection = utf8mb4_unicode_ci'
   init_connect='SET NAMES utf8mb4'
   character-set-server=utf8mb4
   collation-server=utf8mb4_unicode_ci
   skip-character-set-client-handshake
   skip-name-resolve
--- 4. 部署deployment 
apiVersion: apps/v1
kind: Deployment
metadata: 
  name: mysql-deployment
spec:
  replicas: 1
  selector: 
    matchLabels:
      apps: mysql
  template:
    metadata:
      labels:
        apps: mysql
    spec:
     volumes:
     - name: mysql-storage
       persistentVolumeClaim:
        claimName: mysql-pvc
     - name: mysql-config
       configMap:
        name: mysql-config
     containers:
     - name: mysql
       ## 这里的镜像使用我自己的私有仓库
       image: 192.168.0.77:32237/uat/mysql:8.0.32-oracle
       ports:
        - containerPort: 3306
       env:
       - name: MYSQL_ROOT_PASSWORD
         valueFrom:
          configMapKeyRef:
            name: mysql-config
            key: MYSQL_ROOT_PASSWORD
       - name: MYSQL_DATABASE
         valueFrom:
          configMapKeyRef:
            name: mysql-config
            key: MYSQL_DATABASE
       volumeMounts:
       - name: mysql-storage
         mountPath: /var/lib/mysql
       - name: mysql-config
         mountPath: /etc/mysql/conf.d/my.cnf
         subPath: my.cnf
--- 5. 部署service,这里我用nodePort暴露端口便于测试
apiVersion: v1
kind: Service
metadata:
  name: mysql-service 
spec: 
  selector:
    apps: mysql
  type: NodePort
  ports:
  - port: 3306
    targetPort: 3306
    protocol: TCP
    nodePort: 30084

使用navicat测试连接,同是将若依的sql文件导入数据库

部署 redis

 --- 1. 目录结构准备
redis
├── depolyment.yaml
├── pvc.yaml
└── service.yaml
--- 2. 部署pvc,注意点同上
apiVersion: v1
kind: PersistentVolume
metadata:
  name: redis-pv
  labels:
   apps: redis
spec:
  accessModes:
  - ReadWriteMany
  nfs:
   server: 192.168.0.160
   path: /data/nfs/redis
  persistentVolumeReclaimPolicy: Retain
  capacity: 
    storage: 5Gi

---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: redis-pvc
  labels:
    apps: redis
spec:
  accessModes:
  - ReadWriteMany
  resources:
    requests:
      storage: 2Gi
  volumeName: redis-pv
--- 3. 部署deployment,注意点同上
apiVersion: apps/v1
kind: Deployment
metadata: 
  name: redis-deployment
spec:
  replicas: 1
  selector: 
    matchLabels:
      apps: redis
  template:
    metadata:
      labels:
        apps: redis
    spec:
     volumes:
     - name: redis-storage
       persistentVolumeClaim:
        claimName: redis-pvc  
     containers:
     - name: redis
       image: 192.168.0.77:32237/uat/redis:6.2.18-alpine
       ports:
        - containerPort: 6379
       volumeMounts:
       - name: redis-storage
         mountPath: /data
--- 4. 部署service,注意点同上
apiVersion: v1
kind: Service
metadata:
  name: redis-service 
spec: 
  selector:
    apps: redis
  type: NodePort
  ports:
  - port: 6379
    targetPort: 6379
    protocol: TCP
    nodePort: 30085

使用navicat测试连接

部署 nacos

--- 1. 目录结构准备
nacos
├── configmap.yaml
├── deployment.yaml
├── pvc.yaml
└── service.yaml
--- 2. 部署pvc,注意点同上
apiVersion: v1
kind: PersistentVolume
metadata:
  name: nacos-pv
  labels:
   apps: nacos
spec:
  accessModes:
  - ReadWriteMany
  nfs:
   server: 192.168.0.160
   path: /data/nfs/nacos
  persistentVolumeReclaimPolicy: Retain
  capacity: 
    storage: 5Gi

---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: nacos-pvc
  labels:
    apps: nacos
spec:
  accessModes:
  - ReadWriteMany
  resources:
    requests:
      storage: 2Gi
  volumeName: nacos-pv
--- 3. 部署config,注意修改数据库的地址
apiVersion: v1
kind: ConfigMap
metadata:
  name: nacos-config
data:
  application.properties: |
   server.servlet.contextPath=/nacos
   server.port=8848
   spring.datasource.platform=mysql
   db.num=1
   ### 连接数据库地址注意账号和密码:
   db.url.0=jdbc:mysql://mysql-service:3306/ry_config?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=UTC
   db.user.0=root
   db.password.0=123456
   db.pool.config.connectionTimeout=30000
   db.pool.config.validationTimeout=10000
   db.pool.config.maximumPoolSize=20
   db.pool.config.minimumIdle=2
   nacos.naming.empty-service.auto-clean=true
   nacos.naming.empty-service.clean.initial-delay-ms=50000
   nacos.naming.empty-service.clean.period-time-ms=30000
   management.metrics.export.elastic.enabled=false
   management.metrics.export.influx.enabled=false
   server.tomcat.accesslog.enabled=true
   server.tomcat.accesslog.pattern=%h %l %u %t "%r" %s %b %D %{User-Agent}i %{Request-Source}i
   nacos.security.ignore.urls=/,/error,/**/*.css,/**/*.js,/**/*.html,/**/*.map,/**/*.svg,/**/*.png,/**/*.ico,/console-ui/public/**,/v1/auth/**,/v1/console/health/**,/actuator/**,/v1/console/server/**
   nacos.core.auth.system.type=nacos
   nacos.core.auth.enabled=false
   nacos.core.auth.caching.enabled=true
   nacos.core.auth.enable.userAgentAuthWhite=false
   nacos.core.auth.server.identity.key=serverIdentity
   nacos.core.auth.server.identity.value=security
   nacos.core.auth.plugin.nacos.token.expire.seconds=18000
   nacos.core.auth.plugin.nacos.token.secret.key=SecretKey012345678901234567890123456789012345678901234567890123456789
   nacos.istio.mcp.server.enabled=false
--- 4. 部署deployment
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nacos
spec:
  replicas: 1
  selector:
    matchLabels:
      app: nacos
  template:
    metadata:
      labels:
        app: nacos
    spec:
      volumes:
      - name: nacos-data
        persistentVolumeClaim:
          claimName: nacos-pvc
      - name: nacos-config
        configMap:
          name: nacos-config
      containers:
      - name: nacos
        ## 注意nacos 镜像版本
        image: 192.168.0.77:32237/uat/nacos:2.1.0 
        ports:
        - containerPort: 8848
        env:
        - name: MODE
          value: standalone
        volumeMounts:
        - name: nacos-data
          mountPath: /home/nacos/data
        - name: nacos-config
          ## 配置文件挂载位置
          mountPath: /home/nacos/conf/application.properties 
          subPath: application.properties
--- 5. 部署service
apiVersion: v1
kind: Service
metadata:
  name: nacos-service 
spec: 
  selector:
    app: nacos
  type: NodePort
  ports:
  - port: 8848
    targetPort: 8848
    protocol: TCP
    nodePort: 30086

浏览器访问:IP地址:30086/nacos

克隆dev环境到prod名称空间中

注意:

提前修改nacos线上配置,确认好每个中间件的连接地址是否正确

nacos配置文件中的中间件例如redis、mysql等链接地址一定是集群内的访问地址