← 中文资源

简体中文版本

Kubernetes PVC 一直 Pending — 无 StorageClass 或绑定失败

通过匹配 StorageClass、检查访问模式与容量,并查看 provisioner 事件,修复卡在 Pending 的 PVC。

阅读英文原文

症状

本篇调试指南针对“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 启动并挂载卷。

修复后补充一条回归测试,复现原始症状,防止问题再次出现。

这类故障通常是环境问题而非纯逻辑错误,因此在缺陷记录中应写明完整命令、环境变量与工作目录。请用最小的脚本复现,待最小用例清楚后再扩大范围。为这类故障准备一份简短的排查清单,能显著减少下次排障时间。