事情本身不复杂,线索都在日志里。K8s 1.25 上把 MySQL 的 PVC 从 50G 改到 200G,kubectl get pvc 显示 200Gi 且状态 Bound,进容器 df -h 的挂载点还是 50G,写入照样报空间不足。
第一反应是「Pod 用的是 subPath 挂载,kubelet 不会对这种方式做文件系统扩容」,验证下来不成立。
原因不止一个,得分开看。存储类没开 allowVolumeExpansion,PVC 的 spec 被改回原值却不报错。另一种情况是底层的云盘已扩容,文件系统还没 resize,需要 kubelet 触发一次 NodeExpand。
少数情况下是CSI 驱动版本太老,不实现 ControllerExpand 接口,只改了对象不动盘。
上来先确认 PVC 与存储类的扩容能力
kubectl get pvc data-mysql -o jsonpath='{.spec.resources.requests.storage}{.status.capacity.storage}'
再往下看 StorageClass 是否允许扩容
kubectl get sc fast-ssd -o jsonpath='{.allowVolumeExpansion}'
接着重启 Pod 让 kubelet 重做挂载
kubectl delete pod mysql-0 && kubectl get pod mysql-0 -w
剩下的就是在容器里复核文件系统容量
kubectl exec mysql-0 -- df -h /var/lib/mysql
改完先别撤,确认这几项。容器内 df 显示的容量接近 200G,PVC 的 status.capacity 与实际一致,导入大表不再报 No space left。
容易忽略的是,用 subPath 挂 PVC 是最常见的扩容失效原因,改成挂目录本身;云盘扩容本身免费,文件系统那一步必须靠重启 Pod 触发。改动前把原配置备份一份,出问题能马上回滚,这比任何技巧都实用。
