使用 KubeSphere 部署 Ruoyi-Cloud · KS 实践 02

Hailiang Zhao | 2021/11/14

Categories: practice Tags: Kubernetes KubeSphere


在上一篇文章中,笔者介绍了 KubeSphere 的安装与基本使用。在本文中,我们将通过 KubeSphere 部署一个典型的中小型项目 Ruoyi-Cloud。 Ruoyi-Cloud 的正确运行需要很多中间件和微服务被正确启动。KubeSphere 为我们提供了几乎全部配置行为的 UI,让我们彻底从编写 yaml 文件的负担中解脱。

1 Ruoyi-Cloud 项目介绍

Ruoyi-Cloud 是一套开源的快速开发平台,其开源地址为 https://gitee.com/y_project/RuoYi-Cloud。 Ruoyi-Cloud 采用前后端分离的模式,前端基于 Vue 实现,后端基于 Spring Boot、Spring Cloud 和 Alibaba 的部分开源产品实现。 其包含的模块有:

(base) ➜  RuoYi-Cloud git:(master) tree -L 2
...
├── pom.xml                     # 公共依赖
├── ruoyi-api                   # 接口模块
│   ├── pom.xml
│   ├── ruoyi-api-system
├── ruoyi-auth                  # 认证中心 [9200]
│   ├── pom.xml
│   ├── src
│   └── target
├── ruoyi-common                # 通用模块
│   ├── pom.xml
│   ├── ruoyi-common-core           # 核心模块
│   ├── ruoyi-common-datascope      # 权限范围
│   ├── ruoyi-common-datasource     # 多数据源
│   ├── ruoyi-common-log            # 日志记录
│   ├── ruoyi-common-redis          # 缓存服务
│   ├── ruoyi-common-security       # 安全模块
│   ├── ruoyi-common-swagger        # 系统接口
├── ruoyi-gateway               # 网关模块 [8080]
│   ├── pom.xml
│   ├── src
│   └── target
├── ruoyi-modules               # 业务模块
│   ├── pom.xml
│   ├── ruoyi-file              # 文件服务 [9300]
│   ├── ruoyi-gen               # 代码生成 [9202]
│   ├── ruoyi-job               # 定时任务 [9203]
│   └── ruoyi-system            # 系统模块 [9201]
├── ruoyi-ui                    # 前端框架 [80]
│   ├── README.md
│   ├── babel.config.js
│   ├── bin
│   ├── build
│   ├── node_modules
│   ├── package-lock.json
│   ├── package.json
│   ├── public
│   ├── src
│   └── vue.config.js
├── ruoyi-visual                # 图形化管理模块
│   ├── pom.xml
│   ├── ruoyi-monitor           # 监控中心 [9100]
└── sql                         # 项目默认配置与演示数据
    ├── quartz.sql
    ├── ry_20210908.sql
    ├── ry_config_20210730.sql
    └── ry_seata_20210128.sql
...
44 directories, 36 files

