您可以解決 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'.
如果虛擬磁碟連接至錯誤的虛擬機器,您可以按照下列步驟手動卸載:
。您可以在 kubectl drain 指令中,選擇性加入
--ignore-daemonsets和--delete-local-data旗標。在 vCenter 中編輯 VM 的硬體設定,即可移除磁碟區。
磁碟區遺失
如果虛擬磁碟已永久刪除,就可能發生這個問題。如果操作員手動刪除虛擬磁碟,或刪除磁碟所連接的 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 資源:
執行
kubectl delete pvc [PVC_NAME],刪除參照 PV 的 PVC。執行
kubectl delete pod [POD_NAME],刪除參照 PVC 的 Pod。由於 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
如要解決這個問題,請完成下列步驟:
請記下上述輸出內容中的 PersistentVolumeClaim (PVC) 名稱,並找出與 PVC 相關聯的 VolumeAttachment:
kubectl get volumeattachments | grep pvc-xxxxx以下輸出範例顯示 VolumeAttachments 的名稱:
csi-yyyyy csi.vsphere.vmware.com pvc-xxxxx node-zzzzz ...說明 VolumeAttachments:
kubectl describe volumeattachments csi-yyyyy | grep "Deletion Timestamp"記下刪除時間戳記,如以下輸出內容範例所示:
Deletion Timestamp: 2021-03-10T22:14:58Z請等到刪除時間戳記指定的時間,再強制刪除 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)
如要解決這個問題,請按照下列步驟更新每個磁碟區的快照數量上限:
取得將 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:使用者叢集名稱
從 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 名稱。
開啟
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刪除並重新建立 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重新啟動
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 團隊聯絡。
您也可以參閱「取得支援」,進一步瞭解支援資源,包括: