本文档介绍存储问题排查指南。
无法挂接卷
如果虚拟磁盘挂接到错误的虚拟机,则可能出现此问题,原因可能是 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'.
要解决此问题,请执行以下操作:
如果虚拟磁盘挂接到了错误的虚拟机,您可能需要手动将其分离:
排空节点。 请参阅安全排空节点 {:.external"}。建议您在 kubectl drain {:.external"> 命令中添加
--ignore-daemonsets
和--delete-local-data
标志。在 vCenter 中修改虚拟机的硬件配置以移除卷。
卷丢失
如果虚拟磁盘已被永久删除,则可能会出现此问题。如果操作人员手动删除虚拟磁盘或其挂接的虚拟机,则可能会发生这种情况。如果您看到与 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。重复第 2 步。是的,确实是这样。请参阅 Kubernetes 问题 74374 {:.external}。
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-164d56e3286e954befdf0f5a82d59031dbfd50709c927a0e6ccf21d1fa60192dcsi-8d9c3d0439f413fa9e176c63f5cc92bd67a33a1b76919d42c20347d52c57435c csi-e40d65005bc64c45735e91d7f7e54b2481a2bd41f5df7cc219a2c03608e8e7a8
如需解决此问题,请为您的 vcenter 用户帐号添加 CNS > Searchable
权限。分离操作会自动重试,直到执行成功。
CSI 卷创建失败并显示 NotSupported
错误
当 vSphere 集群中的 ESXi 主机运行低于 ESXi 6.7U3 的版本时,会出现此问题。
kubectl describe pvc
的输出包含此错误:
Failed to provision volume with StorageClass: 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 驱动程序中的已知问题 {:.external}。
kubectl describe pod
的输出结果如下所示:
Events: Type Reason Age From Message ---- ------ ---- ---- ------- Warning FailedAttachVolume 2m30s 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
输出会显示 VolumeAttachment 的名称。例如:
csi-yyyyy csi.vsphere.vmware.com pvc-xxxxx node-zzzzz ...
描述 VolumeAttachment。例如:
kubectl describe volumeattachments csi-yyy | grep "Deletion Timestamp"
记下输出中的删除时间戳。例如:
Deletion Timestamp: 2021-03-10T22:14:58Z
等待删除时间戳指定的时间,然后强制删除 VolumeAttachment。为此,请修改 VolumeAttachment 对象并删除终结器。例如:
kubectl edit volumeattachment csi-yyyyy Finalizers: external-attacher/csi-vsphere-vmware-com