儲存空間疑難排解

本文提供儲存空間問題的疑難排解指南。

磁碟區無法附加

如果虛擬磁碟連接至錯誤的虛擬機器,就可能發生這個問題,這可能是 Kubernetes 1.12 中的問題 #32727 所致。

gkectl diagnose cluster 的輸出內容如下列範例所示:

Checking cluster object...PASS
Checking machine objects...PASS
Checking control plane pods...PASS
Checking gke-connect pods...PASS
Checking kube-system pods...PASS
Checking gke-system pods...PASS
Checking storage...FAIL
    PersistentVolume pvc-776459c3-d350-11e9-9db8-e297f465bc84: virtual disk "[datastore_nfs] kubevols/kubernetes-dynamic-pvc-776459c3-d350-11e9-9db8-e297f465bc84.vmdk" IS attached to machine "gsl-test-user-9b46dbf9b-9wdj7" but IS NOT listed in the Node.Status
1 storage errors

在本例中,一或多個 Pod 停滯在 ContainerCreating 狀態,並顯示類似下列範例輸出的警告:

Events:
  Type     Reason              Age               From                     Message
  ----     ------              ----              ----                     -------
  Warning  FailedAttachVolume  6s (x6 over 31s)  attachdetach-controller  AttachVolume.Attach failed for volume "pvc-776459c3-d350-11e9-9db8-e297f465bc84" : Failed to add disk 'scsi0:6'.

如果虛擬磁碟連接到錯誤的虛擬機器,可以按照下列步驟手動卸離:

  1. 排空節點。 您可以在 kubectl drain 指令中加入 --ignore-daemonsets--delete-local-data 旗標 (選用)。

  2. 關閉 VM 電源

  3. 在 vCenter 中編輯 VM 的硬體設定,移除磁碟區。

  4. 啟動 VM

  5. 取消限制節點

音量遺失

如果虛擬磁碟遭到永久刪除,就可能會發生這個問題。如果操作人員手動刪除虛擬磁碟,或刪除磁碟所連結的 VM,就可能發生這種情況。

如果看到與 VMDK 檔案相關的「找不到」錯誤,可能是虛擬磁碟已遭永久刪除。

gkectl diagnose cluster 的輸出內容如下所示:

Checking cluster object...PASS
Checking machine objects...PASS
Checking control plane pods...PASS
Checking gke-connect pods...PASS
Checking kube-system pods...PASS
Checking gke-system pods...PASS
Checking storage...FAIL
    PersistentVolume pvc-52161704-d350-11e9-9db8-e297f465bc84: virtual disk "[datastore_nfs] kubevols/kubernetes-dynamic-pvc-52161704-d350-11e9-9db8-e297f465bc84.vmdk" IS NOT found
1 storage errors

一或多個 Pod 停滯在 ContainerCreating 狀態,如下列輸出範例所示:

Events:
  Type     Reason              Age                   From                                    Message
  ----     ------              ----                  ----                                    -------
  Warning  FailedAttachVolume  71s (x28 over 42m)    attachdetach-controller                 AttachVolume.Attach failed for volume "pvc-52161704-d350-11e9-9db8-e297f465bc84" : File []/vmfs/volumes/43416d29-03095e58/kubevols/
  kubernetes-dynamic-pvc-52161704-d350-11e9-9db8-e297f465bc84.vmdk was not found

如要避免發生這個問題,請按照「調整使用者叢集大小」和「升級叢集」一文所述,管理虛擬機器。

如要解決這個問題,您可以手動清除相關的 Kubernetes 資源:

  1. 執行 kubectl delete pvc [PVC_NAME],刪除參照 PV 的 PVC。

  2. 執行 kubectl delete pod [POD_NAME],刪除參照 PVC 的 Pod。

  3. 由於 Kubernetes 問題 #74374,請重複步驟 2。

vSphere CSI 磁碟區無法卸離

