症状
本篇调试指南针对“Kubernetes PVC 一直 Pending — 无 StorageClass 或绑定失败”。内容涵盖可观察的症状、可复现的诊断路径、根本原因、具体修复方式,以及如何验证修复并防止回归。
可观察到的症状包括:
- PersistentVolumeClaim 一直处于 Pending
- 使用该 PVC 的 Pod 因等待卷而 Pending
- 事件显示 “no persistent volumes available for this claim”
诊断
先在隔离环境中复现故障,再按顺序执行以下检查,逐步缩小范围。
步骤 1
kubectl describe pvc <pvc> | tail -20
事件会指出失败原因:缺少类、不支持的模式或 provisioner 错误。
步骤 2
kubectl get storageclass
(default) 标记显示哪个类会绑定未指定类的 PVC;无标记则必须显式指定。
常见诱因(按出现频率排序):
- 不存在默认 StorageClass,且 PVC 未指定
- 所请求的访问模式或容量不被该类支持
- provisioner 缺失或无权创建卷
根因
动态供给需要 StorageClass,或由 PVC 显式指定,或设为集群默认。若无,或所请求的访问模式/容量不受支持,无 provisioner 创建卷,PVC 便一直 Pending。
修复
在 PVC 上指定已有的 StorageClass,把有效类标记为默认,请求受支持的访问模式与容量,并确保 provisioner 具备所需权限。
注意:创建后不允许更改访问模式;删除 PVC 可能丢数据,除非回收策略为 Retain。
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: data
spec:
storageClassName: standard # name a class that exists
accessModes: ["ReadWriteOnce"]
resources:
requests:
storage: 10Gi
# set a default class if none exists
# kubectl patch storageclass standard -p '{"metadata":{"annotations":{"storageclass.kubernetes.io/is-default-class":"true"}}}'
验证
确认 PVC 绑定并显示 Bound;验证使用它的 Pod 启动并挂载卷。
修复后补充一条回归测试,复现原始症状,防止问题再次出现。
这类故障通常是环境问题而非纯逻辑错误,因此在缺陷记录中应写明完整命令、环境变量与工作目录。请用最小的脚本复现,待最小用例清楚后再扩大范围。为这类故障准备一份简短的排查清单,能显著减少下次排障时间。