數據卷掛載問題快速恢復

Pod掛載、卸載數據卷出現問題的原因很多,有存儲卷設計的缺陷、有相關組件實現的bug、有使用方式不當的可能,面對複雜的應用、存儲交互系統,我們需要從兩個方面對待數據卷問題:

儘量別出問題:減少存儲組件的自身穩定性 && 規範的使用方式。

如何面對問題:首要是快速恢復業務,然後分析問題。

本文闡述的是業務快速恢復方案:當Pod因爲數據卷掛載重啓失敗時,暫不去解決節點掛載的問題,而是讓pod先在其他節點啓動成功,快速恢復業務,待業務恢復後再去分析出問題的節點。

更新一個Pod,卡在了 ContainerCreating 狀態:

例如:你在Deployment類型應用中掛載NAS數據卷,Pod在啓動的時候報錯爲掛載失敗:

Warning  FailedMount  18s   kubelet, cn-shenzhen.192.168.1.24  Unable to mount volumes for pod "nas-static-796b49b5f8-svbvh_default(2d483078-1400-11ea-a9b7-00163e084110)": 
timeout expired waiting for volumes to attach or mount for pod "default"/"nas-static-796b49b5f8-svbvh". 
list of unmounted volumes=[pvc-nas]. list of unattached volumes=[pvc-nas default-token-9v9hl]

更新前數據卷使用是正常的,而更新後pod啓動不了,並有上述信息顯示數據卷掛載不上,有一個可能性爲:當前pod所在節點對此pv/pvc出現狀態異常。具體異常原因暫不深究。

通過把pod調度到其他節點快速啓動pod,參考如下步驟:

1. 確定pod所在節點:

根據上述錯誤信息即可拿到節點爲:cn-shenzhen.192.168.1.24

也可以通過下面步驟拿到:
# podname="nas-static-796b49b5f8-svbvh"
# namespace="default"
#  kubectl describe pod $podname -n $namespace | grep Node: | awk '{print $2}'
cn-shenzhen.192.168.1.24/192.168.1.24

2. 設置節點不可調度:

您可以使用控制檯來配置節點調度狀態,參考

也可以使用下面命令行執行給當前掛載有問題的節點打上污點標籤,確保pod不會再往這個節點調度:

# kubectl taint nodes cn-shenzhen.192.168.1.24 key=value:NoSchedule
node/cn-shenzhen.192.168.1.24 tainted

3. 重啓問題Pod:

這時重啓問題Pod,新建的Pod就不會調度到剛纔有問題的節點了:

刪除問題Pod:
# kubectl delete pod nas-static-796b49b5f8-svbvh
pod "nas-static-796b49b5f8-svbvh" deleted

新的pod啓動成功,且調度到新節點:
# kubectl get pod
NAME                          READY   STATUS        RESTARTS   AGE
nas-static-857b99fcc9-vvzkx   1/1     Running       0          14s
# kubectl describe pod nas-static-857b99fcc9-vvzkx | grep Node
Node:               cn-shenzhen.192.168.1.25/192.168.1.25

4. 後續處理:

上述步驟目的是保證您您的業務快速恢復,但問題節點的問題還存在,您可以通過[存儲常見問題]()進行排查分析。

如果您無法解決節點問題,可以聯繫阿里雲容器服務技術支持。節點問題解決後,您可以通過控制檯或者命令行將問題節點配置爲可調度狀態;

# kubectl taint nodes cn-shenzhen.192.168.1.24 key:NoSchedule-
node/cn-shenzhen.192.168.1.24 untainted

更新一個pod,卡在 Terminating 狀態:

例如:你使用statefulset創建應用,並掛載了雲盤數據卷;當更新應用的時候,pod一直處於Terminating狀態從而導致新的pod無法正常啓動。

# kubectl delete pod web-0

# kubectl get pod
NAME    READY   STATUS        RESTARTS   AGE
web-0   0/1     Terminating   0          47m

到pod所在節點查看下面日誌文件:

# tailf /var/log/alicloud/flexvolume_disk.log
# tailf /var/log/messages | grep kubelet

如果發現報錯原因爲數據卷Umount/Detach等失敗,例如:

unmount command failed, status: Failure, reason:

device is busy 字樣
或
target is busy 字樣
或
Orphan Pod字樣
等等

如果在沒有找到如何解決問題時急於恢復業務,可以先將問題pod強制刪除,優先恢復業務。

1. 使用強制刪除命令結束當前pod:

# kubectl delete pod web-0 --force=true --grace-period=0
pod "web-0" force deleted

此命令會強制刪除Etcd數據庫中的pod信息,從而爲創建新pod提供可能(StatefulSet中,老pod沒有刪除前新pod不會重建)。

2. 如果新建pod啓動的時候失敗,卡在 ContainerCreating:

可以參考 “更新一個Pod,卡在了 ContainerCreating 狀態” 做法,爲node配置不可調度,快速恢復pod運行。

3. 登陸問題節點,分析原因:

登陸問題所在節點,通過[存儲常見問題]()進行排查分析。無法解決時可能聯繫阿里雲容器服務技術支持。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章