如果 vSphere 使用者未取得 CNS > Searchable 權限,就會發生這個問題。

如果發現 Pod 卡在 ContainerCreating 階段,並顯示 FailedAttachVolume 警告,可能是因為其他節點上的卸離作業失敗。

如要檢查 CSI 分離錯誤,請執行下列指令:

kubectl get volumeattachments -o=custom-columns=NAME:metadata.name,DETACH_ERROR:status.detachError.message

輸出結果會與下列範例相似:

NAME                                                                   DETACH_ERROR
csi-0e80d9be14dc09a49e1997cc17fc69dd8ce58254bd48d0d8e26a554d930a91e5   rpc error: code = Internal desc = QueryVolume failed for volumeID: "57549b5d-0ad3-48a9-aeca-42e64a773469". ServerFaultCode: NoPermission
csi-164d56e3286e954befdf0f5a82d59031dbfd50709c927a0e6ccf21d1fa60192d   <none>
csi-8d9c3d0439f413fa9e176c63f5cc92bd67a33a1b76919d42c20347d52c57435c   <none>
csi-e40d65005bc64c45735e91d7f7e54b2481a2bd41f5df7cc219a2c03608e8e7a8   <none>

如要解決這個問題,請將 CNS > Searchable 權限新增至 vCenter 使用者帳戶。卸離作業會自動重試,直到成功為止。

ESXi 主機不支援 vSphere CSI 驅動程式

如果 vSphere 叢集中的 ESXi 主機執行低於 ESXi 6.7U3 的版本,就會發生這個問題。

gkectl check-config 的輸出內容包含下列警告:

The vSphere CSI driver is not supported on current ESXi host versions.
CSI requires ESXi 6.7U3 or above. See logs for ESXi version details.

如要解決這個問題,請將 ESXi 主機升級至 6.7U3 以上版本。

CSI 磁碟區建立作業失敗,並顯示 NotSupported 錯誤

如果 vSphere 叢集中的 ESXi 主機執行低於 ESXi 6.7U3 的版本,就會發生這個問題。

kubectl describe pvc 的輸出內容包含下列錯誤:

Failed to provision volume with StorageClass <standard-rwo>: rpc error:
code = Internal desc = Failed to create volume. Error: CnsFault error:
CNS: Failed to create disk.:Fault cause: vmodl.fault.NotSupported

如要解決這個問題,請將 ESXi 主機升級至 6.7U3 以上版本。

vSphere CSI 磁碟區無法附加

當節點關閉、刪除或發生故障時,開放原始碼 vSphere CSI 驅動程式會發生這個 Kubernetes 已知問題

kubectl describe pod 的輸出內容如下所示:

Events:
 Type    Reason                 From                     Message
 ----    ------             ... ----                     -------
 Warning FailedAttachVolume ... attachdetach-controller  Multi-Attach error for volume
                                                         "pvc-xxxxx"
                                                         Volume is already exclusively attached to one
                                                         node and can't be attached to another

如要解決這個問題,請完成下列步驟:

  1. 記下上述輸出內容中的 PersistentVolumeClaim (PVC) 名稱,然後找出與 PVC 相關聯的 VolumeAttachments:

    kubectl get volumeattachments | grep pvc-xxxxx
    

    以下輸出範例顯示 VolumeAttachment 的名稱:

    csi-yyyyy   csi.vsphere.vmware.com   pvc-xxxxx   node-zzzzz ...
    
  2. 說明 VolumeAttachments:

    kubectl describe volumeattachments csi-yyyyy | grep "Deletion Timestamp"
    

    請記下刪除時間戳記,如下列範例輸出內容所示:

    Deletion Timestamp:   2021-03-10T22:14:58Z
    
  3. 等待刪除時間戳記指定的時間,然後強制刪除 VolumeAttachment。如要這麼做,請編輯 VolumeAttachment 物件,並刪除終結器。

    kubectl edit volumeattachment csi-yyyyy
    

    刪除終結器:

    [...]
      Finalizers:
       external-attacher/csi-vsphere-vmware-com
    

