本文介绍在ACK集群中使用云盘存储卷遇到的常见问题及处理方法。
动态创建PV失败且提示InvalidDataDiskCatagory.NotSupported
问题现象
创建PV失败,PVC Event提示InvalidDataDiskCatagory.NotSupported。
问题原因
当前可用区不支持创建指定StorageClass类型的云盘,或者当前可用区内当前指定类型库存不足。
解决方案
- 使用自定义StorageClass声明多种类型的云盘。更多信息,请参见通过kubectl命令行的方式使用云盘动态存储卷。也可将CSI升级至最新版本,使用名称为alicloud-disk-topology-alltype的StorageClass。
- 为集群添加多个可用区。更多信息,请参见存储多可用区部署推荐配置。
动态创建PV失败且提示The specified AZone inventory is insufficient
问题现象
创建PV失败,PVC Event提示The specified AZone inventory is insufficient。
问题原因
ECS库存不足,导致创建云盘失败。
解决方案
- 使用自定义StorageClass声明多种类型的云盘。更多信息,请参见通过kubectl命令行的方式使用云盘动态存储卷。也可将CSI升级至最新版本,使用名称为alicloud-disk-topology-alltype的StorageClass。
- 为集群添加多个可用区。更多信息,请参见存储多可用区部署推荐配置。
动态创建PV失败且提示disk size is not supported
问题现象
动态创建PV失败,PVC Event提示disk size is not supported。
问题原因
在PVC中指定的云盘大小不符合规范,不同类型云盘有最小容量的限制,例如,高效云盘和SSD云盘要求最小20 GiB。更多限制信息,请参见云盘类型。
解决方案
调整PVC声明大小,使其满足要求。
动态创建PV失败且提示waiting for first consumer to be created before binding
问题现象
使用WaitForFirstConsumer的StorageClass创建PV失败,PVC Event提示persistentvolume-controller waiting for first consumer to be created before binding。
问题原因
PVC未检测到Pods被调度到的节点。
- 应用显示指定了
nodeName
,此类Pod不会经过调度器逻辑,导致PVC无法感知。所以使用nodeName
创建的Pod,无法使用WaitForFirstConsumer的StorageClass。 - 是否存在引用当前PVC的Pod,若没有,则需要创建。
解决方案
- 删除应用中的
nodeName
。 - 创建使用当前PVC的Pod。
动态创建PV失败且提示no topology key found on CSINode node-XXXX
问题现象
创建PV失败,PVC Event提示no topology key found on CSINode node-XXXX。
问题原因
- 原因1:node-XXXX对应节点的csi-plugin启动失败。
- 原因2:挂载使用了系统不支持的Driver,系统默认支持Disk、NAS、OSS。
解决方案
- 执行以下命令,查看Pod状态是否正常。
kubectl get pods -nkube-system -owide | grep node-XXXX
- 状态异常:通过命令
kubectl logs csi-plugin-xxxx -nkube-system -c csi-plugin
查看异常日志,多数节点Port被占用。您可参考以下步骤处理。- 关闭占用端口的进程。
- 使用以下命令,在ds csi-plugin上增加
SERVICE_PORT
的env参数。kubectl set env -nkube-system daemonset/csi-plugin --containers="csi-plugin" SERVICE_PORT="XXX"
- 状态正常:跳转下一步。
- 状态异常:通过命令
- 挂载使用系统默认的Driver,即Disk、NAS、OSS。如需支持特殊存储类型的Driver,请提交工单申请。
启动挂载了云盘的Pod时提示had volume node affinity conflict
问题现象
在启动挂载云盘的Pod的时候,出现Pod无法启动的情况并报错had volume node affinity conflict。
问题原因
所有的PV中都存在nodeaffinity
属性,当PV中nodeaffinity
属性和Pod的nodeaffinity
属性不一致时,就会出现上述报错,调度器因属性冲突无法调度。
解决方案
修改PV或者Pod的属性,使二者属性保持一致。
启动挂载了云盘的Pod时提示can't find disk
问题现象
启动挂载了云盘的Pod,Pod无法启动,Pod Event提示can't find disk。
问题原因
- 您写入了其他Region的DiskID。
- 您在编写PV的时候输入了错误的DiskID。
- 您的账号无权限操作DiskID,可能不是当前账号的DiskID。
解决方案
确认当前云盘是静态挂载还是动态挂载。
- 如果是静态挂载的云盘,则需要检查DiskID的来源是否满足如下条件。
- DiskID所在的Region与集群所在的Region一致。
- DiskID信息复制无误。
- DiskID与当前集群处于同一个账号下。
- 如果是动态挂载的云盘,则需要检查CSI组件的权限。确认当前集群是否存在Addon Token。
- 如果存在,检查集群中的CSI组件版本,将其直接升级到最新版后再重试。
- 如果不存在,默认使用的是节点的Worker Role用户自定义的AK和SK,需要检查对应的Policy权限。
启动挂载了云盘的Pod时提示Previous attach action is still in process
问题现象
启动挂载了云盘的Pod时提示Previous attach action is still in process,数秒后Pod启动成功。
问题原因
当前ECS不支持多块云盘同时挂载到一台虚拟机上。所以当有多个有云盘的Pod被调度到同一台宿主机时,云盘挂载会串行操作。出现如上提示信息,说明此刻当前节点正在由其他云盘挂载。
解决方案
无需处理,会自动重试,直至成功。
启动挂载了云盘的Pod时提示InvalidInstanceType.NotSupportDiskCategory
问题现象
启动挂载了云盘的Pod时提示InvalidInstanceType.NotSupportDiskCategory。
问题原因
ECS实例不支持挂载的云盘类型。
解决方案
请参考实例规格族确认当前ECS支持的云盘类型。挂载时,将云盘类型更新为ECS实例当前支持的类型。
启动挂载了云盘的Pod时提示diskplugin.csi.alibabacloud.com not found in the list of registered CSI drivers
问题现象
Warning FailedMount 98s (x9 over 3m45s) kubelet, cn-zhangjiakou.172.20.XX.XX MountVolume.MountDevice failed for volume "d-xxxxxxx" : kubernetes.io/csi: attacher.MountDevice failed to create newCsiDriverClient: driver name diskplugin.csi.alibabacloud.com not found in the list of registered CSI drivers
问题原因
- 一般出现在新增的节点。由于CSI的Pod是和业务Pod一起启动,且CSI注册需要一定时间,所以业务Pod开始挂载的时候,CSI还没有注册完成,导致出现警告。
- 当前节点的CSI组件注册失败,可能是因为某些原因CSI组件没有正常启动。
解决方案
- 此种告警情况,无需处理,等待系统重试即可。
- 需要检查CSI组件状态和CSI组件日志,若CSI组件正常,请加入钉钉用户群(钉钉群号:35532895)处理。
启动挂载了云盘的Pod时提示Unable to attach or mount volumes: unmounted volumes=[xxx], unattached volumes=[xxx]: timed out waiting for the condition
问题现象
启动了挂载存储的Pod,发现Pod的Event中出现报错Unable to attach or mount volumes: unmounted volumes=[xxx], unattached volumes=[xxx]: timed out waiting for the condition。
问题原因
该Event是Kubelet报出的错误信息,由于Kubelet存在一个方法,该方法用来循环检查所有节点的Pod所使用的存储是否Ready,如果存储卷没有Ready,会出现上面的报错信息。
- 原因1:挂载报错,由于报错时间过长,有效Event已过期被覆盖,残留的只有上面Kubelet报错的Event。
- 原因2:Kubelet获取
configmmap/serviceaccount defaulttoken
超时导致报错,属于节点网络问题,只能更换节点重试。 - 原因3:在应用中使用了
fsGroup
配置,云盘已完成挂载,但是修改文件属性时间过长。
解决方案
- 原因1解决方案:删除Pod,使其重启。找到真正报错的Event,根据真正报错的Event定位具体问题。
- 原因2解决方案:将Pod重新调度到其他节点。具体操作,请参见调度应用Pod至指定节点。
- 原因3解决方案:检查Pod是否包含
fsGroup
配置,当磁盘中文件过多时,使用fsGroup
会导致挂载超时,此时,需要将配置修改为在Init Container中执行chgrp
。
启动挂载了云盘的Pod时提示validate error Device /dev/nvme1n1 has error format more than one digit locations
问题现象
启动挂载了云盘的Pod,Pod无法启动,Pod Event提示validate error Device /dev/nvme1n1 has error format more than one digit locations。
问题原因
您使用了g7se、r7se、c7se中的任一节点类型,且集群CSI组件当前的版本过低,不支持NVMe类型的节点进行云盘挂载。
解决方案
请确保您的ACK集群版本不低于1.20,并将CSI组件版本升级至v1.22.9-30eb0ee5-aliyun及以上。升级组件具体操作,请参见管理组件。
启动挂载了云盘的Pod时提示ecs task is conflicted
问题现象
启动挂载了云盘的Pod,启动失败,Pod Event提示ecs task is conflicted。
问题原因
部分ECS任务需要串行,当有多个请求同时发送到ECS时,会出现ECS任务冲突报错。
解决方案
- 等待一段时间,CSI会自动重试。若您其他任务已经完成,CSI重试时会成功挂载云盘。
- 若问题仍未解决,请提交工单给ECS团队处理。
启动挂载了云盘的Pod时提示wrong fs type, bad option, bad superblock on /dev/xxxxx missing codepage or helper program, or other error
问题现象
启动挂载了云盘的Pod,出现Pod无法启动,Pod Event提示如下。
wrong fs type, bad option, bad superblock on /dev/xxxxx missing codepage or helper program, or other error
问题原因
云盘的文件系统有损坏,导致云盘无法挂载。
解决方案
一般由于业务不正常的拔盘导致,请参考以下步骤处理。
- 检查应用使用的云盘是否满足以下规范。
- 不存在多Pod挂载同一块云盘。
- 在拔盘过程中请勿写入数据。
- 登录Pod所在的宿主机,通过命令
fsck -y /dev/xxxxx
修复云盘上的文件系统。其中/dev/xxxxx
为Pod Event对应的报错提示。修复云盘文件系统时,会修改文件系统的元数据。如果无法修复或者修复失败,表明云盘上的文件系统已损坏,无法继续使用。
删除挂载了云盘的Pod时提示The specified disk is not a portable disk
问题现象
卸载云盘时,提示The specified disk is not a portable disk。
问题原因
您申请了包年包月的云盘,或者在升级ECS时,将ECS关联的云盘一起升级为包年包月。
解决方案
将云盘的付费方式改为按量付费。
删除挂载了云盘的Pod时提示无法卸载云盘,查看Kubelet日志发现有孤儿日志(Pod卸载失败且Kubelet出现不受ACK管理的Pod日志)
问题现象
Pod卸载失败,并且Kubelet出现不受ACK管理的Pod日志。
问题原因
Pod异常退出,导致数据卷挂载点在卸载过程中没有清理干净,最终导致Pod无法删除。Kubelet的GC流程对数据卷垃圾回收实现并不完善,目前需要手动或脚本自动化实现垃圾挂载点的清理工作。
解决方案
wget https://raw.githubusercontent.com/AliyunContainerService/kubernetes-issues-solution/master/kubelet/kubelet.sh
sh kubelet.sh
删除挂载了云盘的Pod后,Pod无法重新启动,提示挂载失败且无法自动恢复
问题现象
Warning FailedMount 9m53s (x23 over 40m) kubelet MountVolume.SetUp failed for volume “xxxxx” : rpc error: code = Internal desc = stat /var/lib/kubelet/plugins/kubernetes.io/csi/pv/xxxxx/globalmount: no such file or directory
影响范围:
- ACK集群版本为1.20.4-aliyun-1。
- 应用的存储介质为云盘。
- 使用StatefulSet并且设置了
podManagementPolicy: "Parallel"
属性。
问题原因
更多信息,请参见Pod fails to start after restarting rapidly。
解决方案
删除挂载了云盘的Pod时提示target is busy
问题现象
unmount failed, output <mount-path> target is busy
问题原因
Pod删除失败,说明有进程正在使用该设备。需要登录到Pod所在宿主机上查找正在使用该设备的进程。
解决方案
- 执行以下命令,找到对应挂载路径下的块设备。
mount | grep <mount-path> /dev/vdtest <mount-path>
- 执行以下命令,找到使用块设备的进程ID。
fuser -m /dev/vdtest
- 终止对应的进程。进程终止后,云盘会被自动卸载。
动态扩容云盘失败,PVC Event提示Waiting for user to (re-)start a pod to finish file system resize of volume on node
问题现象
Waiting for user to (re-)start a pod to finish file system resize of volume on node.
问题原因
动态扩容云盘分两部分:一个是调用ECS的OpenAPI扩容云盘;另一个进行文件系统扩容。出现以上错误提示说明底层块设备已经扩容成功,但文件系统扩容失败。说明节点侧存在问题。
解决方案
- 如果当前节点为ECI节点,请提交工单给ECI团队处理。
- 如果当前节点为ECS节点,请执行
kubelet get pods -nkube-system -owide | grep csi | grep <node-name>
命令,获取当前节点的csi-plugin状态。- 若csi-plugin状态正常,请加入钉钉用户群(钉钉群号:35532895)咨询。
- 若csi-plugin状态异常,需重启csi-plugin的Pod,然后重试。若问题仍未解决,请加入钉钉用户群(钉钉群号:35532895)处理。
应用在读写云盘挂载目录时提示input/output error
问题现象
云盘挂载正常,应用顺利启动,但是短时间后,应用突然报错提示input/output error。
问题原因
当前应用使用的云盘缺失。
解决方案
检查当前使用云盘的状态,根据状态进行处理。
- 根据云盘挂载目录,通过Pod的
VolumeMount
定义找到对应的PVC。 - 通过
kubectl get pvc <pvc-name>
查看PVC状态,记录对应的PV。 - 根据PV Name查找到PV的YAML, 在
pv.VolumeHandle
字段查找当前使用的云盘ID。 - 登录ECS管理控制台,根据云盘ID,查看当前使用云盘的状态。
- 若云盘处于Available状态,表明云盘被拔出,可通过重启Pod重新挂载云盘。
当前Pod于Running状态,表明磁盘曾经被成功挂载过,然后被拔下。由此推测是多个Pod引用了同一个云盘导致的问题,可通过
kubectl describe pvc <pvc-name>
查看输出中的UsedBy
,确定是否有多个Pod引用当前PVC。 - 若找不到云盘,表明云盘已经被释放,则无法恢复。重要 挂载ESSD类型云盘时,建议使用ESSD云盘自动极速快照功能保护云盘存储数据卷的安全。更多信息,请参见云盘非预期删除导致的数据丢失。
- 若云盘处于Available状态,表明云盘被拔出,可通过重启Pod重新挂载云盘。