本文為您介紹存儲常見問題的分析流程,云盤存儲卷與NAS存儲卷常見問題的處理方法。
類型 | 問題 |
常見問題分析流程 | |
云盤存儲卷常見問題 | 云盤創建常見問題 云盤掛載常見問題
云盤卸載常見問題 云盤擴容常見問題 云盤使用常見問題 |
NAS存儲卷常見問題 | |
OSS存儲卷常見問題 | OSS掛載問題 OSS使用問題 控制臺檢測失敗問題 |
存儲組件常見問題 | |
云原生常見問題 | |
Flexvolume遷移CSI常見問題 | |
其他存儲問題 |
常見問題分析流程
通過以下操作查看對應存儲插件的日志文件,明確問題現象。
執行以下命令,查看PVC或Pod上是否有明顯的Event。
kubectl get events
預期輸出:
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"
執行以下命令,查看集群是否部署了Flexvolume或CSI存儲插件。
執行以下命令,查看集群是否部署了Flexvolume存儲插件。
kubectl get pod -n kube-system |grep flexvolume
預期輸出:
NAME READY STATUS RESTARTS AGE flexvolume-*** 4/4 Running 0 23d
執行以下命令,查看集群是否部署了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
查看使用的數據卷模板是否和集群存儲插件(Flexvolume或CSI)的模板匹配。
若在此集群中初次使用數據卷,請檢查您的PV對象及StorageClass對象中定義的Driver名稱屬于CSI還是Flexvolume。Driver名稱必須與當前集群部署的插件類型一致。
查詢存儲插件是否為最新版本。
執行以下命令,查詢Flexvolume插件的鏡像版本。
kubectl get ds flexvolume -n kube-system -oyaml | grep image
預期輸出:
image: registry.cn-hangzhou.aliyuncs.com/acs/Flexvolume:v1.14.8.109-649dc5a-aliyun
關于Flexvolume插件信息,請參見Flexvolume(已棄用)。
執行以下命令,查詢CSI插件的鏡像版本。
kubectl get ds csi-plugin -n kube-system -oyaml |grep image
預期輸出:
image: registry.cn-hangzhou.aliyuncs.com/acs/csi-plugin:v1.18.8.45-1c5d2cd1-aliyun
關于CSI插件信息,請參見csi-plugin及csi-provisioner。
查看日志。
若云盤PVC處于Pending狀態,無法成功創建PV,則需要查看Provisioner日志。
若集群部署了Flexvolume插件,則執行以下命令查詢alicloud-disk-controller日志。
podid=`kubectl get pod -nkube-system | grep alicloud-disk-controller | awk '{print $1}'` kubectl logs <PodID> -n kube-system
若集群部署了CSI插件,則執行以下命令查詢csi-provisioner日志。
podid=`kubectl get pod -n kube-system | grep csi-provisioner | awk '{print $1}'` kubectl logs <PodID> -n kube-system -c csi-provisioner
說明csi-provisioner的容器組數量為2,上述
kubectl get pod -nkube-system | grep csi-provisioner | awk '{print $1}'
命令操作會輸出2個podid
,請分別執行kubectl logs <PodID> -nkube-system -c csi-provisioner
命令。
若Pod啟動時掛載報錯,則需要查看Flexvolume或csi-plugin日志。
若集群部署了Flexvolume插件,則執行以下命令查詢Flexvolume日志。
kubectl get pod <pod-name> -owide
登錄Pod所在節點,在
/var/log/alicloud/flexvolume_**.log
查看Flexvolume日志。若集群部署了CSI插件,則執行以下命令查詢csi-plugin日志。
nodeID=`kubectl get pod <pod-name> -owide | awk 'NR>1 {print $7}'` podID=`kubectl get pods -nkube-system -owide -lapp=csi-plugin | grep $nodeID|awk '{print $1}'` kubectl logs <PodID> -nkube-system
查看Kubelet日志。
執行以下命令,獲取Pod所在節點。
kubectl get pod <pod-name> -owide | awk 'NR>1 {print $7}'
登錄到該節點上查看/var/log/message日志文件。
快速恢復
眾多Pod掛載不上數據卷場景的問題,可以通過將Pod調度到其他節點快速恢復。具體操作,請參見調度應用至指定節點。
csi-plugin組件升級失敗
由于csi-plugin是Daemonset組件,如果當前集群存在NotReady或者其他非Running狀態的節點,就會導致升級失敗。您需要手動處理故障節點,然后重新升級。具體操作,請參見管理CSI組件。
CSI組件啟動失敗
問題現象
csi-provisioner、csi-plugin組件啟動失敗,csi-plugin、csi-provisioner的main container日志報錯403 - Forbidden
。
問題原因
由于節點上metadata server開啟了安全加固,CSI暫不支持安全加固功能,導致無法訪問元信息。
解決方案
請提交工單咨詢ECS團隊,關閉節點的元數據安全加固。
集群節點數量不符合要求導致csi-provisioner組件升級失敗
問題現象
csi-provisioner組件前置檢查失敗,報錯集群節點數量不符合要求。
csi-provisioner前置檢查成功,升級成功。但是查看csi-provisioner Pod crash,發現日志中出現類似下方
403 Forbidden
的日志。time="2023-08-05T13:54:00+08:00" level=info msg="Use node id : <?xml version=\"1.0\" encoding=\"iso-8859-1\"?>\n<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\"\n \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\" xml:lang=\"en\" lang=\"en\">\n <head>\n <title>403 - Forbidden</title>\n </head>\n <body>\n <h1>403 - Forbidden</h1>\n </body>\n</html>\n"
問題原因
現象1原因:
csi-provisioner為了保證高可用,它包含主從Pod,并且主從Pod必須在不同的節點上。如果當前集群只有1個節點,會導致該組件升級失敗。
現象2原因:
csi-provisioner所在節點開啟了安全加固模式,該模式禁止了節點上metadata server的訪問,導致此報錯信息。
解決方案
現象1解決方案:
您需要更新csi-provisioner組件。具體操作,請參見管理CSI組件。
現象2解決方案:
關閉節點上的安全加固模式,CSI必須要訪問到節點的元數據。
StorageClass屬性變更導致csi-provisioner組件升級失敗
問題現象
csi-provisioner組件前置檢查失敗,報錯StorageClass屬性不符合預期。
問題原因
默認StorageClass的屬性被變更過,您刪除重建過同名的StorageClass。StorageClass屬性都是不可變的,否則會導致該組件升級失敗。
解決方案
您需要刪除集群中默認的StorageClass,包括alicloud-disk-essd,alicloud-disk-available,alicloud-disk-efficiency,alicloud-disk-ssd,alicloud-disk-topology,刪除過程不會對現有應用造成任何影響。刪除后,請嘗試重新安裝csi-provisioner組件。安裝后,系統會自動重新創建StorageClass,無需您額外處理。
如果您需要自定義的StorageClass,請創建新的StorageClass名稱使用,請勿修改默認的StorageClass。
StorageClass變更是否會影響現有存儲?
若存儲的PVC、PV的YAML文件不發生改變,StorageClass的變更不會對現有存儲產生影響。例如,修改 StorageClass中的ALLOWVOLUMEEXPANSION
字段時,僅修改PVC的Capacity后才會生效, 如果PVC的YAML文件不變,此字段不會影響現有配置。
csi-provisioner組件日志出現failed to renew lease xxx timed out waiting for the condition報錯
問題現象
通過kubectl logs csi-provisioner-xxxx -nkube-system
命令查看CSI日志,發現failed to renew lease xxx timed out waiting for the condition
報錯。
問題原因
csi-provisioner是高可用多副本組件,多Pod組件之間需通過K8s Lease選主,選主過程中需要訪問APIServer來獲取指定的Lease,獲取到Lease的組件就稱為leader,為集群提供服務。當前報錯由于csi-provisioner訪問集群內的APIServer失敗導致。
解決方案
請排查集群網絡和APIserver狀態是否正常。如無法解決,請提交工單處理。
存儲組件導致的OOM問題
csi-provisioner是中心化的存儲組件,Sidecar主要是緩存Pod、PV、PVC等信息,隨著集群規模增加,會造成內存OOM。當發生OOM時,您需要根據集群規模自行調整Limit大小,具體操作如下。
登錄容器服務管理控制臺,在左側導航欄選擇集群。
在集群列表頁面,單擊目標集群名稱,然后在左側導航欄,選擇 。
在組件管理頁面,找到并選中csi-provisioner組件,單擊組件右下方的圖標,然后選擇查看YAML。
根據集群規模修改組件的YAML文件,自行調整Limit大小。
創建或掛載存儲卷時,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已經處于已廢棄的狀態。如果您的ACK集群是早期的版本(版本小于1.18),建議您將Flexvolume插件遷移為CSI插件。關于遷移的具體操作,請參見Flexvolume遷移至CSI。
csi-plugin的Pod監控上出現大量流量
問題現象
在集群Pod監控上,csi-plugin的Pod出現大量流量。
問題原因
csi-plugin負責當前節點上NAS存儲卷的掛載。由于NAS走的是網絡流量,當節點存在NAS掛載點(即存在使用NAS的Pod)時,Pod發起的NAS請求流量就會經過csi-plugin的Namespace,從而被集群監控記錄。造成csi-plugin出現大量網絡流量。
解決方案
此種情況無需解決。因為流量只是被記錄,并不會翻倍,也不會額外占用網絡帶寬,所以可以忽略。
Pod的Event提示0/x nodes are available: x pod has unbound immediate PersistentVolumeClaims
問題現象
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,您需要檢查當前Pod引用的StorageClass是否存在,若不存在,需重新創建StorageClass。
PV為Released狀態,無法通過重建PVC綁定
問題現象
PVC誤刪除后,PV為Released狀態無法通過重建PVC綁定。
問題原因
如果PVC的reclaimPolicy是Retain,當PVC被誤刪除時,PV會變為Released狀態。
解決方案
您需要刪除當前PV中的pv.spec.claimRef
字段,然后重新使用靜態卷方式進行綁定。即可將PV變為Bound狀態。
關于如何綁定NAS靜態卷的具體操作,請參見使用NAS靜態存儲卷。
關于如何綁定OSS靜態卷的具體操作,請參見使用OSS靜態存儲卷。
關于如何綁定云盤靜態卷的具體操作,請參見使用云盤靜態存儲卷。
PV為Lost狀態,無法通過重建PVC綁定
問題現象
PVC和PV創建后,PV處于Lost狀態,且無法與PVC綁定。
問題原因
PV中claimRef
引用的PVC名稱不存在,導致PV狀態為Lost。
解決方案
您需要刪除當前PV中的pv.spec.claimRef
字段,然后重新使用靜態卷方式進行綁定。即可將PV變為Bound狀態。
關于如何綁定NAS靜態卷的具體操作,請參見使用NAS靜態存儲卷。
關于如何綁定OSS靜態卷的具體操作,請參見使用OSS靜態存儲卷。
關于如何綁定云盤靜態卷的具體操作,請參見使用云盤靜態存儲卷。
Flexvolume遷移CSI常見問題
容器服務ACK早期的存儲插件為Flexvolume,隨著Kubernetes版本的迭代,Flexvolume已經處于已廢棄的狀態。您的ACK集群如果是早期的版本(版本小于1.18),建議您將Flexvolume插件遷移為CSI插件。關于遷移的具體操作,請參見Flexvolume遷移至CSI。
其他存儲類問題
當您遇到mountOption拼寫有誤、PVC引用的StorageClass未創建、未創建掛載點域名等存儲類問題時,建議您優先使用CNFS作為容器存儲卷,可以避免此類問題。關于CNFS更多內容,請參見容器網絡文件系統CNFS概述。
容器多個應用是否可以使用同一個存儲卷?
云盤:不支持
云盤為阿里云存儲團隊提供的非共享存儲,只能同時被一個Pod掛載,不支持多個應用使用。
NAS、OSS:支持
NAS、OSS為共享存儲,可以同時為多個Pod提供共享存儲服務,即一個PVC可以同時被多個應用使用。關于NAS并發寫入的一些限制條件,請參見如何避免多進程或多客戶端并發寫同一日志文件可能出現的異常?和如何解決向NFS文件系統中寫入數據延遲問題?
關于如何掛載NAS存儲卷,請參見創建CNFS管理NAS文件系統(推薦)、使用NAS靜態存儲卷、使用NAS動態存儲卷。
關于如何掛載OSS存儲卷,請參見使用OSS靜態存儲卷;通過CNFS實現OSS動態存儲卷掛載的具體操作,請參見對OSS生命周期管理。
如何更改云盤默認創建的StorageClass的配置?
默認創建的StorageClass不支持更改。
csi-provisioner組件安裝后,集群內會默認創建alicloud-disk-topology-alltype等StorageClass,請勿修改這些默認生成的存儲類。關于云盤StorageClass的更多信息,請參見存儲類(StorageClass)。如果您需要調整StorageClass的配置,例如存儲卷類型、性能、回收策略等,您可以創建新的StorageClass(StorageClass數量不受限制)。具體操作,請參見創建StorageClass。