欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

手动解除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),就不会有这个问题了.