PVC 扩容是什么
PVC 扩容指在不重建存储的前提下把卷改大:改大 spec.resources.requests.storage 后,CSI 驱动或 in-tree 插件先向存储侧申请扩容,再把文件系统扩到新容量。它有两个硬前提——StorageClass 必须开启 allowVolumeExpansion,且只允许增大不允许缩小。文件系统那一层有时要等 Pod 重启或重新挂载才完成。
基本信息
| 前提条件 | StorageClass 中 allowVolumeExpansion: true |
|---|---|
| 操作命令 | kubectl patch pvc <名称> -p 改大 requests.storage |
| 方向限制 | 只支持扩大,缩小会被 API Server 拒绝 |
| 生效层次 | 先扩底层卷,再扩文件系统 |
| 完成时机 | 部分驱动需重启使用该卷的 Pod 才完成文件系统扩展 |
典型使用场景
- 数据库磁盘告急:容量接近上限又无停机窗口时,先在线扩卷再安排数据整理
- 日志与队列堆积:临时上调容量争取处理时间,事后配合保留策略回收
- 容量规划调整:业务增长后把模板与已有 PVC 的容量口径一起上调,避免后续副本继续踩坑
- 扩容演练与验收:验证存储类是否真的支持在线扩容,避免故障当天才发现要停机
- 多副本有状态服务:逐条扩容每个副本的 PVC,而非只改 StatefulSet 模板
扩容操作与观察
扩容操作与观察
kubectl get sc fast-ssd -o jsonpath='{.allowVolumeExpansion}' # 先确认前提,返回 true 才能扩
kubectl patch pvc mysql-data -p '{"spec":{"resources":{"requests":{"storage":"200Gi"}}}}'
kubectl get pvc mysql-data -w # STATUS 与 CAPACITY 的变化
kubectl describe pvc mysql-data | sed -n '/Conditions:/,$p' # FileSystemResizePending 等原文在此
kubectl get events --field-selector reason=VolumeResizeFailed # 存储侧拒绝的理由状态字段读法
| 观察点 | 含义 | 正常进展 |
|---|---|---|
| spec.resources.requests.storage | 你声明的期望容量 | patch 后立即变成新值 |
| status.capacity.storage | 存储侧实际提供的容量 | 稍后跟上,长期不变说明底层卷没扩 |
| Conditions | FileSystemResizePending 表示待扩文件系统 | 重启 Pod 后消失 |
| Events | VolumeResizeFailed 记录失败原因 | 多为存储配额、驱动不支持或类型不符 |
| Pod 内 df -h | 容器看到的文件系统大小 | 最终以这里为准,两者都可能滞后 |
常见滞后现象是 status.capacity 已变大而 Pod 内 df 不变:多数文件系统类型只能在挂载时扩展,此时按驱动文档重启使用该卷的工作负载即可。StatefulSet 场景逐个副本操作,注意一次只动一个,避免影响可用性。
缩容不做支持:把 requests.storage 改小会被 API Server 拒绝。需要缩容只能新建小卷、迁移数据并切换,属于有计划的数据搬迁,而不是一条命令。