云原生之容器编排实践-ruoyi-cloud项目部署到K8S:MySQL8
背景
前面搭建好了 Kubernetes
集群与私有镜像仓库,终于要进入服务编排的实践环节了。本系列拿 ruoyi-cloud
项目进行练手,按照 MySQL
, Nacos
, Redis
, Nginx
, Gateway
, Auth
, System
的顺序来部署 ruoyi-cloud
微服务应用。
部署一个服务前,需要明确它是有状态服务还是无状态服务,这里 MySQL
, Nacos
, Redis
, Nginx
当做有状态服务(StatefulSet)来部署;而 Gateway
, Auth
, System
这些微服务作为无状态服务(Deployment)来部署。
这一次对全部服务采用 YAML
文件的方式来进行部署,这有助于理解K8S组织管理资源的风格,后续我们可以借助开源的容器平台,eg: KubeSphere
来进行可视化的服务部署。不过,手动编写 YAML
文件有一个问题,那就是当面对较多的微服务时,工作量较大,基本成了体力活;有个好消息是,我们可以使用 Kubernetes
官方提供的 kompose
工具,实现对 dokcer-compose
的 yaml
到 K8S
的 yaml
的转换。
另外,为了保证后续在实际生产环境下各组件的稳定与可靠,我们限定了所有基础镜像的版本。
- MySQL: 8.0
- Nacos: 2.2.3
- Redis: 7.2.3
- Nginx: 1.25.3
虚机资源
共用到了三台虚机,1台作为 Master
节点,2台 Worker
节点。
主机名 | IP | 说明 |
---|---|---|
k8s-master | 172.16.201.25 | 主节点 |
k8s-node1 | 172.16.201.26 | 工作节点 |
k8s-node2 | 172.16.201.27 | 工作节点 |
[root@k8s-master ~]# kubectl get nodes
NAME STATUS ROLES AGE VERSION
k8s-master Ready control-plane,master 37h v1.20.9
k8s-node1 Ready <none> 35h v1.20.9
k8s-node2 Ready <none> 35h v1.20.9
系统环境
[root@k8s-master ~]# uname -a
Linux k8s-master 3.10.0-1160.71.1.el7.x86_64 #1 SMP Tue Jun 28 15:37:28 UTC 2022 x86_64 x86_64 x86_64 GNU/Linux
[root@k8s-master ~]# cat /proc/version
Linux version 3.10.0-1160.71.1.el7.x86_64 (mockbuild@kbuilder.bsys.centos.org) (gcc version 4.8.5 20150623 (Red Hat 4.8.5-44) (GCC) ) #1 SMP Tue Jun 28 15:37:28 UTC 2022
[root@k8s-master ~]# cat /etc/redhat-release
CentOS Linux release 7.9.2009 (Core)
YAML转换
ruoyi-cloud
项目本身提供了一个使用 docker-compose
部署的配置文件以及所有依赖服务镜像的构建脚本,是在项目根目录的 docker
目录下,可参考Docker容器化部署若依微服务ruoyi-cloud项目。
先将这个 docker
目录上传到 Kubernetes
的主节点,然后使用 kompose
将 dokcer-compose
的 yaml
转换为 K8S
的 yaml
。
curl -L https://github.com/kubernetes/kompose/releases/download/v1.26.0/kompose-linux-amd64 -o kompose
chmod +x kompose
mv ./kompose /usr/local/bin/kompose
[root@k8s-master docker]# cd /opt/docker
[root@k8s-master docker]# kompose convert
对于自动转换后的 YAML
,我们做简单的修改后即可应用部署。下面是 MySQL
的 YAML
配置文件(做了合并和微调)。
- ruoyi-mysql-ns-sc-pv-pvc.yaml
apiVersion: v1
kind: Namespace
metadata:name: ruoyi-basic---apiVersion: v1
kind: PersistentVolume
metadata:name: ruoyi-mysql-data-pvlabels:pv: ruoyi-mysql-data-pv
spec:capacity: storage: 5GiaccessModes:- ReadWriteOncepersistentVolumeReclaimPolicy: RetainstorageClassName: local-storagelocal:path: /data/mysql/datanodeAffinity:required:nodeSelectorTerms:- matchExpressions:- key: kubernetes.io/hostnameoperator: Invalues:- k8s-node1---apiVersion: v1
kind: PersistentVolume
metadata:name: ruoyi-mysql-log-pvlabels:pv: ruoyi-mysql-log-pv
spec:capacity: storage: 5GiaccessModes:- ReadWriteOncepersistentVolumeReclaimPolicy: RetainstorageClassName: local-storagelocal:path: /data/mysql/lognodeAffinity:required:nodeSelectorTerms:- matchExpressions:- key: kubernetes.io/hostnameoperator: Invalues:- k8s-node1
---apiVersion: v1
kind: PersistentVolumeClaim
metadata:name: ruoyi-mysql-data-pvcnamespace: ruoyi-basic
spec:accessModes:- ReadWriteOnceresources:requests:storage: 10MistorageClassName: local-storageselector:matchLabels:pv: ruoyi-mysql-data-pv
---apiVersion: v1
kind: PersistentVolumeClaim
metadata:name: ruoyi-mysql-log-pvcnamespace: ruoyi-basic
spec:accessModes:- ReadWriteOnceresources:requests:storage: 2GistorageClassName: local-storageselector:matchLabels:pv: ruoyi-mysql-log-pv---apiVersion: v1
kind: ConfigMap
metadata:name: ruoyi-mysql-configmapnamespace: ruoyi-basic
data:my-custom.cnf: |[mysqld]# handle error "this is incompatible with sql_mode=only_full_group_by"sql_mode=STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTIONsocket=/var/run/mysqld/mysqld.sock[client]socket=/var/run/mysqld/mysqld.sock
Note: 这里使用 local-storage
的 StorageClass
,并使用本地磁盘的方式创建使用 PV
,实际建议使用 NFS
。
- ruoyi-mysql-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:annotations:kompose.cmd: kompose convertkompose.version: 1.26.0 (40646f47)labels:io.kompose.service: ruoyi-mysqlname: ruoyi-mysqlnamespace: ruoyi-basic
spec:replicas: 1selector:matchLabels:io.kompose.service: ruoyi-mysqltemplate:metadata:annotations:kompose.cmd: kompose convertkompose.version: 1.26.0 (40646f47)labels:io.kompose.service: ruoyi-mysqlspec:containers:- args:- --innodb-buffer-pool-size=80M- --character-set-server=utf8mb4- --collation-server=utf8mb4_unicode_ci- --default-time-zone=+8:00- --lower-case-table-names=1env:- name: MYSQL_DATABASEvalue: ruoyi-cloud- name: MYSQL_ROOT_PASSWORDvalue: you-guessimage: mysql:8.0name: ruoyi-mysqlports:- containerPort: 3306volumeMounts:- mountPath: /var/lib/mysqlname: ruoyi-mysql-data-pvc- mountPath: /var/log/mysqlname: ruoyi-mysql-log-pvc- mountPath: /etc/mysql/conf.dname: ruoyi-mysql-configrestartPolicy: Alwaysvolumes:- name: ruoyi-mysql-data-pvcpersistentVolumeClaim:claimName: ruoyi-mysql-data-pvc- name: ruoyi-mysql-log-pvcpersistentVolumeClaim:claimName: ruoyi-mysql-log-pvc- name: ruoyi-mysql-configconfigMap:name: ruoyi-mysql-configmap
- ruoyi-mysql-service.yaml
apiVersion: v1
kind: Service
metadata:annotations:kompose.cmd: kompose convertkompose.version: 1.26.0 (40646f47)labels:io.kompose.service: ruoyi-mysqlname: ruoyi-mysqlnamespace: ruoyi-basic
spec:ports:- name: "3306"port: 3306targetPort: 3306nodePort: 30306selector:io.kompose.service: ruoyi-mysqltype: NodePort
部署MySQL
Note: 本次部署 MySQL
时用了 Deployment
(运行的pod名称会有个随机后缀),实际生产建议使用 StatefulSet
(pod名称后缀为0)更合适。
# 创建NameSpace、StorageClass、PV、PVC
[root@k8s-master mysql]# kubectl apply -f ruoyi-mysql-ns-sc-pv-pvc.yaml
namespace/ruoyi-basic created
persistentvolume/ruoyi-mysql-data-pv created
persistentvolume/ruoyi-mysql-log-pv created
persistentvolumeclaim/ruoyi-mysql-data-pvc created
persistentvolumeclaim/ruoyi-mysql-log-pvc created
configmap/ruoyi-mysql-configmap created# 部署MySQL
[root@k8s-master mysql]# kubectl apply -f ruoyi-mysql-deployment.yaml
deployment.apps/ruoyi-mysql created# 创建MySQL服务
[root@k8s-master mysql]# kubectl apply -f ruoyi-mysql-service.yaml
service/ruoyi-mysql created# 查看PV信息
[root@k8s-master mysql]# kubectl get pv -owide
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE VOLUMEMODE
docker-registry-pv 5Gi RWX Retain Bound docker-registry/docker-registry-pvc local-storage 26h Filesystem
ruoyi-mysql-data-pv 5Gi RWX Retain Bound ruoyi-basic/ruoyi-mysql-data-pvc local-storage 5m16s Filesystem
ruoyi-mysql-log-pv 5Gi RWX Retain Bound ruoyi-basic/ruoyi-mysql-log-pvc local-storage 5m16s Filesystem# 获取配置信息
[root@k8s-master mysql]# kubectl get cm -n ruoyi-basic
NAME DATA AGE
kube-root-ca.crt 1 17m
ruoyi-mysql-configmap 1 17m# 可通过以下命令查看编辑MySQL的配置
[root@k8s-master ~]# kubectl edit cm ruoyi-mysql-configmap -n ruoyi-basic# 查看MySQL日志
[root@k8s-master ~]# kubectl logs ruoyi-mysql-8c779d94c-b7r9n -n ruoyi-basic# 查看所有Pod,MySQL就绪
[root@k8s-master mysql]# kubectl get pod -A
NAMESPACE NAME READY STATUS RESTARTS AGE
docker-registry docker-registry-9bc898786-l477q 1/1 Running 1 17h
kube-system calico-kube-controllers-577f77cb5c-hv29w 1/1 Running 2 3d22h
kube-system calico-node-4fkrs 1/1 Running 0 3d22h
kube-system calico-node-d4tqq 1/1 Running 2 3d22h
kube-system calico-node-sdmm6 1/1 Running 4 3d22h
kube-system etcd-k8s-master 1/1 Running 9 5d9h
kube-system kube-apiserver-k8s-master 1/1 Running 9 5d9h
kube-system kube-controller-manager-k8s-master 1/1 Running 9 5d9h
kube-system kube-proxy-4789z 1/1 Running 0 5d9h
kube-system kube-proxy-7mt7k 1/1 Running 5 5d9h
kube-system kube-proxy-lqtpz 1/1 Running 2 5d9h
kube-system kube-scheduler-k8s-master 1/1 Running 10 5d9h
kubernetes-dashboard dashboard-metrics-scraper-79c5968bdc-j9bnv 1/1 Running 0 3d22h
kubernetes-dashboard kubernetes-dashboard-658485d5c7-pq7z8 1/1 Running 0 3d22h
ruoyi-basic ruoyi-mysql-8c779d94c-b7r9n 1/1 Running 0 4m3s# MySQL对外暴露了端口,用于测试
[root@k8s-master mysql]# kubectl get svc -n ruoyi-basic -o wide
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR
ruoyi-mysql NodePort 10.96.58.67 <none> 3306:30306/TCP 4s io.kompose.service=ruoyi-mysql
验证MySQL服务
- 可以直接进入容器,通过
MySQL
自带的命令行客户端进行测试连接:mysql -uroot -p
。 - 可以使用
busybox
,验证集群内部是否可以正常连接MySQL
数据库。 - 由于暴露了服务端口30306,也可以通过远程的数据库客户端进行连接测试。
# 进入mysql的服务,测试客户端连接:mysql -uroot -p
kubectl exec -it pod/ruoyi-mysql-8c779d94c-b7r9n -n ruoyi-basic -- /bin/bash# 使用Busybox进行数据库连接测试;以服务名的方式
[root@k8s-master ~]# kubectl exec -it pod/busybox -- /bin/sh
/ # telnet ruoyi-mysql.ruoyi-basic.svc.cluster.local:3306
J
8.0.27,'~_xJ{��C~;f<*,mqlcaching_sha2_password
远程测试 MySQL
服务状态:
导入数据
若依提供了微服务用到的数据库脚本,在 MySQL
服务部署完成后可以通过 SQL
文件自行导入脚本。
小总结
这次我们先是借助 kompose
工具,实现对 dokcer-compose
的 yaml
到 K8S
的 yaml
的转换,经过简单的加工后即可应用部署;通过以上操作,成功将 MySQL 8.0
部署到了 K8S
集群,下一步我们安装下 Nacos v2.2.3
。
If you have any questions or any bugs are found, please feel free to contact me.
Your comments and suggestions are welcome!
相关文章:

