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