跳转到主内容
趣航编程网 - 趣学编程,启航技术之路!

如何在Kubernetes中持久化安装MySQL_配置PVC存储卷与StatefulSet

必须用volumeClaimTemplates而非静态PVC,因其能为每个StatefulSet Pod自动生成独立命名(如data-volume-mysql-0)且专属绑定的PVC,确保MySQL数据隔离与持久化;手动创建编号PVC难维护、无法自动扩缩,而volumeClaimTemplates原生支持动态供给、严格匹配volumeMounts.name和可用StorageClass,并依赖WaitForFirstConsumer等正确配置实现可靠挂载。
StatefulSet
是部署 MySQL 这类有状态应用的唯一合理选择,用
Deployment
挂
PVC
会导致多个 Pod 共享同一份数据,直接损坏 MySQL 的 InnoDB 文件系统。 为什么必须用 volumeClaimTemplates 而不是静态 PVC StatefulSet 的每个 Pod 必须绑定**独立、专属**的存储卷,不能复用同一个 PVC。手动创建一堆带编号的 PVC(如
mysql-data-0
、
mysql-data-1
)既难维护又无法自动扩缩。
volumeClaimTemplates
是 StatefulSet 原生支持的机制,它会在创建
mysql-0
时自动生成名为
data-volume-mysql-0
的 PVC(名称格式为
[template-name]-[pod-name]
),并自动绑定 PV。 模板中
storageClassName
必须存在且可用,否则 PVC 卡在
Pending
模板中
accessModes
必须是
ReadWriteOnce
(MySQL 不支持多节点并发写) 不要在模板里写
resources.requests.storage
以外的字段,比如
selector
或
volumeName
—— 它们会被忽略或报错 StorageClass 配置的关键参数:volumebindingmode 如果你用的是云厂商 CSI(如阿里云
alicloud-disk-essd
、AWS
gp3
),
volumebindingmode
必须设为
WaitForFirstConsumer
,否则可能调度失败。 原因:云盘只能挂载到特定可用区的节点;如果先创建 PV 再调度 Pod,而 PV 在杭州可用区 A、Pod 被调度到杭州可用区 B,就会卡住。 MySQL(Linux) MySQL 9.6.0是面向Linux平台的2026年创新版本,核心架构迎来重大革新。其将外键约束与级联操作从InnoDB引擎层上移至SQL层,确保所有数据变更均被完整记录至Binlog,彻底解决了CDC(变更数据捕获)与主从复制中的数据不一致难题。此外,该版本引入container_aware启动选项以原生适配容器环境,并对审计日志进行了组件化重构,为追求极致数据一致性与云原生体验的开发者提供了全新选择。 下载 检查命令:
kubectl describe sc alicloud-disk-essd
,确认
VolumeBindingMode
是
WaitForFirstConsumer
若不是,需新建 SC 并在 StatefulSet 中显式引用新名称,不能改默认 SC 本地 NFS 或 Longhorn 等自建方案可设为
Immediate
,但 NFS 要确保所有 Node 都能 mount 同一路径 StatefulSet YAML 中容易漏掉的三处硬性依赖 缺任意一项,Pod 会卡在
Pending
或
ContainerCreating
,日志里看不到明显错误,排查极耗时。 必须定义一个
headless Service
(
clusterIP: None
),且
serviceName
字段要和 StatefulSet 的
serviceName
完全一致 —— 这是 StatefulSet 分配稳定 DNS 名(如
mysql-0.mysql-headless.default.svc.cluster.local
)的前提
volumeClaimTemplates
下的
name
(如
data-volume
)必须和容器
volumeMounts.name
完全匹配,大小写敏感 MySQL 容器启动前必须初始化数据目录权限,常见做法是在
initContainers
里执行:
chown -R 999:999 /var/lib/mysql
(对应 MySQL 官方镜像的非 root 用户 UID) PVC 绑定后仍挂载失败的典型现象与定位 现象:Pod 处于
ContainerCreating
,
kubectl describe pod mysql-0
显示:
Unable to attach or mount volumes: unmounted volumes=[data-volume], unattached volumes=[data-volume ...]
这不是配置问题,而是底层存储不可达。优先按顺序查: 运行
kubectl get pvc
,确认状态是
Bound
;若为
Pending
,看
Events
里是否提示 StorageClass 不可用或配额超限 运行
kubectl get pv
,确认 PV 的
STATUS
是
Bound
,且
NODE AFFINITY
允许调度到当前 Node(尤其云盘 PV 会带
nodeAffinity
字段) 登录对应 Node,执行
mount | grep mysql
和
dmesg | tail -20
,确认 NFS/CSI 插件是否成功挂载,有没有权限或网络拒绝(如 NFS server export 权限没开
no_root_squash
) 最常被忽略的是:NFS 服务端防火墙未放行
2049
端口,或客户端没装
nfs-utils
—— Kubernetes 不会主动报这个错,只会无限等待挂载超时。

相关文章