手动解除k8s对ceph rbd的挂载

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支持多读写(RWX),就不会有这个问题了.

猜你喜欢

转载自blog.csdn.net/s7799653/article/details/88303605
今日推荐