k8s使用StatefulSet(有状态)部署单节点 MySQL方案(使用本地存储)
✅ Kubernetes 单节点 MySQL(使用本地存储)有状态服务部署方案
⚠️ 注意:
- 本文不阐述 集群搭建 需准备至少 1个master + 1个worker(最好两个)
- 本文应用的是k8s v1.33.4 搭建的集群,不见得适合其他版本(未验证)
- 使用 手动创建的 Local PV(PersistentVolume) + PVC(PersistentVolumeClaim),属于 非动态、但标准、免费、可控 的本地存储方案。
- 不适合多节点高可用,但可通过 备份、监控、定期维护 保障业务连续性。
一. 📦部署总览
我们将按如下顺序部署以下 Kubernetes 资源,以确保依赖关系正确、存储先就绪:
- 🔐 Secret – 安全注入 MySQL root 密码
- 📂 ConfigMap – 配置 MySQL 参数(字符集、时区、连接数等)
- 🧩 PV & PVC(手动创建) – 手动创建本地 PV 与 PVC,绑定节点目录
- 🐳 StatefulSet – 运行 MySQL 容器,挂载 PVC 与 ConfigMap
- 🌐 Service – 提供集群内访问入口(ClusterIP)
- 🛡️ PodDisruptionBudget (PDB) – 保障服务可用性
二. 🔐 Secret:设置 MySQL Root 密码(安全注入)
📄 文件名:mysql-secret.yaml
apiVersion: v1
kind: Secret
metadata:name: mysql-secretnamespace: default
type: Opaque
stringData:mysql-root-password: yumeko123!!! # 🔒 请替换为您自己的强密码!
✅ 请将
yumeko123!!!
替换为真正的强密码,比如包含大小写、数字、特殊符号。
三. 📂 ConfigMap:配置 MySQL(字符集、时区、连接数等)
📄 文件名:mysql-config-cm.yaml
apiVersion: v1
kind: ConfigMap
metadata:name: mysql-custom-confignamespace: default
data:my-custom.cnf: |[mysqld]# 字符集character-set-server = utf8mb4collation-server = utf8mb4_unicode_ci# 时区(推荐使用 UTC 偏移,避免依赖时区表)default-time-zone = '+08:00' # 东八区,等同于 Asia/Shanghai# InnoDB 缓冲池(根据节点内存调整,比如 256M~1G)innodb_buffer_pool_size = 256M
四. 🧩 手动创建 PV 与 PVC(关键!绑定节点本地存储)
✅ 本步骤先于 StatefulSet,确保 PVC 已存在并被正确绑定到本地 PV