使用Centos7.7,参考kuboard文档,使用kuboard提供的快速部署方式进行K8s部署,以及kuboard部署。我会将我遇到的问题以及解决方法附在文章末尾,以供参考。

  1. 修改虚拟机的hostname:

hostnamectl set-hostname k8s-master

bash

  1. 设置hostname地址解析

echo “127.0.0.1  $(hostname)” >> /etc/hosts

  1. 关闭防火墙

systemctl stop firewalld

systemctl disable firewalld

  1. 关闭selinux

setenforce 0(临时关闭)

vim /etc/selinux/config

将配置改为SELINUX=disabled(永久关闭)

需要将临时关闭和永久关闭都执行,因为配置文件需要在reboot后才会生效。

  1. 快速部署k8s

curl -sSL https://kuboard.cn/install-script/v1.16.2/install_kubelet.sh | sh

  1. 快速进行k8s初始化

# 替换 apiserver.demo 为 您想要的 dnsName

export APISERVER_NAME=apiserver.demo

export POD_SUBNET=10.100.0.1/16(k8s容器运行网段,不要与主机地址网段重合,否则会造成冲突)

echo "127.0.0.1    ${APISERVER_NAME}" >> /etc/hosts(将本机地址与apiserver进行映射,缺少此内容会造成apiserver无法被解析,导致k8s初始化失败)

curl -sSL https://kuboard.cn/install-script/v1.16.2/init_master.sh | sh

  1. 执行如下命令,等待 3-10 分钟,直到所有的容器组处于 Running 状态

watch kubectl get pod -n kube-system -o wide

 

  1. 查看 master 节点初始化结果

kubectl get nodes

  1. 部署kuboardV2

kubectl apply -f https://kuboard.cn/install-script/kuboard.yaml

kubectl apply -f https://addons.kuboard.cn/metrics-server/0.3.7/metrics-server.yaml

  1. 查看部署情况

kubectl get pods -l k8s.kuboard.cn/name=kuboard -n kube-system

11. 获取登录Token

echo $(kubectl -n kube-system get secret $(kubectl -n kube-system get secret | grep ^kuboard-user | awk '{print $1}') -o go-template='{{.data.token}}' | base64 -d)

 

12. 登录kuboard

http://IP地址:32567/

 

13. 我们要部署的是ruoyi框架,所以先在空间中创建一个ruoyi命名的名称空间进行归类。

图片4.png 

14. 从网上找到ruoyi前后端分离源码。使用git进行克隆。

git clone https://gitee.com/y_project/RuoYi-Vue.git

图片5.png 

15. 对ruoyi文件夹进行理解,如意下所示,后可以知道后端需要从admin进行入手。

ruoyi/

├── ruoyi-admin        // [后端] 启动模块,服务入口

├── ruoyi-common       // [后端] 通用工具、常量、异常处理

├── ruoyi-framework    // [后端] 框架核心(安全、日志、配置)

├── ruoyi-generator    // [后端] 代码生成器(可选)

├── ruoyi-quartz       // [后端] 定时任务(可选)

├── ruoyi-system       // [后端] 系统业务模块(用户、角色、菜单等)

├── ruoyi-ui           // [前端] Vue项目源码

├── sql                // [数据库] SQL脚本

├── pom.xml            // [Maven] 父工程依赖管理

└── ry.sh / ry.bat     // [脚本] 启动脚本

16. 在对后端进行打包构建及部署规划时,我们需要构建一套完整的数据存储方案。这主要分为两个层面:

(1) 核心业务与系统配置的持久化存储:这部分我们采用 MySQL。它负责存储用户权限、菜单配置以及各类业务数据。

(2) 高频访问数据与会话状态的管理:这部分我们引入 Redis。它不仅负责存储用户的登录凭证(Token)以实现高效的身份校验,还承担了系统缓存(如字典、验证码)的职责,极大地提升了系统的响应速度和并发处理能力。”

17. 利用kuboard对mysql进行部署

在ruoyi空间下,选择“应用程序”-->“控制器”-->“Deployments”,选择在持久层进行部署。

图片6.png 

此时如果直接进行数据库部署会产生如下问题:

1) mysql运行在容器中,容器重启会导致mysql储存的内容被删除,所以此时就得引入容器的存储问题,在本文章里面,我们使用pv和pvc来进行容器的储存。

2) 首先我们选择一个路径用来存储,然后创建一个pv的yaml文件进行申明。在声明前需要虚拟机上有此路径被创建。

