本文介紹關于存儲相關異常問題診斷流程和排查思路。
診斷流程
執行以下命令,查看Pod事件,確認Pod無法啟動是由存儲問題導致。
kubectl describe pods <pod-name>
若查看Pod處于下圖所示的狀態,說明Pod使用的存儲都已成功掛載到Pod上。此時Pod沒啟動(比如:CrashLoopBackOff)不屬于存儲問題,請提交工單處理。
執行以下命令,查看CSI存儲插件是否正常工作。
kubectl get pod -n kube-system |grep csi
預期輸出:
NAME READY STATUS RESTARTS AGE csi-plugin-*** 4/4 Running 0 23d csi-provisioner-*** 7/7 Running 0 14d
說明如果出現非Running狀態的Pod,使用
kubectl describe pods <pod-name> -n kube-system
查看具體Container退出的原因及Pod的Event。執行以下命令,查詢CSI存儲插件是否為最新版本。
kubectl get ds csi-plugin -n kube-system -oyaml |grep image
預期輸出:
image: registry.cn-****.aliyuncs.com/acs/csi-plugin:v*****-aliyun
存儲插件最新版本信息,請參見csi-plugin和csi-provisioner,若您集群中存儲插件不是最新版本,請升級CSI插件。具體操作,請參見管理組件。其他存儲組件升級失敗問題排查,請參見組件升級失敗問題排查。
排查Pod Pending問題。
云盤的Pod Pending問題處理,請參見下文云盤Pod的狀態為非Running。
NAS的Pod Pending問題處理,請參見下文NAS Pod的狀態為非Running。
OSS的Pod Pending問題處理,請參見下文OSS Pod的狀態為非Running。
排查PVC處于非Bound問題。
云盤的PVC非Bound問題處理,請參見下文云盤PVC的狀態為非Bound。
NAS的PVC非Bound問題處理,請參見下文NAS PVC的狀態為非Bound。
OSS的PVC非Bound問題處理,請參見下文OSS PVC的狀態為非Bound。
如果排查后問題仍未解決,請提交工單處理。
組件升級失敗問題排查
若組件升級失敗,請參考以下操作,進行csi-provisioner和csi-plugin組件升級失敗問題排查。
csi-provisioner
該組件默認是2個副本的Deployment,這兩個副本互斥,無法部署在同一個節點上。出現升級失敗,需要先確認集群中是否只存在一個可用節點。
該組件的歷史版本(1.14及之前版本)是StatefulSet,如果集群中存在StatefulSet類型的csi-provisioner,您可以通過執行
kubectl delete sts csi-provisioner
先刪除sts csi-provisioner,然后登錄容器服務管理控制臺重新安裝csi-provisioner組件,具體操作,請參見管理組件。
csi-plugin
檢查集群是否存在
NotReady
的節點,如果存在NotReady
的節點, csi-plugin對應的DaemonSet會升級失敗。若發現組件升級失敗,但所有的Plugin均正常,這是因為組件中心一旦檢查組件升級超時,就會自動回滾。遇到此問題,請提交工單處理。
云盤異常問題排查
節點掛載云盤時,節點與云盤必須是同一地域和同一可用區的,不支持跨地域和跨可用區使用。
不同規格的ECS支持掛載的云盤類型也不相同。更多信息,請參見實例規格族。
Pod的狀態為非Running
問題現象:
PVC為Bound狀態,Pod為非Running狀態。
問題原因:
沒有滿足條件的節點可以調度。
云盤掛載出現問題。
ECS節點和云盤類型不匹配。
解決方案:
通過將Pod調度到其他節點快速恢復。具體操作,請參見調度應用Pod至指定節點。
通過命令
kubectl describe pods <pod-name>
查看Pod的Event。由于ECS節點和云盤類型不匹配導致的,請選擇合適類型的云盤。更多信息,請參見實例規格族。
其他ECS OpenAPI類型問題的處理方法,請參見ErrorCode。
PVC的狀態為非Bound
問題現象:
PVC為非Bound狀態,Pod為非Running狀態。
問題原因:
靜態方式:由于PVC和PV之間的Selector無法滿足互相綁定的條件導致。例如:PVC中Selector配置與PV中的不一致,StorageClass Name不一致、PV狀態是Release等問題。
動態方式:由于csi-provisioner組件的某種原因未能創建出對應的云盤。
解決方案:
靜態方式:請檢查相關的YAML書寫是否正確。更多信息,請參見通過kubectl命令行的方式使用云盤靜態存儲卷。
說明若PV的狀態是Release,則該PV無法被復用,需要將云盤ID取出重新創建PV。
動態方式:通過命令
kubectl describe pvc <pvc-name> -n <namespace>
查看PVC的Event。
NAS異常問題排查
節點掛載NAS時,節點與NAS必須在同一個VPC網絡下。若不在同一VPC,請使用云企業網打通。
NAS支持跨可用區掛載。
極速型NAS以及CPFS2.0掛載目錄需要以/share開頭。
Pod的狀態為非Running
問題現象:
PVC為Bound狀態,Pod為非Running狀態。
問題原因:
掛載NAS時使用了
fsGroups
,文件較多,導致chmod速度較慢。安全組中限制了2049端口,導致NAS無法掛載。
NAS和節點不在同一個VPC下。
解決方案:
確認是否有
fsGroups
設置,如有,將其去掉后重啟Pod,嘗試重新掛載。確認Pod調度的節點是否限制了2049端口,如果該端口被限制,將2049端口放開后,重新掛載。具體操作,請參見添加安全組規則。
確認NAS和節點在同一VPC下,若不在同一VPC,請使用云企業網打通。
其他問題,通過命令
kubectl describe pods <pod-name>
查看Pod的Event。
PVC的狀態為非Bound
問題現象:
PVC為Bound狀態,Pod為非Running狀態。
問題原因:
靜態方式:由于PVC和PV之間的Selector無法滿足互相綁定的條件導致。例如:PVC中Selector配置與PV中的不一致,StorageClass Name不一致、PV狀態是Release等問題。
動態方式:由于csi-provisioner組件的某種原因未能掛載NAS。
解決方案:
靜態方式:請檢查相關的YAML書寫是否正確。更多信息,請參見通過kubectl命令行方式使用NAS靜態存儲卷。
說明若PV的狀態是Release,則該PV無法被復用,需要將PV中的Service取出,重新創建PV。
動態方式:通過命令
kubectl describe pvc <pvc-name> -n <namespace>
查看PVC的Event。
OSS異常問題排查
節點掛載OSS時,PV中需要填寫相應的AK/SK信息,可通過Secret方式使用AK/SK。
跨地域使用OSS,需要將Bucket URL改成公網地址,同一地域建議使用內網地址。
Pod的狀態為非Running
問題現象:
PVC為Bound狀態,Pod狀態為非Running。
問題原因:
掛載NAS時使用了
fsGroups
,文件較多,導致chmod速度較慢。跨地域使用了內網地址,導致無法連接到Bucket Endpoint。
解決方案:
確認是否有
fsGroups
設置,如果有,將其去掉后,重啟Pod,嘗試重新掛載。確認是否為跨地域且通過內網訪問Bucket,如果是,請使用公網地址訪問Bucket。
其他問題,通過命令
kubectl describe pods <pod-name>
查看Pod的Event。
PVC的狀態為非Bound
問題現象:
PVC為非Bound狀態,Pod為非Running狀態。
靜態方式:由于PVC和PV之間的Selector無法滿足互相綁定的條件導致。例如:PVC中Selector配置與PV中的不一致,StorageClass Name不一致、PV狀態是Release等問題。
動態方式:由于csi-provisioner組件的某種原因未能掛載OSS。
解決方案:
靜態方式:請檢查相關的YAML書寫是否正確。更多信息,請參見通過kubectl命令行的方式使用OSS靜態存儲卷。
說明若PV的狀態是Release,則該PV無法被復用,需要將PV中的Bucket地址取出重新創建PV。
動態方式:通過命令
kubectl describe pvc <pvc-name> -n <namespace>
查看PVC的Event。