Ruoyi-Cloud 的系统架构如图 1 所示。可以发现,Ruoyi-Cloud 的运行依赖于很多中间件应用。 它选择 nacos(https://nacos.io/zh-cn/)作为系统的注册和配置中心, 而 nacos 依赖于 mysql 之类的数据库实现配置的持久化存储。除此之外,它还用到了 redis(用于权限认证)和 sentinel(用于流量控制)1,此处不再一一介绍。

图 1 Ruoyi-Cloud 系统架构(来自 Ruoyi-Cloud 开源地址)。

2 在本地部署 Ruoyi-Cloud 项目

在本机(macOS 10.15)部署 Ruoyi-Cloud,首先要做的事情,当然是安装 mysql 和 redis。前者建议在官网下载安装包(.pkg 文件)进行安装,后者使用 brew 安装即可。 完成安装之后,我们首先在 macOS 的系统设置中启动 mysql 服务。 接下来,我们约定放置项目的根目录为 PROJ,然后将 nacos 和 Ruoyi-Cloud 分别拉取到本目录下。

在 Ruoyi-Cloud 中,我们首先应该启动的是 nacos,它作为整个系统的服务注册中心和配置管理中心,为项目内的各类微服务提供了服务发现和配置获取的功能。

2.1 启动 nacos

首先,我们需要下载源码(笔者拉取的版本为 2.1.0-SNAPSHOT),并通过 maven 对源码进行构建:

(base) ➜  nacos git:(develop) mvn -Prelease-nacos -Dmaven.test.skip=true clean install -U
...
[INFO] ------------------------------------------------------------------------
[INFO] Reactor Summary for Alibaba NACOS 2.1.0-SNAPSHOT 2.1.0-SNAPSHOT:
[INFO]
[INFO] Alibaba NACOS 2.1.0-SNAPSHOT ....................... SUCCESS [02:37 min]
[INFO] nacos-api 2.1.0-SNAPSHOT ........................... SUCCESS [ 46.456 s]
[INFO] nacos-common 2.1.0-SNAPSHOT ........................ SUCCESS [ 13.330 s]
[INFO] nacos-consistency 2.1.0-SNAPSHOT ................... SUCCESS [ 14.848 s]
[INFO] nacos-sys 2.1.0-SNAPSHOT ........................... SUCCESS [ 21.455 s]
[INFO] nacos-auth 2.1.0-SNAPSHOT .......................... SUCCESS [  4.466 s]
[INFO] nacos-core 2.1.0-SNAPSHOT .......................... SUCCESS [ 29.509 s]
[INFO] nacos-config 2.1.0-SNAPSHOT ........................ SUCCESS [ 32.202 s]
[INFO] nacos-cmdb 2.1.0-SNAPSHOT .......................... SUCCESS [  0.708 s]
[INFO] nacos-naming 2.1.0-SNAPSHOT ........................ SUCCESS [ 15.842 s]
[INFO] nacos-address 2.1.0-SNAPSHOT ....................... SUCCESS [  0.782 s]
[INFO] nacos-client 2.1.0-SNAPSHOT ........................ SUCCESS [ 45.242 s]
[INFO] nacos-istio 2.1.0-SNAPSHOT ......................... SUCCESS [ 17.854 s]
[INFO] nacos-console 2.1.0-SNAPSHOT ....................... SUCCESS [ 32.679 s]
[INFO] nacos-test 2.1.0-SNAPSHOT .......................... SUCCESS [  5.261 s]
[INFO] nacos-config-test 2.1.0-SNAPSHOT ................... SUCCESS [  0.293 s]
[INFO] nacos-naming-test 2.1.0-SNAPSHOT ................... SUCCESS [  0.342 s]
[INFO] nacos-core-test 2.1.0-SNAPSHOT ..................... SUCCESS [  0.465 s]
[INFO] nacos-example 2.1.0-SNAPSHOT ....................... SUCCESS [  0.599 s]
[INFO] nacos-distribution 2.1.0-SNAPSHOT .................. SUCCESS [ 13.970 s]
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  07:51 min
[INFO] Finished at: 2021-11-13T14:57:30+08:00
[INFO] ------------------------------------------------------------------------

构建完毕之后,进入 PROJ/nacos/distribution/target/nacos-server-2.1.0-SNAPSHOT/nacos/bin 目录,以单节点模式(standalone)启动 nacos:

(base) ➜  bin git:(develop) ✗ ./startup.sh -m standalone
...
nacos is starting with standalone
nacos is starting,you can check the /Users/hliangzhao/Documents/GitHub/nacos/distribution/target/nacos-server-2.1.0-SNAPSHOT/nacos/logs/start.out
(base) ➜  bin git:(develop) ✗ cat /Users/hliangzhao/Documents/GitHub/nacos/distribution/target/nacos-server-2.1.0-SNAPSHOT/nacos/logs/start.out
/Library/Java/JavaVirtualMachines/jdk-11.0.1.jdk/Contents/Home/bin/java   -Xms512m -Xmx512m -Xmn256m -Dnacos.standalone=true -Dnacos.member.list= -Xlog:gc*:...

         ,--.
       ,--.'|
   ,--,:  : |                                           Nacos 2.1.0-SNAPSHOT
,`--.'`|' :                       ,---.               Running in stand alone mode, All function modules
|   :  :  | |                      ','\   .--.--.    Port: 8848
:   |   \ | :  ,--.--.     ,---.  /   /   | /  /    '   Pid: 31302
|   : ' '; | /       \   /     \.   ; ,. :|  :  /`./   Console: http://10.192.179.235:8848/nacos/index.html
'' ;.    ;.--.  .-. | /    /''   | |: :|  :  ;_
|   | | \   | \__\/: . ..    '/'   | .; : \  \    `.      https://nacos.io
': |  ; .' ,".--.; |'   ; :__|   :    |  `----.   \
|   | '`--'  /  /  ,.  |'|'.'|\   \  /  /  /`--'  /
': |     ;  :   .'   \   :    : `----''--'.     /
;   |.'|  ,     .-./\   \  /            `--'---'
'---'        `--`---'`----'

...
2021-11-13 15:17:10,281 INFO Tomcat initialized with port(s): 8848 (http)
2021-11-13 15:17:10,850 INFO Root WebApplicationContext: initialization completed in 5999 ms

以用户名 nacos、密码 nacos 登录 http://localhost:8848/nacos/index.html,可以看到一切已经正常启动:

图 2 Nacos 控制面板。

2.2 在 nacos 中配置 Ruoyi-Cloud

接下来,我们需要将 Ruoyi-Cloud 的默认配置导入到 nacos 中。 首先,我们需要在 mysql 中创建数据库 ry-config,然后进入 PROJ/RuoYi-Cloud/sql 目录, 通过 mysql -u root -p ry-config < ry_config_20210730.sql 将项目默认配置写入数据库 ry-config 中:

(base) ➜  sql git:(master) lsa
total 184
drwxr-xr-x@  6 hliangzhao  staff   192B Nov 13 15:22 .
drwxr-xr-x@ 19 hliangzhao  staff   608B Nov 13 15:59 ..
-rw-r--r--   1 hliangzhao  staff    12K Nov 13 14:34 quartz.sql                 # Ruoyi-CLoud 自带带数据
-rw-r--r--   1 hliangzhao  staff    55K Nov 13 14:34 ry_20210908.sql            # Ruoyi-CLoud 自带带数据
-rw-r--r--   1 hliangzhao  staff    20K Nov 13 14:34 ry_config_20210730.sql     # Ruoyi-CLoud 的默认配置(执行本文件)
-rw-r--r--   1 hliangzhao  staff   3.0K Nov 13 14:34 ry_seata_20210128.sql      # Ruoyi-CLoud 自带带数据
(base) ➜  sql git:(master) mysql -u root -p ry-config < ry_config_20210730.sql
Enter password:

然后,我们将 nacos 中的启动配置所在的数据库修改为 ry-config。 具体地,我们进入 PROJ/nacos/distribution/target/nacos-server-2.1.0-SNAPSHOT/nacos/conf 目录,修改 applicaiton.properties

(base) ➜  nacos git:(develop) ✗ cd distribution/target/nacos-server-2.1.0-SNAPSHOT/nacos/conf
(base) ➜  conf git:(develop) ✗ ll
total 176
-rw-r--r--  1 hliangzhao  staff   1.2K Nov 13 14:49 1.4.0-ipv6_support-update.sql
-rw-r--r--  1 hliangzhao  staff   9.3K Nov 13 14:49 application.properties
-rw-r--r--  1 hliangzhao  staff   9.3K Nov 13 14:49 application.properties.example
-rw-r--r--  1 hliangzhao  staff   670B Nov 13 14:49 cluster.conf.example
-rw-r--r--  1 hliangzhao  staff    30K Nov 13 14:49 nacos-logback.xml
-rw-r--r--  1 hliangzhao  staff    10K Nov 13 14:49 nacos-mysql.sql
-rw-r--r--  1 hliangzhao  staff   8.6K Nov 13 14:49 schema.sql
(base) ➜  conf git:(develop) ✗ vim application.properties
# 需要修改与数据库连接相关的配置
## If use mysql as datasource:
spring.datasource.platform=mysql
## Count of DB:
db.num=1
## Connect URL of DB:
db.url.0=jdbc:mysql://127.0.0.1:3306/ry-config?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=fal    se&serverTimezone=UTC
db.user.0=root
db.password.0=your-passwd

导入 Ruoyi-Cloud 配置后,重新启动 nacos,应该可以看到 Ruoyi-Cloud 项目内各个微服务的配置文件已经可以被正常发现:

图 3 导入 Ruoyi-Cloud 项目配置后的 nacos 控制面板。

紧接着,我们将 Ruoyi-Cloud 项目自带的一些数据导入数据库中用于演示——依次执行 PROJ/RuoYi-Cloud/sql 目录下的 quartz.sqlry_20210908.sqlry_seata_20210128.sql 即可。

最后复盘一下:我们一共创建了三个数据库,如下面所示,其中 ry-config 被 nacos 用于整个项目的服务发现,ry-cloudry-seata 则是 Ruoyi-Cloud 自带的一些演示数据。

(base) ➜  sql git:(master) mysql -u root -p
Enter password:
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| ... ...            |
| ry-cloud           |
| ry-config          |
| ry-seata           |
| ... ...            |
+--------------------+
9 rows in set (0.00 sec)

mysql> exit
Bye

接下来,我们依次启动前端组件和各微服务。

2.3 启动前端组件

我们进入 PROJ/RuoYi-Cloud/ruoyi-ui 目录,通过 npm install 安装该前端项目的全部依赖,然后通过 npm run dev 启动它:

(base) ➜  ruoyi-ui git:(master) npm run dev

> ruoyi@3.2.0 dev
> vue-cli-service serve

 INFO  Starting development server...
98% after emitting CopyPlugin

 DONE  Compiled successfully in 23729ms                                                                                                             4:27:51 PM


  App running at:
  - Local:   http://localhost:1024/
  - Network: http://10.192.179.235:1024/

  Note that the development build is not optimized.
  To create a production build, run npm run build.

我们访问前端页面 http://localhost:1024/,可以发现页面上弹出了 “系统接口 500 异常” 的报错,而控制台也输出了如下日志信息:

Proxy error: Could not proxy request /code from localhost:1024 to http://localhost:8080.
See https://nodejs.org/api/errors.html#errors_common_system_errors for more information (ECONNREFUSED).

这是因为 ruoyi-gateway 子项目并未被启动。 接下来,我们就启动它。

2.4 启动网关组件

因为 ruoyi-gateway 的启动需要一个 redis 服务在运行,所以,我们首先启动 redis:

(base) ➜  ~ brew services start redis
==> Successfully started `redis` (label: homebrew.mxcl.redis)
(base) ➜  ~ curl -v http://localhost:6379      # 可正常访问
*   Trying 127.0.0.1:6379...
* Connected to localhost (127.0.0.1) port 6379 (#0)
> GET / HTTP/1.1
> Host: localhost:6379
> User-Agent: curl/7.78.0
> Accept: */*
>
* Empty reply from server
* Closing connection 0
curl: (52) Empty reply from server

然后,我们在 IDEA 中启动 ruoyi-gateway

图 4 启动网关组件 ruoyi-gateway。

2.5 启动其余微服务

我们主要关注认证授权中心、文件服务、定时任务、监控中心和系统模块这五个微服务。我们依次在 IDEA 中启动它们:

图 5 启动其余微服务。

此时,我们再访问前端页面 http://localhost:1024/,就可以进入 Ruoyi 管理系统了:

图 6 成功进入 Ruoyi 管理系统。

点击 “服务状态监控”,在新页面上可以发现六个微服务均处于正常运行状态:

图 7 服务状态监控面板。

3 在 KubeSphere 中部署 Ruoyi-Cloud 项目

接下来,我们将 Ruoyi-Cloud 通过 KubeSphere 上云。 我们应当重点思考如下问题:

  1. 中间件有哪些?它们应当以 StatefulSet 的方式部署。如果已经有数据,那么数据需要被导入;
  2. 微服务有哪些?需要为这些微服务制作镜像,并且以 Deployment 的方式部署;
  3. 项目内部互相访问应当以内网 IP 或域名的方式进行。涉及哪些端口?
  4. 如何实现生产配置分离?

接下来,我们将 Ruoyi-Cloud 的上云按照如下步骤执行:

  1. 部署数据层,即 mysql 和 redis;
  2. 部署微服务治理层,即 nacos(本次实验我们不关注 sentinel);
  3. 部署 5 个微服务;
  4. 部署网关组件;
  5. 部署前端组件。

数据层有 mysql 和 redis。在上一篇文章中,我们已经部署了的 Service(背后都是 StatefulSet)有:

图 8 KubeSphere 中已经部署了的 Service(NodePort 类型)。

记住上面的 Service 名称,我们会在后面用到。 因此,接下来我们应当做的是,将 Ruoyi-Cloud 数据导入到集群数据库 his-mysql-nodeport 中。

3.1 导入 Ruoy-Cloud 的数据

可以发现,his-mysql-nodeport 暴露的节点端口为 30864,因此我们可以在 DataGrip 中创建和 192.168.23.160:30864 的连接,然后执行 PROJ/RuoYi-Cloud/sql 目录下的全部文件:

图 9 使用 DataGrip 导入 Ruoyi-Cloud 项目数据。

至此,Ruoyi-Cloud 项目的配置数据和演示数据均已导入集群中的 mysql 实例中。

3.2 Nacos 上云

根据 nacos 的集群模式部署官方教程 2,我们在 KubeSphere 中创建一个名为 his-nacos 的 Headless Service,指向一个有状态应用 his-nacos-v1,并通过 his-nacos-v1 控制三个 Pod:his-nacos-v1-0his-nacos-v1-1his-nacos-v1-2,基础镜像为 nacos/nacos-server:v2.0.3。在创建时,需要暴露 884898489849 三个端口,且暂时不绑定任何存储卷及配置卷。

根据官方教程,当以集群模式部署时,除了要配置 application.properties 文件,还需要在 cluster.conf 文件中配置集群信息。 考虑到 Kubernetes 中 Pod 会被反复创建和销毁,内网 IP 处于不断变化之中,我们应当在 cluster.conf 中写的是域名而非 IP 地址。因此,应当写:

# cluster.conf
his-nacos-v1-0.his-nacos.his.svc.cluster.local:8848
his-nacos-v1-1.his-nacos.his.svc.cluster.local:8848
his-nacos-v1-2.his-nacos.his.svc.cluster.local:8848

对于 application.properties 文件,别忘了将

db.url.0=jdbc:mysql://127.0.0.1:3306/ry-config?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=fal    se&serverTimezone=UTC

修改为

db.url.0=jdbc:mysql://192.168.23.160:30864/ry-config?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=fal    se&serverTimezone=UTC

其中 30864his-mysql-nodeport 所暴露的节点端口。当然,我们将 192.168.23.160:30864 换成 his-mysql-nodeport.his:3306 也是完全可行的。

接下来,我们要配置这两个文件并挂载。登录任意一个 nacos Pod,可以发现这两个配置文件在目录 /home/nacos/conf 下。因此,两个 ConfiMap 的挂载路径分别为 /home/nacos/conf/application.properties/home/nacos/conf/cluster.conf

注意,这两个配置文件应当以精确子路径的方式被挂载,否则会覆盖容器的 /home/nacos/conf/ 目录:

图 10 以精确子路径的方式挂载两个配置文件。

Nacos 的所有数据存储在集群中的 mysql 实例中。因此,它不需要挂载任何别的存储卷。现在,我们删除 his-nacos-v1 这个有状态应用和对应的 Headless Servicehis-nacos,然后重新创建它。这一次创建,我们挂载两个配置文件。如果一切顺利,应当有:

图 11 Nacos 服务、有状态应用与 Pod(副本数为 1)。

现在,我们以 NodePort 的方式访问 nacos——以默认账户密码登录 http://192.168.23.160:30354/nacos/,应该可以看到先前导入的 Ruoyi-Cloud 项目的所有配置:

图 12 访问集群中的 nacos 服务。

至此,nacos 上云完毕。

3.3 微服务上云

按照步骤,接下来我们将各个微服务上云。想要让这些特定的 java 微服务在 Kuerbnetes 中启动,首先需要获得它们的镜像。 实际上,Ruoyi-Cloud 自带了各个微服务的镜像构建文件,以 PROJ/Ruoyi-Cloud/docker/auth/dockerfile 为例:

(base) ➜  auth git:(master) cat dockerfile
# 基础镜像
FROM  openjdk:8-jre
# author
MAINTAINER ruoyi

# 挂载目录
VOLUME /home/ruoyi
# 创建目录
RUN mkdir -p /home/ruoyi
# 指定路径
WORKDIR /home/ruoyi
# 复制 jar 文件到路径
COPY ./jar/ruoyi-auth.jar /home/ruoyi/ruoyi-auth.jar
# 启动认证服务
ENTRYPOINT ["java","-jar","ruoyi-auth.jar"]

但是,这个 dockerfile 所构建的镜像只适合开发环境,并不适合生产环境。我们最终采用的是雷丰阳开发的 dockerfile:

# registry.cn-hangzhou.aliyuncs.com/lfy_ruoyi/ruoyi-auth:v2
FROM openjdk:8-jdk
LABEL maintainer=leifengyang

# 此处是为了使用 nacos 中 prod 环境的配置来启动本微服务,这是将在 IDEA 中启动 dev 环境下的微服务行为模仿到 prod 环境。
# 注意,我们要提前在 nacos 中创建 prod 命名空间。
# 此外,注意确保 nacos 的访问域名为 his-nacos.his
ENV PARAMS="--server.port=8080 --spring.profiles.active=prod --spring.cloud.nacos.discovery.server-addr=his-nacos.his:8848 --spring.cloud.nacos.config.server-addr=his-nacos.his:8848 --spring.cloud.nacos.config.namespace=prod --spring.cloud.nacos.config.file-extension=yml"
# 同步时区
RUN /bin/cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && echo 'Asia/Shanghai' >/etc/timezone

# 暴露 8080 端口
COPY target/*.jar /app.jar
EXPOSE 8080

ENTRYPOINT ["/bin/sh","-c","java -Dfile.encoding=utf8 -Djava.security.egd=file:/dev/./urandom -jar app.jar ${PARAMS}"]

如注释所说,我们需要先在 nacos 中 dev 环境中的配置全部 clone 到新创建的 prod 环境中:

图 13 生产环境准备。

然后,我们需要在 nacos 控制面板中把这些微服务配置文件中的 redis 和 mysql 的访问地址从 localhost 分别改为 his-redis-nodeport.hishis-mysql-nodeport.his

生产环境准备完毕后,终于可以将 java 微服务上云了。上云操作可划分为如下三个步骤:

  1. 源码打包:通过 maven 将微服务打包成 jar 文件;
  2. 制作镜像:使用 docker 根据 dockerfile 制作微服务镜像并推送至 DockerHub 或私有仓库;
  3. 启动容器:从仓库拉取镜像并启动。

此处我们省略前两个步骤,直接使用雷丰阳已经制作好的镜像:

registry.cn-hangzhou.aliyuncs.com/lfy_ruoyi/ruoyi-auth:v2
registry.cn-hangzhou.aliyuncs.com/lfy_ruoyi/ruoyi-file:v2
registry.cn-hangzhou.aliyuncs.com/lfy_ruoyi/ruoyi-gateway:v2
registry.cn-hangzhou.aliyuncs.com/lfy_ruoyi/ruoyi-job:v2
registry.cn-hangzhou.aliyuncs.com/lfy_ruoyi/ruoyi-system:v2
registry.cn-hangzhou.aliyuncs.com/lfy_ruoyi/ruoyi-visual-monitor:v2

所有微服务均以无状态应用的方式部署,且除了 ruoyi-ui,其余微服务均不暴露外网访问入口。笔者就不展示点点鼠标这些步骤的截图了,如果一切顺利,应当可以在 nacos 的服务列表中看到所有 6 个微服务:

图 14 所有微服务均在 nacos 中注册。

注意,因为我们没有部署 sentinel,而 sentinel 也默认通过 localhost:8848 访问 nacos,所以记得在 ruoyi-gateway-prod.yml 中补充上 sentinel 的配置信息,并将 localhost:8848 改为 his-nacos.his:8848

3.3 前端上云

前端项目上云也服从上一子章节所述的三个步骤,只不过打包工具从 maven 换成了 npm。前端项目通常以 nginx 作为基础镜像。需要注意的是,与 ruoyi-ui 打交道的 ruoyi-gateway 在集群中的访问地址不再是 localhost:8080,而是 ruoyi-gateway.his:8080,因此,在制作镜像时。别忘了在 nginx.conf 中修改这一点。此外,我们也需要将 nginx.conf 中的 server_name 字段从 localhost 修改为 _。 同样地,我们直接使用已经发布的镜像:

registry.cn-hangzhou.aliyuncs.com/lfy_ruoyi/ruoyi-ui:v2

我们依据此镜像创建 ruoyi-ui 这个无状态应用并暴露一个 NodePort 类型的 Service,然后访问它:

图 15 以 NodePort 方式访问 ruoyi-ui。

我们点击 “系统管理 - 用户管理”,添加一个名为 zhl 的用户:

图 16 在 ruoyi-ui 中添加一个系统用户。

如果一切顺利,在 DataGrip 中连接 hyis-mysql-nodeport:3306,查询 sys_user 这张表,应当可以看到刚才新增的用户:

图 17 新增了 zhl 这个用户。

4 总结

经过以上极度繁琐且极易出错的步骤后,我们终于成功将 Ruoyi-Cloud 部署在集群中了。虽然我们全方位基于 KubeSphere 的 UI 进行操作,但是仍然无法避免遇到各种各样的问题。 此外,以上步骤是不可重复的,一旦更新了项目各组件的镜像,所有步骤免不了重新来过。读者如果自主将这个项目在集群中部署一遍,应该就能体会到为什么 DevOps 势在必行。

参考

本文参考了雷丰阳的视频课程 云原生 Java 架构师的第一课 K8s+Docker+KubeSphere+DevOps。 如果想全面而深入地自主实践,推荐观看原视频。

转载申请

本作品采用 知识共享署名 4.0 国际许可协议 进行许可,转载时请注明原文链接。您必须给出适当的署名,并标明是否对本文作了修改。


  1. https://github.com/alibaba/Sentinel/ ↩︎

  2. 将 nacos 以集群模式部署请参考 https://nacos.io/zh-cn/docs/cluster-mode-quick-start.html。不过,在不对微服务源代码做任何修改的情况下,微服务无法访问集群模式的 nacos。因此,在下面的部署中,我们最终还是将 nacos 以 standalone 模式进行部署。若要做到这一点,只需要在创建时添加一个环境变量 MODE=standalone,然后将副本数置为 1 即可。 ↩︎