闯关预计 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,PodContainerCreating→ 卷有了但挂不上 → 看那台节点的 node plugin
这一关是前者。所以整场排查都不需要登任何一台计算节点。
root@mn-10-128-0-1
目标 0/6- 1.确认 PVC 的状态和它请求的 StorageClass
- 2.看 Events,让集群直接告诉你卡在哪
- 3.到 provisioner 日志里确认报错反复出现,不是偶发
- 4.看 StorageClass 里配的池名与 secret
- 5.确认 CSI 用的是哪个存储侧用户
- 6.在存储侧核对这个用户的权限范围,定位根因
模拟终端:default 命名空间下的 data-pvc 已经 Pending 十分钟,业务 Pod 起不来。 输入 goals 看目标,hint 要提示,help 看用法。
[root@mn-10-128-0-1 ~]#
根因与修复
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 排查清单
按顺序走,绝大多数问题在前三步就定位了:
| # | 检查项 | 命令 | 常见原因 |
|---|---|---|---|
| 1 | PVC 事件 | kubectl describe pvc | 信息最直接,永远先看这里 |
| 2 | SC 存在吗 | kubectl get sc | 名字写错、SC 不存在、没有默认 SC |
| 3 | provisioner 日志 | kubectl logs <csi-controller> | 权限、网络、参数错误 |
| 4 | secret 是否正确 | kubectl get secret -o yaml | key 名错、namespace 错、内容过期 |
| 5 | 后端是否健康 | ceph -s / mmhealth | 存储侧真的有问题 |
| 6 | accessMode 支持吗 | 对比 SC 与 PVC | 块存储要了 RWX |
| 7 | 容量与配额 | ceph df / mmlsquota | 后端没空间了 |
| 8 | 拓扑约束 | describe 里的调度信息 | WaitForFirstConsumer + 无可用节点 |
这一关里,为什么不需要登上业务 Pod 所在的那台计算节点?
provisioner 报 Permission denied,而存储集群是 HEALTH_OK。最该往哪个方向查?
这一关的收获
- 看现象 → 看事件 → 看控制器日志,这个顺序对所有对象都成立,不只是 PVC
- PVC 是
Pending还是Bound,直接决定你该去 controller 侧还是节点侧 - 错误信息里的措辞很值钱:
Permission denied和connection timeout指向完全不同的方向 - 存储集群 HEALTH_OK 不代表接入配置没问题 —— 大多数「存储故障」其实是接入配置错误
延伸资料
- ·k8s-in-action
storage/ceph-csi-rbd/README.md