由於版本問題,vSphere CSI VolumeSnapshot 尚未就緒

如果 vCenter Server 或 ESXi 主機版本低於 7.0 Update 3,就會發生這個問題。

kubectl describe volumesnapshot 的輸出內容會包含類似以下範例的錯誤:

rpc error: code = Unimplemented desc = VC version does not support snapshot operations.

如要解決這個問題,請將 vCenter Server 和 ESXi 主機升級至 7.0 Update 3 以上版本。

vSphere CSI VolumeSnapshot 尚未就緒,每個磁碟區的快照數量已達上限

當每個磁碟區的快照數量達到 vSphere 容器儲存空間驅動程式的最大值時,就會發生這個問題。預設值為 3。

kubectl describe volumesnapshot 的輸出內容會包含類似以下範例的錯誤:

rpc error: code = FailedPrecondition desc = the number of snapshots on the source volume 5394aac1-bc0a-44e2-a519-1a46b187af7b reaches the configured maximum (3)

如要解決這個問題,請按照下列步驟更新每個磁碟區的快照數量上限:

  1. 取得提供 vSphere 設定給 vSphere CSI 控制器的 Secret 名稱:

    kubectl --kubeconfig <var class="edit">ADMIN_CLUSTER_KUBECONFIG</var> get deployment vsphere-csi-controller \
        --namespace <var class="edit">USER_CLUSTER_NAME</var> \
        --output json \
        | jq -r '.spec.template.spec.volumes[] \
        | select(.name=="vsphere-secret") .secret.secretName'
    

    更改下列內容:

    • ADMIN_KUBECONFIG:管理員叢集 kubeconfig 檔案的路徑
    • USER_CLUSTER_NAME:使用者叢集名稱
  2. 從 Secret 取得 data.config 的值,以 base64 解碼,然後儲存在名為 config.txt 的檔案中:

    kubectl --kubeconfig <var class="edit">ADMIN_CLUSTER_KUBECONFIG</var> get secret <var class="edit">SECRET_NAME</var> \
        --namespace <var class="edit">USER_CLUSTER_NAME </var> \
        --output json | jq -r '.data["config"]' | base64 -d > config.txt
    

    SECRET_NAME 替換為上一步的 Secret 名稱。

  3. 開啟 config.txt 進行編輯:

    [Snapshot] 區段中編輯或新增 global-max-snapshots-per-block-volume 欄位,如下列範例所示:

    [Global]
    cluster-id = "my-user-cluster"
    insecure-flag = "0"
    user = "my-account.local"
    password = "fxqSD@SZTUIsG"
    [VirtualCenter "my-vCenter"]
    port = "443"
    datacenters = "my-datacenter1"
    [Snapshot]
    global-max-snapshots-per-block-volume = 4
    
  4. 刪除並重新建立密鑰:

    kubectl --kubeconfig <var class="edit">ADMIN_CLUSTER_KUBECONFIG</var> delete secret <var class="edit">SECRET_NAME</var> \
        --namespace <var class="edit">USER_CLUSTER_NAME</var>
    
    kubectl --kubeconfig <var class="edit">ADMIN_CLUSTER_KUBECONFIG</var> create secret generic <var class="edit">SECRET_NAME</var> \
        --namespace <var class="edit">USER_CLUSTER_NAME</var> \
        --from-file=config
    
  5. 重新啟動 vsphere-csi-controller Deployment:

    kubectl --kubeconfig <var class="edit">ADMIN_CLUSTER_KUBECONFIG</var> rollout restart deployment vsphere-csi-controller \
        --namespace <var class="edit">USER_CLUSTER_NAME</var>
    

後續步驟

如需其他協助,請與 Cloud Customer Care 團隊聯絡。

如要進一步瞭解支援資源,包括下列項目,請參閱「取得支援」: