本文提供儲存空間問題的疑難排解指南。
磁碟區無法附加
如果虛擬磁碟連接至錯誤的虛擬機器,就可能發生這個問題,這可能是 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 磁碟區無法卸離
如果 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
如要解決這個問題,請完成下列步驟:
記下上述輸出內容中的 PersistentVolumeClaim (PVC) 名稱,然後找出與 PVC 相關聯的 VolumeAttachments:
kubectl get volumeattachments | grep pvc-xxxxx
以下輸出範例顯示 VolumeAttachment 的名稱:
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 容器儲存空間驅動程式的最大值時,就會發生這個問題。預設值為 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_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
刪除並重新建立密鑰:
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
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 團隊聯絡。
如要進一步瞭解支援資源,包括下列項目,請參閱「取得支援」: