云盘存储卷FAQ
本文介绍在ACK集群中使用云盘存储卷遇到的常见问题及处理方法。
类型 | 问题 |
云盘创建 | |
云盘挂载 | |
云盘卸载 | |
云盘扩容 | |
云盘使用 |
动态创建PV失败且提示InvalidDataDiskCatagory.NotSupported
问题现象
创建PV失败,PVC Event提示InvalidDataDiskCatagory.NotSupported。
问题原因
当前可用区不支持创建指定StorageClass类型的云盘,或者当前可用区内当前指定类型库存不足。
解决方案
使用自定义StorageClass声明多种类型的云盘。更多信息,请参见使用云盘动态存储卷。也可将CSI升级至最新版本,使用名称为alicloud-disk-topology-alltype的StorageClass。
为集群添加多个可用区。更多信息,请参见存储多可用区部署推荐配置。
动态创建PV失败且提示The specified AZone inventory is insufficient
问题现象
创建PV失败,PVC Event提示The specified AZone inventory is insufficient。
问题原因
ECS库存不足,导致创建云盘失败。
解决方案
使用自定义StorageClass声明多种类型的云盘。更多信息,请参见使用云盘动态存储卷。也可将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,请提交工单申请。
动态创建PV失败且提示selfLink was empty, can't make reference
问题现象
创建PV失败,PVC Event提示selfLink was empty, can't make reference。
问题原因
集群版本和CSI组件版本不匹配。
集群使用Flexvolume存储插件。
解决方案
升级CSI组件版本。一般组件版本需要和集群大版本保持一致。例如,Kubernetes大版本为1.20的集群需要匹配安装的CSI版本为1.20及以上版本。
如您的集群使用的Flexvolume存储插件,请慢慢迁移至CSI存储插件。具体操作,请参见通过csi-compatible-controller组件迁移Flexvolume至CSI。
启动挂载了云盘的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
问题现象
启动Pod的时候,出现以下警告。
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时提示Multi-Attach error for volume
问题现象
启动了挂载存储的Pod,发现Pod的Event中出现报错warning failedAttachVolume xxx xxx Multi-Attach error for volume "xxx",通过kubectl describe pvc <pvc-name>
观察到有多个Pod引用同一个PVC。
问题原因
原因1:云盘默认仅支持单个Pod使用,不能同时被多个Pod挂载使用。
原因2:之前挂载PVC的Pod已经删除,但是PVC未能正常卸载。通过ECS管理控制台查看该PVC对应云盘当前被挂载的节点,查看该节点上csi-plugin的Pod日志,存在
Path is mounted, no remove: /var/lib/kubelet/plugins/kubernetes.io/csi/diskplugin.csi.alibabacloud.com/xxx/globalmount
信息。
解决方案
原因1解决方案:
确保多Pod不能引用同一个PVC,解决Pod引用PVC的问题。
原因2解决方案:
执行以下命令,查看csi-plugin是否直接挂载了/var/run HostPath
。
kubectl get ds -n kube-system -o yaml csi-plugin
若挂载了,请通过容器服务管理控制台的组件管理页面,卸载并重新安装csi-plugin组件,此操作将更新到最新版部署文件,避免csi-plugin直接挂载/var/run
。
启动挂载了云盘的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,会出现上面的报错信息。
该Event报错并没有实际意义,仅说明在当前时间点挂载还未完成,可能原因如下。
原因1:挂载报错,由于报错时间过长,有效Event已过期被覆盖,残留的只有上面Kubelet报错的Event。
原因2:Kubelet获取
configmmap/serviceaccount defaulttoken
超时导致报错,属于节点网络问题,只能更换节点重试。原因3:在应用中使用了
fsGroup
配置,云盘已完成挂载,但是修改文件属性时间过长。原因4:如为静态挂载的存储, 需确认存储卷中的
driver
字段是否正确,例如是否存在拼写问题。如果该字段错误, 可能导致kubelet无法找到并调用正确的driver
, 从而阻塞存储Ready。
解决方案
原因1解决方案:删除Pod,使其重启。找到真正报错的Event,根据真正报错的Event定位具体问题。
原因2解决方案:将Pod重新调度到其他节点。具体操作,请参见调度应用Pod至指定节点。
原因3解决方案:检查Pod是否包含
fsGroup
配置,当磁盘中文件过多时,使用fsGroup
会导致挂载超时,此时,需要将配置修改为在Init Container中执行chgrp
。原因4解决方案:检查并填写正确的driver name,例如:
diskplugin.csi.alibabacloud.com
nasplugin.csi.alibabacloud.com
ossplugin.csi.alibabacloud.com
启动挂载了云盘的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及以上。升级组件具体操作,请参见管理组件。
Flexvolume类型组件不支持,请加入钉钉用户群(钉钉群号:35532895)咨询,将Flexvolume组件迁移至CSI组件。
启动挂载了云盘的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时提示exceed max volume count
问题现象
启动挂载了云盘的Pod,Pod长期处于Pending状态,无法完成调度。但根据ECS规格,节点上还可以挂载更多的云盘。Pod Event提示如下。
0/1 nodes are available: 1 node(s) exceed max volume count.
问题现象
Pod调度受到MAX_VOLUMES_PERNODE环境变量指定数量的限制。
解决方案
若安装的csi-plugin组件版本为v1.26.4-e3de357-aliyun及以上版本,您可以执行以下命令,手动删除kube-system命名空间下csi-plugin daemonset中的MAX_VOLUMES_PERNODE环境变量,以自动根据ECS规格配置云盘挂载数量。
kubectl patch -n kube-system daemonset csi-plugin -p ' spec: template: spec: containers: - name: csi-plugin env: - name: MAX_VOLUMES_PERNODE $patch: delete'
若安装的csi-plugin组件版本小于v1.26.4-e3de357-aliyun版本,请根据整个集群中可挂载数据盘数量最少的节点,手动调整该环境变量。
自动配置数量限制仅发生在csi-plugin Pod启动时。若您手动在节点上添加或移除了数据盘,请重建该节点上的csi-plugin Pod,以重新触发自动配置。
自动配置功能暂不支持云盘静态存储卷。更多信息,请参见使用云盘静态存储卷。若存在该类型的存储卷,可调度的Pod数量会偏小。
启动挂载了云盘的Pod时提示The amount of the disk on instance in question reach its limits
问题现象
启动挂载了云盘的Pod,Pod长期处于ContainerCreating状态,Pod Event提示如下。
MountVolume.MountDevice failed for volume "d-xxxx" : rpc error: code = Aborted desc = NodeStageVolume: Attach volume: d-xxxx with error: rpc error: code = Internal desc = SDK.ServerError
ErrorCode: InstanceDiskLimitExceeded
Message: The amount of the disk on instance in question reach its limits
问题原因
MAX_VOLUMES_PERNODE环境变量设置过大。
解决方案
若安装的csi-plugin组件版本为v1.26.4-e3de357-aliyun及以上版本,您可以执行以下命令,手动删除kube-system命名空间下csi-plugin daemonset中的MAX_VOLUMES_PERNODE环境变量,以自动根据ECS规格配置云盘挂载数量。
kubectl patch -n kube-system daemonset csi-plugin -p ' spec: template: spec: containers: - name: csi-plugin env: - name: MAX_VOLUMES_PERNODE $patch: delete'
若安装的csi-plugin组件版本小于v1.26.4-e3de357-aliyun版本,请根据整个集群中可挂载数据盘数量最少的节点,手动调整该环境变量。
自动配置数量限制仅发生在csi-plugin Pod启动时。若您手动在节点上添加或移除了数据盘,请重建该节点上的csi-plugin Pod,以重新触发自动配置。
自动配置功能暂不支持云盘静态存储卷。更多信息,请参见使用云盘静态存储卷。若存在该类型的存储卷,可调度的Pod数量会偏小。
删除挂载了云盘的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无法重新启动,提示挂载失败且无法自动恢复
问题现象
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
问题现象
在删除Pod时,Pod Event或者kubelet日志(/var/log/messages)报出以下错误提示。
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
问题现象
扩容PVC后,PVC的Status的StorageCapacity无变化,且PVC报如下Event信息:
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云盘自动极速快照功能保护云盘存储数据卷的安全。更多信息,请参见云盘非预期删除导致的数据丢失。