掛載和使用儲存卷時,如果遇到Pod狀態異常現象,可依次排查Pod和PVC的狀態和事件,以及CSI儲存群組件情況來確認異常原因,進而解決問題。本文介紹儲存相關異常問題的排查流程,以及常見的儲存問題。

1.檢查Pod異常是否由儲存問題導致
通過Pod或PVC事件,確認Pod無法啟動是由儲存問題導致。
查看異常Pod的事件。
kubectl describe pod <pod-name>若Events中存在相關事件表明是儲存問題(例如樣本的
FailedScheduling的Message中表明是由於Volume與節點不匹配導致調度失敗),請參考下文繼續排查。Events: Type Reason Age From Message ---- ------ ---- ---- ------- Warning FailedScheduling 4m37s default-scheduler 0/1 nodes are available: 1 node(s) had volume node affinity conflict. preemption: 0/1 nodes are available: 1 Preemption is not helpful for scheduling.,若Events中存在相關事件表明Volume已成功掛載(例如樣本的
SuccessfulAttachVolume),此時Pod未啟動(例如CrashLoopBackOff)不屬於儲存問題,請根據Events排查其他問題,或者提交工單處理。Events: Type Reason Age From Message ---- ------ ---- ---- ------- Normal Scheduled 97s default-scheduler Successfully assigned default/disk-test-0 to cn-shanghai.192.168.5.2 Normal SuccessfulAttachVolume 97s attachdetach-controller AttachVolume.Attach succeeded for volume "d-uf6b8s2l5ypf48*****"
若Pod事件中未看到儲存相關事件,可查看所有事件。
kubectl get events若Events中存在相關事件表明是儲存問題(例如樣本的
FailedBinding表明PVC綁定PV失敗),請參考下文繼續排查。LAST SEEN TYPE REASON OBJECT MESSAGE 2m56s Normal FailedBinding persistentvolumeclaim/data-my-release-mariadb-0 no persistent volumes available for this claim and no storage class is set 41s Normal ExternalProvisioning persistentvolumeclaim/pvc-nas-dynamic-create-subpath8 waiting for a volume to be created, either by external provisioner "nasplugin.csi.alibabacloud.com" or manually created by system administrator 3m31s Normal Provisioning persistentvolumeclaim/pvc-nas-dynamic-create-subpath8 External provisioner is provisioning volume for claim "default/pvc-nas-dynamic-create-subpath8"若Events中沒有儲存相關事件,請根據Events排查其他問題,或者提交工單處理。
2.檢查儲存群組件是否正常
如果您的叢集目前使用Flexvolume組件,由於Flexvolume已廢棄,請儘快遷移到CSI組件。具體操作,請參見遷移Flexvolume至CSI。
檢查CSI儲存群組件是否正常工作。
kubectl get pod -n kube-system |grep csi返回樣本如下。如果Pod狀態非Running,可執行
kubectl describe pods <pod-name> -n kube-system查看具體Container退出的原因及Pod的Event。說明CSI儲存群組件包括csi-plugin和csi-provisioner,其中csi-provisioner預設安裝託管版。託管版組件由阿里雲負責營運,您在叢集中無法看到相關Pod。
NAME READY STATUS RESTARTS AGE csi-plugin-bpz28 4/4 Running 0 3d csi-plugin-h2tdg 4/4 Running 0 3d csi-plugin-qpnm4 4/4 Running 0 3d csi-plugin-wczgm 4/4 Running 0 3d檢查CSI儲存群組件是否為最新版本。
kubectl get ds csi-plugin -n kube-system -o yaml |grep image在返回資訊的
image中可以確認鏡像版本,樣本如下:image: registry-cn-shanghai-vpc.ack.aliyuncs.com/acs/csi-plugin:v1.33.1-67e8986-aliyun若儲存群組件不是最新版本,請升級csi-plugin和csi-provisioner。儲存群組件最新版本資訊,請參見csi-plugin。
說明您也可以在控制台的組件管理頁面,找到csi-plugin和csi-provisioner組件,確認版本資訊並升級組件。
檢查PV、PVC和StorageClass的YAML,確認驅動配置(
driver或provisioner欄位)為使用CSI儲存群組件,與當前叢集使用的儲存群組件一致。
3.檢查PVC是否為Bound狀態
查看PVC狀態。
kubectl get pvc如果PVC為非Bound狀態,參考以下方式進行排查和處理。
問題原因
靜態:由於PVC和PV之間的Selector無法滿足互相綁定的條件導致。例如:PVC中Selector配置與PV中的不一致,StorageClass Name不一致、PV狀態是Released等問題。
動態:由於csi-provisioner組件的某種原因導致。
解決方案
4.檢查Pod是否為Running狀態
查看Pod狀態。
kubectl get pod如果PVC為Bound狀態,Pod為非Running狀態,請根據儲存卷類型,參考以下方式進行排查和處理。
雲端硬碟儲存卷
重要使用雲端硬碟儲存卷時,需確保待掛載雲端硬碟的Pod所調度到的ECS節點的規格支援掛載該類型雲端硬碟,並且Pod和雲端硬碟處於同一地區可用性區域。關於雲端硬碟類型和ECS執行個體規格的匹配關係,請參見執行個體規格類型系列。
問題原因
沒有滿足條件的節點可以調度。
雲端硬碟掛載出現問題。
ECS節點和雲端硬碟類型不符。
解決方案
通過將Pod調度到其他節點快速恢複。具體操作,請參見調度應用至指定節點。
通過
kubectl describe pods <pod-name>查看Pod的Event。根據Event提示資訊進行處理。處理方法請參見雲端硬碟儲存卷FAQ。
若沒有相關Event資訊,請提交工單處理。
由於ECS節點和雲端硬碟類型不符導致的,請選擇合適類型的雲端硬碟。更多資訊,請參見執行個體規格類型系列。
其他ECS OpenAPI類型問題的處理方法,請參見ErrorCode。
NAS儲存卷
重要節點與NAS必須在同一個VPC下。若不在同一VPC,請使用雲企業網打通。
NAS支援跨可用性區域掛載。
極速型NAS的掛載目錄需要以
/share開頭。
問題原因
掛載NAS時使用了
fsGroups,檔案較多,導致chmod速度較慢。安全性群組中限制了2049連接埠,導致NAS無法掛載。
NAS和節點不在同一個VPC下。
解決方案
OSS儲存卷
重要節點掛載OSS時,PV中需填寫AccessKey資訊,可通過Secret方式使用 。
跨地區使用OSS時,需將Bucket URL改成公網地址,同一地區建議使用內網地址。
問題原因
掛載OSS時使用了
fsGroups,檔案較多,導致chmod速度較慢。跨地區使用了內網地址,導致無法串連到Bucket Endpoint。
解決方案
檢查是否設定
fsGroups,如有,去掉後重啟Pod並重新掛載。檢查是否跨地區且使用內網訪問Bucket,如是,請改用公網地址。
其他問題,通過
kubectl describe pods <pod-name>查看Pod的Event。根據Event提示資訊進行處理。處理方法請參見ossfs 1.0儲存卷FAQ或ossfs 2.0儲存卷FAQ。
若沒有相關Event資訊,請提交工單處理。
常見問題
建立或掛載儲存卷時,PVC提示no volume plugin matched
問題現象
建立或掛載儲存卷時,PVC提示Unable to attach or mount volumes: unmounted volumes=[xxx], unattached volumes=[xxx]: failed to get Plugin from volumeSpec for volume "xxx" err=no volume plugin matched。
問題原因
儲存群組件與YAML模板不匹配,建立或掛載儲存卷時,無法找到相應的儲存群組件。
解決方案
檢查叢集中儲存群組件是否存在。
未安裝儲存群組件,請在叢集中安裝儲存群組件。具體操作,請參見管理組件。
已安裝儲存群組件,請確定儲存群組件與PV和PVC的YAML模板是否匹配,且滿足如下條件。
CSI儲存群組件使用CSI相關文檔進行部署。更多資訊,請參見儲存CSI。
Flexvolume儲存群組件使用Flexvolume相關文檔進行部署。更多資訊,請參見儲存Flexvolume。
重要由於Flexvolume已廢棄,建議儘快遷移到CSI組件。具體操作,請參見遷移Flexvolume至CSI。
Pod的Event提示0/x nodes are available: x pod has unbound immediate PersistentVolumeClaims
問題現象
Pod啟動失敗,Pod Event提示如下:
0/x nodes are available: x pod has unbound immediate PersistentVolumeClaims. preemption: 0/x nodes are available: x Preemption is not helpful for scheduling問題原因
由於自訂StorageClass未建立,導致Pod引用的自訂StorageClass未找到。
解決方案
需要檢查當前Pod引用的StorageClass是否存在,若不存在,需重新建立StorageClass。
PV為Released狀態,無法通過重建PVC綁定
問題現象
PVC誤刪除後,PV為Released狀態,無法通過重建PVC綁定。
問題原因
如果PVC的reclaimPolicy是Retain,當PVC被誤刪除時,PV會變為Released狀態。
解決方案
您需要刪除當前PV中的pv.spec.claimRef欄位,然後重新使用靜態卷方式進行綁定。即可將PV變為Bound狀態。
PV為Lost狀態,無法通過重建PVC綁定
問題現象
PVC和PV建立後,PV處於Lost狀態,且無法與PVC綁定。
問題原因
PV中claimRef引用的PVC名稱不存在,導致PV狀態為Lost。
解決方案
您需要刪除當前PV中的pv.spec.claimRef欄位,然後重新使用靜態卷方式進行綁定。即可將PV變為Bound狀態。
StorageClass變更是否會影響現有儲存
若PVC、PV的YAML檔案不發生改變,StorageClass的變更不會對現有儲存產生影響。例如,修改StorageClass的ALLOWVOLUMEEXPANSION欄位時,僅在修改PVC的Capacity後才會生效, 如果PVC的YAML檔案不變,此欄位不會影響現有配置。