全部產品
Search
文件中心

Container Service for Kubernetes:儲存FAQ-CSI

更新時間:Jun 19, 2024

本文為您介紹儲存常見問題的分析流程,雲端硬碟儲存卷與NAS儲存卷常見問題的處理方法。

類型

問題

常見問題分析流程

常見問題分析流程

雲端硬碟儲存卷常見問題

雲端硬碟建立常見問題

雲端硬碟掛載常見問題

雲端硬碟卸載常見問題

雲端硬碟擴容常見問題

動態擴容雲端硬碟失敗,PVC Event提示Waiting for user to (re-)start a pod to finish file system resize of volume on node

雲端硬碟使用常見問題

應用在讀寫雲端硬碟掛載目錄時提示input/output error

NAS儲存卷常見問題

OSS儲存卷常見問題

OSS掛載問題

OSS使用問題

控制台檢測失敗問題

儲存群組件常見問題

雲原生常見問題

Flexvolume遷移CSI常見問題

Flexvolume遷移CSI常見問題

其他儲存問題

常見問題分析流程

通過以下操作查看對應儲存外掛程式的記錄檔,明確問題現象。

  1. 執行以下命令,查看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"
  2. 執行以下命令,查看叢集是否部署了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
  3. 查看使用的資料卷模板是否和叢集儲存外掛程式(Flexvolume或CSI)的模板匹配。

    若在此叢集中初次使用資料卷,請檢查您的PV對象及StorageClass對象中定義的Driver名稱屬於CSI還是Flexvolume。Driver名稱必須與當前叢集部署的外掛程式類型一致。

  4. 查詢儲存外掛程式是否為最新版本。

    • 執行以下命令,查詢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-plugincsi-provisioner

  5. 查看日誌。

    • 若雲端硬碟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組件升級失敗

問題現象

  1. csi-provisioner組件前置檢查失敗,報錯叢集節點數量不符合要求。

  2. 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大小,具體操作如下。

  1. 登入Container Service管理主控台,在左側導覽列選擇叢集

  2. 叢集列表頁面,單擊目的地組群名稱,然後在左側導覽列,選擇營運管理 > 組件管理

  3. 組件管理頁面,找到並選中csi-provisioner組件,單擊組件右下方的表徵圖表徵圖,然後選擇查看YAML

  4. 根據叢集規模修改組件的YAML檔案,自行調整Limit大小。

    修改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的reclaimPolicyRetain,當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狀態。

Flexvolume遷移CSI常見問題

Container ServiceACK早期的儲存外掛程式為Flexvolume,隨著Kubernetes版本的迭代,Flexvolume已經處於已廢棄的狀態。您的ACK叢集如果是早期的版本(版本小於1.18),建議您將Flexvolume外掛程式遷移為CSI外掛程式。關於遷移的具體操作,請參見Flexvolume遷移至CSI

其他儲存類問題

當您遇到mountOption拼字有誤、PVC引用的StorageClass未建立、未建立掛載點網域名稱等儲存類問題時,建議您優先使用CNFS作為容器儲存卷,可以避免此類問題。關於CNFS更多內容,請參見容器網路檔案系統CNFS概述

容器多個應用是否可以使用同一個儲存卷?

如何更改雲端硬碟預設建立的StorageClass的配置?

預設建立的StorageClass不支援更改。

csi-provisioner組件安裝後,叢集內會預設建立alicloud-disk-topology-alltype等StorageClass,請勿修改這些預設產生的儲存類。關於雲端硬碟StorageClass的更多資訊,請參見儲存類(StorageClass)。如果您需要調整StorageClass的配置,例如儲存卷類型、效能、回收策略等,您可以建立新的StorageClass(StorageClass數量不受限制)。具體操作,請參見建立StorageClass