儲存空間疑難排解

您可以解決 Google Distributed Cloud 中的永久儲存空間問題,例如 Pod 卡在 ContainerCreating 狀態,或 VolumeSnapshot 遲遲未準備就緒。本文可協助您修正磁碟區連接和卸載失敗的問題、在磁碟區遺失後進行清理,以及解決 vSphere CSI 驅動程式權限、快照限制和 ESXi 版本需求。

無法連接磁碟區

如果虛擬磁碟連接至錯誤的虛擬機器,就可能發生這個問題,這可能是由 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 磁碟區

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

如果發現 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 相關聯的 VolumeAttachment:

    kubectl get volumeattachments | grep pvc-xxxxx
    

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

    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 Container Storage 驅動程式的最大值,就會發生這個問題。預設值為 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_CLUSTER_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. 刪除並重新建立 Secret:

    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 部署作業:

    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 團隊聯絡。

您也可以參閱「取得支援」,進一步瞭解支援資源,包括:

  • 建立客服案件的需求條件。
  • 工具:協助您疑難排解,例如記錄和指標。
  • Google Distributed Cloud for VMware (僅限軟體) 支援的元件、版本和功能。