有的时候,k8s中挂载了rbd存储的pod重启后会持续处于ContainerCreating的状态,describe后发现有MountVolume.Setup failed以及Unable to mount volumes for pod xxx的错误描述。
这种情况看上去是rbd设备挂载到pod上失败,但真实原因往往是pod迁移后,在原节点上map的rbd设备没有正常迁移走导致的。
这个时候应该执行的是手动从原节点上unmap掉这个rbd设备。
一、找到rbd设备map的节点
通过kubectl get pvc找到这个pvc所绑定的pv。
然后根据这个pv,在集群中每个节点上依次执行:
rbd showmapped | grep [pv]
找到这个pv所map的节点和rbd设备。(节点多的话需要通过脚本)
二、查看挂载点
看一下这个rbd设备有没有挂载点(应该是没有)。
执行:
findmnt -n [rbd设备]
如果没有输出表明没有挂载点。如果输出类似/var/lib/kubelet/plugins/kubernetes.io/rbd/*,表明挂载点有误,需要手动删除挂载点。
执行:
umount [挂载点]
三、手动unmap
确保没有挂载点之后,执行
rbd unmap [rbd设备]
手动将这个rbd设备unmap掉。
过一段时间后,新的rbd设备会自动挂载到新节点上,并为新pod所使用。
四、问题排查
如果在执行rbd unmap的时候,出现:
rbd: sysfs write failed rbd: unmap failed: (16) Device or resource busy
这样的报错信息,可以参考下面这篇文章的思路进行排查: