Kubernetes集群PVC处于Lost状态能否恢复?该如何排查解决?
问题根因
- 资源创建顺序错误:PVC创建时间(2021-09-26T02:58:32Z)早于PV创建时间(2021-09-26T03:01:02Z),PVC创建时指定了
spec.volumeName: nfs-zhuolian-report-mysql-pv但对应PV不存在,首次绑定流程执行失败,PVC被标记为Lost状态,且注解pv.kubernetes.io/bind-completed: "yes"标识绑定流程已完结,K8s绑定控制器不会自动重试该PVC的绑定逻辑。 - PV预绑定配置不完整:手动创建的PV虽然配置了
spec.claimRef指向目标PVC,但缺少对应PVC的uid字段,K8s无法确认该PV和PVC的绑定匹配关系,所以PV一直处于Available状态,无法和PVC完成绑定。
修复方案
按照以下步骤操作即可恢复绑定,且不会丢失NFS存储中的数据:
- 先备份现有PVC和PV的配置,防止误操作:
kubectl get pvc zhuolian-report-mysql-pv-claim -n dabai-uat -o yaml > pvc-bak.yaml kubectl get pv nfs-zhuolian-report-mysql-pv -o yaml > pv-bak.yaml
- 编辑PV配置,补全claimRef的UID字段:
执行kubectl edit pv nfs-zhuolian-report-mysql-pv,在spec.claimRef块下添加PVC的UID配置,修改后完整的claimRef如下:
"claimRef": { "kind": "PersistentVolumeClaim", "namespace": "dabai-uat", "name": "zhuolian-report-mysql-pv-claim", "uid": "3ca3425b-b2dc-4bd7-876f-05f8cbcafcf8" }
保存退出后PV状态会暂时变为Released。
3. 重置PVC的绑定状态:
执行kubectl edit pvc zhuolian-report-mysql-pv-claim -n dabai-uat,删除metadata.annotations下的pv.kubernetes.io/bind-completed: "yes"注解,同时删除status段的全部内容,保存退出。
4. 验证绑定结果:
等待10秒左右执行kubectl get pvc -n dabai-uat zhuolian-report-mysql-pv-claim,确认状态变为Bound即可,此时PV状态也会同步变为Bound。
如果上述操作后绑定未生效,可直接删除Lost状态的PVC(因PV的回收策略为Retain,删除PVC不会删除NFS中的数据和PV资源),再重新创建同配置的PVC,即可自动和PV完成绑定。
规避措施
- 手动管理PV/PVC时,严格按照「先创建PV,再创建对应PVC」的顺序操作,避免PVC提前创建触发绑定失败。
- 手动配置PV的
spec.claimRef做预绑定时,必须填写namespace、name、uid三个核心字段,不可缺省UID。 - 无特殊需求时建议配置StorageClass自动供应PV,PVC不需要指定
spec.volumeName,由K8s自动完成PV创建和绑定流程,减少人为操作错误。
内容的提问来源于stack exchange,提问作者Dolphin
相关产品推荐
相关产品推荐

