有的時候,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
這樣的報錯信息,可以參考下面這篇文章的思路進行排查: