PV 生命周期是什么
PV 是集群级的存储对象,PVC 是命名空间里的申请,两者一对一绑定。PV 的状态描述它在绑定与回收链条上的位置:Available 表示空闲待绑,Bound 表示已有 PVC,Released 表示 PVC 已删除但卷还没回收,Failed 表示自动回收失败。真正决定删除 PVC 之后卷会怎样的是回收策略,Delete 会连底层存储一起删,Retain 会留下数据等你手工处理。
基本信息
| PV 作用域 | 集群级对象,不隶属命名空间 |
|---|---|
| PVC 作用域 | 命名空间级,与 PV 一对一绑定 |
| 回收策略 | Delete 删除底层存储,Retain 保留数据,Recycle 已废弃 |
| 发布阶段 | Available、Bound、Released、Failed 四个阶段 |
| 绑定条件 | 容量、访问模式、存储类与卷模式都要匹配 |
状态与处置
| 状态 | 含义 | 下一步动作 |
|---|---|---|
| Available | 空闲可绑定 | 创建 PVC 或按卷名静态指定 |
| Bound | 已绑定某个 PVC | 用 pvc.spec.volumeName 反查归属 |
| Released | PVC 已删除,卷未回收 | 备份数据后手工回收或重新引入 |
| Failed | 自动回收失败 | 看事件与底层存储侧状态 |
| Pending(PVC) | 尚未完成绑定 | 等待供应或修正匹配条件 |
查看与手工回收
查看与手工回收
kubectl get pv,pvc -A # 总览绑定关系与状态
kubectl describe pv pvc-8f3d | sed -n '/Status:/,+3p' # 看阶段与回收策略
kubectl get pv pvc-8f3d -o jsonpath='{.spec.claimRef.name}{"\n"}' # Released 卷指向的旧 PVC
kubectl patch pv pvc-8f3d -p '{"spec":{"claimRef":null}}' # 清引用使其回到 Available
kubectl get pv -o custom-columns='NAME:.metadata.name,CLAIM:.spec.claimRef.name,POLICY:.spec.persistentVolumeReclaimPolicy'典型使用场景
- 清理命名空间后的收尾:PVC 随命名空间删除,PV 的去留由回收策略决定,需要逐个确认
- 数据保留:生产数据卷用 Retain,避免误删 PVC 时连带删掉后端存储
- 卷复用:Released 卷要重新被使用,必须先让状态回到可绑定的样子
- 容量与访问模式排查:PVC 长期 Pending 时对比 PV 与 PVC 的匹配条件
- 审计存储资产:按回收策略与状态统计空闲卷,找出长期占资源未使用的卷
官方建议的 Retain 卷恢复流程是「先备份,再删除 PV 对象(保留后端存储),然后按静态卷方式新建指向同一存储的 PV」。直接清空 claimRef 能更快让卷回到 Available,但旧数据仍在卷上,新的 PVC 挂载后会直接看到这些数据。
删 PVC 前核对 PV 的回收策略:Delete 策略下删 PVC 会连带删除底层存储,数据无法通过 Kubernetes 恢复。回收策略写错是存储类事故里最常见的一类。