Rook-Ceph块存储出现FailedAttachVolume错误,WordPress示例Pod无法启动求助
看起来你遇到的是Rook-Ceph块存储挂载失败的典型问题,我之前帮好几个同事排查过类似情况,给你几个实用的排查和解决方向:
1. 先排查RBD镜像特性与节点内核的兼容性问题
这是触发FailedAttachVolume最常见的原因!Ceph默认创建的RBD镜像会开启一些高级特性,但如果你的节点内核版本比较旧(比如低于5.4),可能不支持这些特性,直接导致挂载失败。
先找到你WordPress PVC对应的RBD镜像信息:
# 先获取PVC绑定的PV名称 PV_NAME=$(kubectl get pvc wp-pv-claim -o jsonpath='{.spec.volumeName}') # 再获取镜像名称和存储池名称 IMAGE_NAME=$(kubectl get pv $PV_NAME -o jsonpath='{.spec.csi.volumeAttributes.imageName}') POOL_NAME=$(kubectl get pv $PV_NAME -o jsonpath='{.spec.csi.volumeAttributes.pool}')
然后进入Rook的工具Pod查看镜像的特性:
kubectl -n rook-ceph exec -it deploy/rook-ceph-tools -- rbd info $POOL_NAME/$IMAGE_NAME
如果输出里看到features: exclusive-lock, object-map, fast-diff, deep-flatten这类特性,而你的节点内核版本不支持,就禁用这些特性:
kubectl -n rook-ceph exec -it deploy/rook-ceph-tools -- rbd feature disable $POOL_NAME/$IMAGE_NAME exclusive-lock object-map fast-diff deep-flatten
最后删除原来的WordPress Pod,让它重新调度挂载试试:
kubectl delete pod -l app=wordpress
2. 检查存储类的配置是否存在疏漏
你创建的rook-ceph-block存储类可能有配置项缺失,导致PV挂载异常。先查看存储类的完整配置:
kubectl get sc rook-ceph-block -o yaml
重点检查这几个点:
- Provisioner是否为
rook-ceph.rbd.csi.ceph.com(确保用的是CSI驱动,不是旧的rbd-provisioner) - Parameters里是否指定了正确的
clusterID(和你的Rook集群ID一致) - 是否添加了
csi.storage.k8s.io/fstype: ext4这类文件系统配置 - 存储池名称是否存在(可以用
kubectl -n rook-ceph exec -it deploy/rook-ceph-tools -- ceph osd lspools查看)
3. 验证节点上的RBD依赖是否正常
节点必须加载了RBD内核模块,并且工具版本和Ceph集群匹配:
# 检查RBD内核模块是否加载 lsmod | grep rbd # 如果没加载,手动加载 modprobe rbd
另外,节点上的rbd工具版本尽量和Ceph集群版本接近,版本差太多也会出现挂载错误。
4. 确认Ceph集群底层是否正常
虽然你说ceph -s显示HEALTH_OK,但还是要检查下OSD的状态,尤其是你混合了HDD和SSD磁盘的情况:
kubectl -n rook-ceph exec -it deploy/rook-ceph-tools -- ceph osd tree
确保所有OSD都处于up和in状态,没有离线或故障的情况。另外也可以检查下对应PV的镜像所在的OSD是否有IO异常。
5. 检查节点上的Rook Agent状态
Rook会在每个节点部署Agent Pod负责存储挂载,要是Agent出问题也会导致挂载失败:
kubectl -n rook-ceph get pods -o wide | grep agent
确保所有节点的Agent Pod都处于Running状态,没有CrashLoopBackOff或Pending的情况。如果有异常,查看Agent的日志排查原因。
备注:内容来源于stack exchange,提问作者Igor Nazarov

