服务器K8s集群PVC排错:从Pending到挂载失败的实操排查
PVC 卡在 Pending 或者 Pod 一直 ContainerCreating,通常不是网络问题,而是存储卷没绑定成功。
先执行 kubectl get pvc -A 看状态,再用 kubectl describe pvc <名称> -n <命名空间> 看 Events,大多数原因就写在那里。
先确认现象和排查入口
PVC 常见异常有三种:状态 Pending、状态 Bound 但 Pod 挂载失败、Pod 启动后读写报错。
先分清属于哪一种,再决定查 PVC、查 PV 还是查节点。
- 状态 Pending:PVC 没有绑定到 PV,重点看 StorageClass 和容量匹配。
- 状态 Bound 但 Pod 起不来:PV 已绑定,问题多在节点挂载或权限。
- Pod 运行但读写失败:检查挂载路径、权限和存储后端。
基础命令先跑一遍:
kubectl get pvc -A
kubectl get pv
kubectl get storageclass
kubectl get events -A --sort-by=.lastTimestamp | tail -30
get events 能把最近报错按时间排出来,比逐个 describe 更快定位。
定位 Pending:StorageClass 和 PV 是否对得上
PVC Pending 最常见的原因是 StorageClass 名称写错或不存在。
先看集群里有哪些 StorageClass:
kubectl get storageclass
再对照 PVC 里的 storageClassName 字段。
如果 PVC 写了一个不存在的名字,事件里会出现 storageclass.storage.k8s.io "xxx" not found。
第二种情况是访问模式不匹配。
PV 支持 ReadWriteOnce,PVC 却申请 ReadWriteMany,绑定就会失败。
用下面命令核对:
kubectl describe pvc -n <命名空间>
kubectl describe pv
重点看 Access Modes 和 Capacity 两行是否一致。
容量小于 PVC 申请值同样绑不上。
如果是静态供给,还要确认 PV 的 claimRef 有没有被别的 PVC 占用。
已绑定的 PV 不会再次分配给新 PVC。
处理 Bound 但挂载失败
PVC 显示 Bound,Pod 却停在 ContainerCreating,先看 Pod 事件:
kubectl describe pod -n <命名空间>
常见报错是 MountVolume.SetUp failed 或 timeout waiting for volume。
这类问题通常出在节点侧:
- NFS 或云盘挂载点不通,检查节点到存储后端的网络。
- 节点上挂载工具缺失,例如 NFS 客户端未安装。
- 存储后端容量已满或权限被回收。
可以在对应节点上手动测试挂载命令,确认存储端可达后再重启 kubelet:
systemctl restart kubelet
重启前确认该节点上的业务 Pod 可以短暂中断,避免影响生产。
避坑要点
- 不要直接删除 Bound 状态的 PVC,先确认数据是否需要保留。
- 修改 StorageClass 名称后,旧 PVC 不会自动重新绑定,需要重建。
- 云托管集群的默认 StorageClass 可能带
WaitForFirstConsumer,PVC 在 Pod 调度前一直 Pending 属于正常现象。 - 排查时优先看 Events,不要凭经验猜。
验证是否恢复
修复后按下面顺序确认:
kubectl get pvc -n <命名空间>
kubectl get pod -n <命名空间>
kubectl exec -it -n <命名空间> -- df -h
PVC 应为 Bound,Pod 应为 Running,df -h 能看到挂载点且容量正确。
再往挂载目录写一个测试文件,确认读写正常:
kubectl exec -it -n <命名空间> -- touch /data/test.txt
能创建成功,说明 PVC 排错流程走通。
如果仍失败,回到 describe pvc 和 describe pod 的事件继续查。
常见疑问
PVC 一直 Pending 但 StorageClass 存在,怎么办?
先看 PVC 事件里是否提示容量或访问模式不匹配,再检查 PV 是否已被其他 PVC 占用。
Pod 删除后 PVC 会跟着消失吗?
取决于 StorageClass 的回收策略,Delete 会删,Retain 会保留。用 kubectl get pv 看 RECLAIM POLICY 列。
云盘扩容后 PVC 容量没变?
先确认 StorageClass 是否允许扩容,再检查 PVC 是否已提交扩容请求。部分环境需要重启 Pod 才能识别新容量。