手动解除k8s对ceph rbd的挂载
程序员文章站
2024-03-13 08:59:51
...
pod漂移失败:
在 kubernetes 中,如果某个节点出现问题(比如 kubelet 服务不可用), 集群会自动把这个节点上的pod 飘到其他节点.但是,如果一个pod挂载了ceph rbd类型的存储卷(pv),那么这个pod在新节点上是无法正常启动的.会提示如下错误:
Multi-Attach errorforvolume"pvc-4f91d1a6-fcec-11e8-bd06-6c92bf74374a"Volumeisalready exclusively attached to one nodeandcan't be attached to another。
原因如下:
kubelet 服务是与集群通信的.如果这个服务出现问题,集群就会与这个节点失联,而这个节点上的容器是正常在运行的,所以这个容器还会占用这个pv的挂载.而集群并不能删掉这个容器,也不能控制这个节点取消挂载.
所以.这个时候,需要手动进行干预
方法一:手动解除挂载
首先看一下卷是如何挂载的.
1. 强制删除有问题的pod:
kubectl delete pod -n <namespace> <pod name> --grace-period=0 –force
2.查看新建pod的状态:
kubectl describe pod -n <namespace> <pod name>
在event中发现 Multi-Attach 的异常.
3. 查看这个pv的信息:
kubectl describe pv <pv name>
可以Source.RBDImage
获取相关的rbd name
rbd status <rbd name>
可以看到.这个rbd的image正在被某个node使用
4. 到这个node上去查看 rbd的使用情况,可以看到rbd挂载到node的设备名
rbd showmapped|grep <rbd name>
5.找到之前pod产生的容器.手动将它停止:
6.解除设备到容器(pod)的挂载.(第四步的获取设备)
umount /dev/rbd0
7.解除node对ceph-rbd 的映射:
rbd unmap <rbd name>
8.重启新的pod:
kubectl delete po -n <namespace name> <pod name>
9.到这,新的pod就可以正常启动了.
方法二:重启
重启这个有问题的节点
使用cephfs的方式:
出现这个问题的一个重要原因是ceph-rbd只能支持单读写(RWO).而cephfs支持多读写(RWO),就不会有这个问题了.
推荐阅读