K3s部署MySQL
在K3s集群中部署MySQL,需结合Kubernetes资源编排特性,合理配置存储、网络、配置项等核心组件,确保数据库服务稳定、可访问且数据安全。本文将详细拆解基于K3s部署MySQL的完整流程,涵盖资源配置文件编写、部署操作及关键注意要点,助力开发者快速完成部署落地。
一、环境说明
本文基于K3s集群环境,通过Kubernetes各类核心资源对象(StatefulSet、Service、PVC/PV、ConfigMap、IngressRouteTCP),实现MySQL 5.7版本的规范化部署,重点保障数据持久化、集群内外网络可访问及配置灵活自定义。所有资源均部署在mysql命名空间下,需提前执行命令创建该命名空间:kubectl create namespace mysql。
二、核心资源配置与部署
1. 配置自定义参数:ConfigMap
MySQL的核心运行参数通过ConfigMap进行统一管理,便于后续参数调整、维护及复用。创建mysql-config.yaml配置文件,明确定义字符集、最大连接数、绑定地址等关键参数,具体内容如下:
1 | apiVersion: v1 |
该配置已做针对性优化:将字符集统一设置为utf8mb4,彻底解决中文乱码及特殊字符存储问题;绑定地址设为0.0.0.0,确保MySQL可被K3s集群内所有节点访问;调整最大连接数至2000,满足中高并发业务场景需求。配置文件编写完成后,执行以下命令部署ConfigMap:
1 | kubectl apply -f mysql-config.yaml |
2. 数据持久化:PVC/PV配置
MySQL作为关系型数据库,数据持久化是核心需求,需通过PVC(持久化卷声明)和PV(持久化卷)配置,避免Pod重建、重启后数据丢失。本文提供两种存储方案,可根据实际部署场景灵活选择。
方案1:基于local-path存储类(推荐)
K3s集群默认内置local-path存储类,无需手动创建PV,仅需创建PVC即可自动完成PV绑定,部署高效便捷。创建mysql-pvc-local-path.yaml文件,内容如下:
1 | apiVersion: v1 |
执行部署命令,完成PVC创建:
1 | kubectl apply -f mysql-pvc-local-path.yaml |
方案2:基于hostPath的PV/PVC(自定义存储路径)
若需指定K3s节点本地具体路径作为MySQL数据存储位置,可手动创建PV和PVC。需注意,原始配置文件mysql-pvc-host-path.yaml中存在笔误(storge应为storage),修正后完整配置如下:
1 | apiVersion: v1 |
执行部署命令,完成PV和PVC创建:
1 | kubectl apply -f mysql-pvc-host-path.yaml |
注意:hostPath存储方案仅适用于单节点K3s集群;多节点集群需使用NFS等共享存储方案,确保数据一致性和可访问性。
3. 部署MySQL实例:StatefulSet
采用StatefulSet部署MySQL实例,可保证Pod名称固定、存储挂载稳定,更适配数据库这类有状态应用的部署需求。创建mysql-deployment.yaml文件(实际为StatefulSet资源类型,命名仅为便于识别),具体配置如下:
1 | apiVersion: apps/v1 |
该配置核心说明:
镜像选用mysql:5.7稳定版本,通过环境变量
MYSQL_ROOT_PASSWORD直接设置root用户密码为root(注:生产环境需使用Secret存储密码,避免明文暴露);将PVC挂载至MySQL默认数据目录
/var/lib/mysql,确保数据持久化;将ConfigMap挂载至MySQL配置文件目录,覆盖默认配置,应用自定义参数;暴露3306端口,为集群内访问提供基础。
执行部署命令,启动MySQL实例:
1 | kubectl apply -f mysql-deployment.yaml |
4. 集群内访问:Service配置
创建ClusterIP类型的Service,为MySQL实例提供稳定的集群内访问地址,避免因Pod IP变化导致访问失败。创建mysql-service.yaml文件,配置如下:
1 | apiVersion: v1 |
部署完成后,K3s集群内其他Pod可通过固定域名mysql.mysql.svc.cluster.local:3306访问MySQL服务,无需关注具体Pod IP。执行部署命令:
1 | kubectl apply -f mysql-service.yaml |
5. 外部访问:IngressRouteTCP配置
若需从K3s集群外部访问MySQL服务,可结合K3s默认Ingress控制器(Traefik),配置IngressRouteTCP实现TCP流量转发。创建mysql-ingress.yaml文件,配置如下:
1 | apiVersion: traefik.io/v1alpha1 |
注意:需提前在Traefik中配置mysql入口点(entryPoints),并监听指定端口(如3306),确保外部流量可正常转发至MySQL Service,否则外部访问会失败。
执行部署命令,完成IngressRouteTCP配置:
1 | kubectl apply -f mysql-ingress.yaml |
三、部署验证
部署完成后,需通过一系列操作验证MySQL服务是否正常运行、配置是否生效,具体步骤如下:
检查所有相关资源状态,确认部署无异常:
kubectl get all -n mysqlkubectl get pvc,pv -n mysqlkubectl get configmap -n mysql若所有资源均处于Running、Bound等正常状态,说明部署基础无问题。验证MySQL内部连接及配置生效情况:
# 进入MySQL Pod内部kubectl exec -it mysql-0 -n mysql -- mysql -uroot -proot# 执行SQL命令,验证字符集等配置是否生效mysql> show variables like '%character%';若查询结果中字符集相关参数均为utf8mb4,说明配置已成功应用。外部访问验证(若已配置IngressRouteTCP):
mysql -h <K3s节点IP> -P <Traefik监听端口> -uroot -proot若能成功登录MySQL,说明外部访问配置生效。
四、注意事项
生产环境安全规范:
MYSQL_ROOT_PASSWORD严禁明文写在配置文件中,需通过Kubernetes的Secret资源存储,提升密码安全性。多节点集群存储建议:多节点K3s集群中,应使用Longhorn等分布式存储替代hostPath,避免单节点故障导致数据丢失,保障数据库高可用。
架构扩展说明:本文部署的为MySQL单实例,若需实现主从复制、读写分离架构,需在ConfigMap中额外配置主从复制相关参数,并调整StatefulSet配置。
数据备份要求:需定期备份PVC挂载目录中的数据,可通过定时任务脚本或专业备份工具实现,防止存储故障、误操作导致数据丢失。
配置更新生效:修改ConfigMap中的MySQL参数后,需重启MySQL StatefulSet使配置生效,执行命令:
kubectl rollout restart statefulset mysql -n mysql。
通过以上步骤,可在K3s集群中快速、规范地部署一个配置可定制、数据可持久化、网络可访问的MySQL实例,满足开发测试或生产环境的基础数据库使用需求,同时为后续架构优化、性能调优提供基础。