KKubepath
集群运维工程师 路线27 / 36 · L3 平台能力退出路线
闯关预计 30 分钟

闯关:PVC 一直 Pending,业务起不来

模拟终端里给你一个卡了十分钟的 PVC,按目标一步步定位到真正的根因。

学完这节你能做到

  • 用 events 而不是猜测来定位 PVC 卡住的原因
  • 分清 PVC Pending 与 Pod ContainerCreating 两类故障的排查路径
  • 读懂 CSI provisioner 日志里的关键报错

现场是这样的:业务方说新上的服务起不来,Pod 卡了十分钟。你 kubectl get pod 一看,ContainerCreating;再看 PVC,Pending

这一关的目标不是记住答案,而是练顺序:先看现象,再让集群自己说话,最后才去猜后端。绝大多数人在这类故障上浪费时间,是因为第一步就跳去登存储节点了。

开始之前:先想清楚在哪一侧

上一节的分界线在这里要用上:

  • PVC Pending → 卷还没被创建出来 → 看 controller 侧的 provisioner
  • PVC Bound,Pod ContainerCreating → 卷有了但挂不上 → 看那台节点的 node plugin

这一关是前者。所以整场排查都不需要登任何一台计算节点。

root@mn-10-128-0-1
目标 0/6
  1. 1.确认 PVC 的状态和它请求的 StorageClass
  2. 2.看 Events,让集群直接告诉你卡在哪
  3. 3.到 provisioner 日志里确认报错反复出现,不是偶发
  4. 4.看 StorageClass 里配的池名与 secret
  5. 5.确认 CSI 用的是哪个存储侧用户
  6. 6.在存储侧核对这个用户的权限范围,定位根因
模拟终端:default 命名空间下的 data-pvc 已经 Pending 十分钟,业务 Pod 起不来。
输入 goals 看目标,hint 要提示,help 看用法。
[root@mn-10-128-0-1 ~]#
help 查看用法 · goals 看目标 · hint 要提示 · ↑↓ 翻历史

根因与修复

client.kubernetes 的 OSD 权限被限定在 pool=kube,而 StorageClass 里指定的池是 rbd。两边对不上,于是每次创建卷都被存储侧拒绝。

修复方式二选一,取决于你想以哪边为准:

# 方式一:放开用户权限到 SC 声明的那个池
ceph auth caps client.kubernetes \
  mon 'profile rbd' \
  osd 'profile rbd pool=rbd' \
  mgr 'profile rbd pool=rbd'

# 方式二:把 StorageClass 的 pool 改成 kube
# 注意 SC 的 parameters 是不可变字段,要删掉重建
改完之后不用重建 PVC

provisioner 会一直重试 —— 从 Events 里的 x8 over 10m 就能看出来。权限一放开,下一次重试就成功,PVC 自己会变成 Bound。

这是 reconcile 模式给的便利:你只需要把环境改成对的,控制器会自己收敛。反过来说,如果改完十分钟还没动,那就说明你改的不是真正的原因。

PVC Pending 排查清单

按顺序走,绝大多数问题在前三步就定位了:

#检查项命令常见原因
1PVC 事件kubectl describe pvc信息最直接,永远先看这里
2SC 存在吗kubectl get sc名字写错、SC 不存在、没有默认 SC
3provisioner 日志kubectl logs <csi-controller>权限、网络、参数错误
4secret 是否正确kubectl get secret -o yamlkey 名错、namespace 错、内容过期
5后端是否健康ceph -s / mmhealth存储侧真的有问题
6accessMode 支持吗对比 SC 与 PVC块存储要了 RWX
7容量与配额ceph df / mmlsquota后端没空间了
8拓扑约束describe 里的调度信息WaitForFirstConsumer + 无可用节点
检查点单选

这一关里,为什么不需要登上业务 Pod 所在的那台计算节点?

检查点单选

provisioner 报 Permission denied,而存储集群是 HEALTH_OK。最该往哪个方向查?

这一关的收获

  • 看现象 → 看事件 → 看控制器日志,这个顺序对所有对象都成立,不只是 PVC
  • PVC 是 Pending 还是 Bound,直接决定你该去 controller 侧还是节点侧
  • 错误信息里的措辞很值钱:Permission deniedconnection timeout 指向完全不同的方向
  • 存储集群 HEALTH_OK 不代表接入配置没问题 —— 大多数「存储故障」其实是接入配置错误

延伸资料

  • ·k8s-in-actionstorage/ceph-csi-rbd/README.md