在今日重启一个项目的Pod时,数据库相关pod出现无法启动现象,状态一直是CrashLoopBackOff

Events:
  Type     Reason                  Age               From                     Message
  ----     ------                  ----              ----                     -------
  Normal   Scheduled               6m                default-scheduler        Successfully assigned wogan/mysql-sql-0 to 192.168.10.10
  Normal   SuccessfulAttachVolume  6m                attachdetach-controller  AttachVolume.Attach succeeded for volume "pvc-39c6662-b8a8-11eb-940a-20040ff83e9c"
  Warning  FailedMount             54s (x6 over 5m)  kubelet, 172.17.8.151    MountVolume.WaitForAttach failed for volume "pvc-39c6662-b8a8-11eb-940a-20040ff83e9c" : rbd image rbd/kubernetes-dynamic-pvc-39c6663-b8a8-11eb-ae55-20040ff83e9c is still being used
  Warning  FailedMount             19s (x3 over 4m)  kubelet, 172.17.8.151    Unable to mount volumes for pod "mysql-sql-0_testnew(a7469-41da-11ec-862a-20040ff83e9c)": timeout expired waiting for volumes to attach or mount for pod "testnew"/"mysql-sql-0". list of unmounted volumes=[mysql-data]. list of unattached volumes=[mysql-data mysql-sql timezone localtime default-token-2vcgc]

原因分析:
在kubernetes中使用ceph rbd做为挂载存储,当pod出现异常退出时,有可能会被编排到另外的节点上运行,而rbd不会随着pod的偏移而解除与原先节点的挂载关系,需要手动解除挂载,假设data_pool存储池中的test_image镜像被占用。
首先解除挂载

umount /dev/rbd/data_pool/test_image

解除映射关系

rbd unmap /dev/rbd/data_pool/test_image

通常情况下这样rbd就会解除占用,可以在其他节点上被挂载

但有时候会报设备繁忙的错误,这时就需要在ceph中强制断开映射连接

先查询当前被占用的rbd状态

rbd status data_pool/test_image

得到类似如下信息

Watchers:
    watcher=192.168.1.100:0/4102608192 client.1574653 cookie=3

将该连接加入黑名单

ceph osd blacklist add 192.168.1.100:0/4102608192

再次检查rbd状态

rbd status data_pool/test_image

这时rbd应当处于空闲状态,这时只需要删除异常pod或等待pod自动恢复即可

kubectl delete pod mysql-sql-0 -n testnew
最后修改日期: 2021年11月22日

作者

留言

撰写回覆或留言

发布留言必须填写的电子邮件地址不会公开。