vim pv.yaml

apiVersion: v1

kind: PersistentVolume

metadata:

  name: manual-pv #pv名

  namespace: ruoyi #pv申明作用的空间

spec:

  capacity:

    storage: 10Gi #声明的存储大小

  accessModes:

    - ReadWriteOnce #选择权限,此处为读写

  persistentVolumeReclaimPolicy: Retain

  hostPath:

    path: "/data/pv" # 物理机上的实际路

3) 我们再创建一个pvc.yaml。

vim pvc.yaml

 

apiVersion: v1

kind: PersistentVolumeClaim

metadata:

  name: my-db-pvc

  namespace: ruoyi  # <--- 必须加上这一行,确保 PVC 创建在正确的命名空间

spec:

  accessModes:

    - ReadWriteOnce

  resources:

    requests:

      storage: 5Gi  # 建议申请比 PV (10Gi) 小的容量

  volumeName: manual-pv # 指定要绑定的 PV 名称

  storageClassName: ""

 

4) 然后进行应用,然后我们可以在kuboard的存储里面查看我们的创建是否成功

kubectl apply -f pv.yaml

kubectl apply -f pvc.yaml

图片7.png 

5) 然后在部署页面,我们选择储存卷声明,声明模板选择刚刚创建的pvc名。

图片8.png 

6) 在下方挂载点做如下设置,此处的路径指的是在容器内部的路径。

图片9.png 

然后解决第二个问题,mysql的字符集转换格式不进行指定的话,可能造成前端显示页面乱码,是因为请求过程中字符编码不一致导致的。所以我们要对mysql的配置进行修改。这里又有容器重启,容器内的配置文件也会初始化的问题,所以这里我们使用到Configmap,来对配置进行持久化的修改。

1) 从运行mysql的容器中查看mysql配置文件。

docker ps | grep mysql(找到容器id)

docker exec -it 容器id /bin/bash(进入容器)

cd /etc/mysql

ls

图片10.png 

2) 复制文件内容后,我们在kuboard的“资源”->“字典配置”里面选择创建configmap。如图配置。修改点为:client和mysql中对utf-8的指定。

图片11.png 

3) 然后在部署页面,我们对数据卷处增加如图的configmap。

图片12.png 

4) 在挂载点处增加如图。路径对应为容器内mysql的配置文件存放路径。

图片13.png 

然后解决第三个容器时间不同步问题,这时我们用到hostPath,通过虚拟机的时间文件来映射到容器内的时间文件从而达到时间同步效果。

1) 因为虚拟机中的时间在 /etc/localtime下,所以我们在存储卷中选择hostPath,命名为time,路径填写为 /etc/localtime。类型选择文件File。

图片14.png 

2) 在挂载点处增加如图配置。选择只读防止意外修改。

图片15.png 

然后我们来到“运行组容器pod”,将容器名称设为mysql,镜像设为mysql:8.0,拉取策略选择IfNotPresent(先在本地拉取,本地没有再网络拉取)。

图片16.png 

设置Port为3306。

图片17.png 

环境变量中加入密码设置。Key=MYSQL_ROOT_PASSWORD 值=密码

图片18.png 

来到访问方式server的配置,我们选择ClusterIP,在容器内部打开端口。服务端口和容器端口都填写3306。

图片19.png 

然后保存配置。随后容器就会自动创建。

18. 通过kuboard对redis进行部署。

服务分层选择持久层,名称填写redis。

图片20.png 

工作容器中作如图填写。

图片21.png

Server访问方式作如图配置。

图片22.png

19. 然后我们进入ruoyi文件夹,对配置进行修改。

cd /root/RuoYi-Vue/ruoyi-admin/src/main/resources

vim application-druid.yml#对地址和密码进行修改,此处地址为mysql容器server地址,可以在kuboard中service的yaml中查看,密码为环境变量里面自己设置的密码。

 图片23.png

图片24.png

 

(3) vim application.yml#对redis进行修改

(4) 进入文件后,键入“/”,键入redis,键入回车,将redis的地址改为redis容器server的地址。

图片25.png 

图片26.png 

20. 在ruoyi文件的根目录下,通过mvn指令进行构建jar包,构建好的jar包会在RuoYi-Vue/ruoyi-admin/target下面。

mvn clean package

21. 同样在根目录下,编辑Dockerfile,

vim Dockerfile