云原生之容器编排实践-ruoyi-cloud项目部署到K8S:MySQL8
背景 前面搭建好了 Kubernetes 集群与私有镜像仓库,终于要进入服务编排的实践环节了。本系列拿 ruoyi-cloud 项目进行练手,按照 MySQL , Nacos , Redis , Nginx , Gateway , Auth ,…...

go interface{} 和string的转换问题
1.遇到的问题 问题来源于,我sql模版拼接遇到的问题。 首先,这样是没有问题的。 var qhx interface{} "qhx"s : qhx.(string)fmt.Println(s) 但是当我在这段代码里用:1.类型断言 var sqlStr "select * from tx_user where username %s" join…...

【Git教程】(三)提交详解 —— add、commit、status、stach命令的说明,提交散列值与历史,多次提交及忽略 ~
Git教程 提交详解 1️⃣ 访问权限与时间戳2️⃣ add命令与 commit 命令3️⃣ 提交散列值4️⃣ 提交历史5️⃣ 一种特别的提交查看方法6️⃣ 同一项目的多部不同历史6.1 部分输出:-n6.2 格式化输出:--format、--oneline6.3 统计修改信息:--st…...

vue3个人网站电子宠物
预览 具体代码 Attack.gif Attacked.gif Static.gif Walk.gif Attack.gif Static.gif Attacked.gif Walk.gif <template><div class"pet-container" ref"petContainer"><p class"pet-msg">{{ pet.msg }}</p><img re…...

