解决k8s集群中mount volume失败的问题

有的时候,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

这样的报错信息,可以参考下面这篇文章的思路进行排查:

https://cloud.tencent.com/developer/article/1469532?from=information.detail.rbd:%20unmap%20failed:%20(16)%20device%20or%20resource%20busy

原文地址:https://www.cnblogs.com/00986014w/p/13683909.html