FROM swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/openjdk:17 

# 创建工作目录

RUN mkdir -p /ruoyi

# 工作目录

WORKDIR /ruoyi

# 把jar包复制到容器(必须和Dockerfile同目录)

COPY ./ruoyi-admin/target/ruoyi-admin.jar ./ruoyi-admin.jar

# 启动命令

ENTRYPOINT ["java", "-jar","ruoyi-admin.jar","--server.port=8088"]

22. 使用docker build来构建镜像

docker build -t ruoyi-bo:1.0 .#注意有.

23. 构建成功后,在kuboard界面对镜像进行部署,选择默认分层。镜像填写自己打包的名称。

图片27.png 

图片28.png 

图片29.png 

24. 打开server的容器管理,点击“追踪日志”,出现启动成功即可进行下一步。

图片30.png 

25. 现在我们开始着手前端的打包部署。

(1) 进入的根目录里面的ruoyi-ui

Cd ruoyi-ui

(2) 用npm install --registry=https://registry.npmmirror.com来进行加速。

npm install --registry=https://registry.npmmirror.com

(3) 通过npm run build:prod命令来构建前端包。构建完成后,内容会在ruoyi-ui/dist目录下面。

npm run build:prod

26. 因为前端页面我们基于nginx进行托管,所以存在一个nginx配置的修改问题,所以我们着手解决。

(1) 通过kuboard快速部署一个nginx;latest的容器。

图片31.png 

(2) 使用docker cp 将配置文件取出来,然后进行修改。

docker ps | grep nginx#找到容器编号

图片32.png 

docker cp 容器id:/etc/nginx/conf.d/default.conf /root/RuoYi-Vue/ruoyi-ui

vim default.conf#在配置里面加入自己后端的server地址和端口。

 location /prod-api/ {

         proxy_pass http://10.96.159.100:8088/;

     }

(3) 因为在Dockerfile里面我们需要将前端的dist复制到nginx能找到的目录下,所以我们做如下操作。

mkdir -p /usr/share/nginx/html/ruoyi#在/usr/share路径下创建新的文件夹

 

 

 

27. 在ruoyi-ui的目录下我们进行Dockerfile的编写。随后应用。

vim Dockerfile

 

FROM nginx:latest

# 复制基础配置文件

COPY default.conf /etc/nginx/conf.d/default.conf

# 复制前端静态文件

COPY dist /usr/share/nginx/html/ruoyi

EXPOSE 80

CMD ["nginx", "-g", "daemon off;"]

 

 

docker build -t ruoyi-q:1.0 .

28. 待镜像构建成功后,我们通过kuboard修改最开始临时部署的nginx。

(1) 在控制器的deployments中打开nginx所在的容器管理界面进行编辑。镜像填入build时填写的镜像名,抓取策略选择never。

图片33.png 

(2) 访问方式server作如图配置,选择nodeport让外部能够进行访问。

图片34.png 

29. 跟后端部署后一样,我们进入“日志追踪”查看是否有问题。如图所示没有报错即为成功。

图片35.png

30. 打开浏览器通过ip地址对节点端口进行访问,即可。

图片36.png 

图片37.png 

31. 至此,整个框架搭建完成。

 

 

问题以及解决方法:

l 

图片38.png 

在前端的dockerfile中copy的地址有问题,造成找不到静态资源。重新核对路径后再打包即可。

l 图片39.png

在后端部署时极容易出现数据库不存在的情况,此时做如下步骤:

1. 进入到ruoyi根目录下的sql里面,确保存在两个sql的文件。

2. 找到运行mysql的容器号,通过docker cp将文件传进去。

3. 进入容器里面,进入mysql,创建ry-vue的数据库并使用,通过mysql -u root -p ry-vue < /path/to/ry_2024xxxx.sql命令对数据库进行导入。另一个同理。

4. 重启容器即可。

5. 因为挂载了pvc,所以数据库的内容在重启后不会消失。

l 最后是踩坑的内容:

1. nginx一定要用完整功能版,不然前端会报错。Jdk也是一样。

2. 对容器可以理解为一个新的虚拟机,在不挂载存储的条件下,任何对容器内部的直接操作,都会在容器重启后被初始化。

3. 后端找不到数据库,和redis,在自己配置文件正确的情况下,可以考虑换一个ruoyi前后端分离源码,这里推荐使用官方的。

4. 多阅读操作文档,理解每步的原理,拥有自己的思路。