2.22 作业
顺序表 运行结果 fun.c #include "fun.h" seq_p create_seq_list() {seq_p L (seq_p)malloc(sizeof(seq_list));if(LNULL){printf("空间申请失败\n");return NULL;}L->len 0; bzero(L,sizeof(L->data)); return L; } int seq_empty(seq_p L) {i…...

office word保存pdf高质量设置
1 采用第三方pdf功能生成 分辨率越大质量越好...

微服务设计模式
微服务在过去十年中已经发展到现在非常成熟的水平。许多模式被演变以适应不同的需求。 架构模式 分层图案 2层三层n层客户端服务器 一个服务器和多个客户端大多数在线应用程序,例如电子邮件、银行应用程序等。分开演示 模型-视图-控制器 (MVC) 模型——包含核心功能和数据查看…...

10.网络游戏逆向分析与漏洞攻防-游戏网络架构逆向分析-接管游戏发送数据的操作
内容参考于:易道云信息技术研究院VIP课 上一个内容:接管游戏连接服务器的操作 码云地址(master 分支):染指/titan 码云版本号:00820853d5492fa7b6e32407d46b5f9c01930ec6 代码下载地址,在 ti…...

将SU模型导入ARCGIS,并获取高度信息,多面体转SHP文件(ARCMAP)
问题:将Sketchup中导出的su模型,导入arcgis并得到面shp文件,进而获取各建筑的高度、面积等信息。 思路: (1)导入arcgis得到多面体 (2)转为面shp文件 (3)计算高度/面积等 1、【3D Analyst工具】【转换】【由文件转出】【导入3D文件】(在此步骤之间,建议先建立一个…...

【电子通识】为什么单片机芯片上会有多组VDD电源?
在单片机芯片规格书中,我们经常能看到多个组VDD的设计,如下红框所示管脚都是VDD管脚。 为什么需要这样设计?只设置一个VDD管脚,把其他的VDD管脚让出来多做几个IO或是其他复用功能不好吗?接下来我们从单片机内部的电路结…...
跟我学C++中级篇——单实例和静态化
一、单实例模式 在设计模式中,单实例模式几乎是所有语言中都非常常用的一种设计模式。它在实际的应用中也非常广泛,在很多的开源框架中,都可以看到单实例的影子。单实例,简单的就可以看做在整个应用周期中,只有一个对…...

下载 axios.js 文件到本地【linux】
方式一 npm install axios在$NODE_PATH/node_modules/axios/dist路径下即可找到axios.js。 方式二 1、百度搜索 GitHub 官网:https://github.com/ 2、搜索 axios 3、点击 axios/axios 4、下载到本地 5、解压,进入到 dist 文件夹** 参考&#x…...
一些matlab的常用用法。在MATLAB中,如何实现数据的导入和导出?
一些matlab的常用用法。 MATLAB(Matrix Laboratory)是一款广泛使用的数值计算环境和编程语言,主要用于算法开发、数据可视化、数据分析以及数值计算等。以下是一些MATLAB的常用用法: 创建矩阵: 使用方括号 [] 创建矩阵…...

数学建模【插值与拟合】
一、插值与拟合简介 在数学建模过程中,通常要处理由试验、测量得到的大量数据或一些过于复杂而不便于计算的函数表达式,针对此情况,很自然的想法就是,构造一个简单的函数作为要考察数据或复杂函数的近似。插值和拟合就可以解决这…...

汽修专用产品---选型介绍 汽修示波器 汽车示波器 汽车电子 汽修波形 汽车传感器波形 汽车检测
为了满足汽车电子用户的测量需求,我司特推出汽修专用版示波器,一键测量,轻松找出汽车问题。 LOTO各种型号的示波器其实都可以用作汽车传感器信号波形的检测。汽修应用中,工程师对示波器的性能要求对于LOTO产品来说不算高。 在我们…...

如何将简历项目部署到自己的域名下
通过上一篇文章我们得知如何在Github上Fork项目到自己账号下,还有学会配置好简历项目并部署上线,接下来我们就来看一下该项目是如何部署到自己的域名下的 👇 在项目文档中可以看到该简历项目是部署在Vercel上的,首先打开Vercel的官…...
Redisson - 实现Java的Redis分布式和可扩展解决方案
Redisson - 实现Java的Redis分布式和可扩展解决方案 引言: 在现代的分布式系统中,缓存和数据存储扮演着至关重要的角色。Redis作为一种高性能的键值存储数据库,被广泛用于缓存、消息队列、实时数据分析等场景。然而,原生的Redis…...

如何利用EXCEL批量插入图片
目录 1.excel打开目标表格; 2.点开视图-宏-录制宏,可以改宏的名字或者选择默认; 3.然后点开视图-宏-查看宏 4.点编辑进去 5.修改代码: (1)打开之后会显示有一堆代码 (2)将这个…...
django rest framework 学习笔记-实战商城3
01用户模块模型定义_哔哩哔哩_bilibili 本博客借鉴至大佬的视频学习笔记 用户模块及商品数据表结构设计 from ckeditor.fields import RichTextField # pip install django-ckeditor from django.db import models# Create your models here. # from wx.richtext import Ri…...

WPF真入门教程29--MVVM常用框架之MvvmLight
1、MVVM模式回顾 关于mvvm模式的基础知识,请看这2个文章: WPF真入门教程23--MVVM简单介绍 WPF真入门教程24--MVVM模式Command命令 做过VUE开发或微信小程序开发的伙伴,就知道MVVM模式,核心就是数据驱动控件,全栈开…...
变量 varablie 声明- Rust 变量 let mut 声明与 C/C++ 变量声明对比分析
一、变量声明设计:let 与 mut 的哲学解析 Rust 采用 let 声明变量并通过 mut 显式标记可变性,这种设计体现了语言的核心哲学。以下是深度解析: 1.1 设计理念剖析 安全优先原则:默认不可变强制开发者明确声明意图 let x 5; …...
挑战杯推荐项目
“人工智能”创意赛 - 智能艺术创作助手:借助大模型技术,开发能根据用户输入的主题、风格等要求,生成绘画、音乐、文学作品等多种形式艺术创作灵感或初稿的应用,帮助艺术家和创意爱好者激发创意、提高创作效率。 - 个性化梦境…...

视频字幕质量评估的大规模细粒度基准
大家读完觉得有帮助记得关注和点赞!!! 摘要 视频字幕在文本到视频生成任务中起着至关重要的作用,因为它们的质量直接影响所生成视频的语义连贯性和视觉保真度。尽管大型视觉-语言模型(VLMs)在字幕生成方面…...
Unit 1 深度强化学习简介
Deep RL Course ——Unit 1 Introduction 从理论和实践层面深入学习深度强化学习。学会使用知名的深度强化学习库,例如 Stable Baselines3、RL Baselines3 Zoo、Sample Factory 和 CleanRL。在独特的环境中训练智能体,比如 SnowballFight、Huggy the Do…...

PH热榜 | 2025-06-08
1. Thiings 标语:一套超过1900个免费AI生成的3D图标集合 介绍:Thiings是一个不断扩展的免费AI生成3D图标库,目前已有超过1900个图标。你可以按照主题浏览,生成自己的图标,或者下载整个图标集。所有图标都可以在个人或…...
【深尚想】TPS54618CQRTERQ1汽车级同步降压转换器电源芯片全面解析
1. 元器件定义与技术特点 TPS54618CQRTERQ1 是德州仪器(TI)推出的一款 汽车级同步降压转换器(DC-DC开关稳压器),属于高性能电源管理芯片。核心特性包括: 输入电压范围:2.95V–6V,输…...
Python第七周作业
Python第七周作业 文章目录 Python第七周作业 1.使用open以只读模式打开文件data.txt,并逐行打印内容 2.使用pathlib模块获取当前脚本的绝对路径,并创建logs目录(若不存在) 3.递归遍历目录data,输出所有.csv文件的路径…...

OPENCV图形计算面积、弧长API讲解(1)
一.OPENCV图形面积、弧长计算的API介绍 之前我们已经把图形轮廓的检测、画框等功能讲解了一遍。那今天我们主要结合轮廓检测的API去计算图形的面积,这些面积可以是矩形、圆形等等。图形面积计算和弧长计算常用于车辆识别、桥梁识别等重要功能,常用的API…...
AT模式下的全局锁冲突如何解决?
一、全局锁冲突解决方案 1. 业务层重试机制(推荐方案) Service public class OrderService {GlobalTransactionalRetryable(maxAttempts 3, backoff Backoff(delay 100))public void createOrder(OrderDTO order) {// 库存扣减(自动加全…...
Ubuntu 可执行程序自启动方法
使用 autostart(适用于桌面环境) 适用于 GNOME/KDE 桌面环境(如 Ubuntu 图形界面) 1. 创建 .desktop 文件 sudo vi ~/.config/autostart/my_laser.desktop[Desktop Entry] TypeApplication NameMy Laser Program Execbash -c &…...