本文介绍在ACK集群中使用云盘存储卷遇到的常见问题及处理方法。

类型问题
云盘创建
云盘挂载
云盘卸载
云盘扩容动态扩容云盘失败,PVC提示Event:Waiting for user to (re-)start a pod to finish file system resize of volume on node
云盘使用应用在读写云盘挂载目录时提示 input/output error

动态创建PV失败且提示InvalidDataDiskCatagory.NotSupported

问题现象

创建PV失败,PVC Event提示InvalidDataDiskCatagory.NotSupported

问题原因

当前可用区不支持创建指定StorageClass类型的云盘,或者当前可用区内当前指定类型库存不足。

解决方案

动态创建PV失败且提示The specified AZone inventory is insufficient

问题现象

创建PV失败,PVC Event提示The specified AZone inventory is insufficient

问题原因

ECS库存不足,导致创建云盘失败。

解决方案

动态创建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。

启动挂载了云盘的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

问题原因

  1. 一般出现在新增的节点。由于CSI的Pod是和业务Pod一起启动,且CSI注册需要一定时间,所以业务Pod开始挂载的时候,CSI还没有注册完成,导致出现警告。
  2. 当前节点的CSI组件注册失败,可能是因为某些原因CSI组件没有正常启动。

解决方案

  1. 此种告警情况,无需处理,等待系统重试即可。
  2. 需要检查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,会出现上面的报错信息。

该Event报错并没有实际意义,仅说明在当前时间点挂载还未完成,可能原因如下。
  • 原因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及以上。升级组件具体操作,请参见管理组件

说明 Flexvolume类型组件不支持,请加入钉钉用户群(钉钉群号:35532895)咨询,将Flexvolume组件迁移至CSI组件。

启动挂载了云盘的Pod时提示ecs task is conflicted

问题现象

启动挂载了云盘的Pod,启动失败,Pod Event提示ecs task is conflicted

问题原因

部分ECS任务需要串行,当有多个请求同时发送到ECS时,会出现ECS任务冲突报错。

解决方案

  1. 等待一段时间,CSI会自动重试。若您其他任务已经完成,CSI重试时会成功挂载云盘。
  2. 若问题仍未解决,请提交工单给ECS团队处理。

删除挂载了云盘的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将自动恢复。具体操作,请参见创建节点池移除节点
  • 调整StatefulSet为orderedready或去除podManagementPolicy: "Parallel" 属性。
  • 如果当前集群节点数较少,可以采用以下方案。
    1. 将当前Pod所在的节点添加cordon标签,设置为不可调度状态。
    2. 删除Pod,等待Pod状态变为Pending。
    3. 去除节点上的cordon标签,等待Pod重启。
  • 如果当前集群节点数较多,则将Pod调度到其他节点后可正常启动。

删除挂载了云盘的Pod时提示target is busy

问题现象

在删除Pod时,Pod Event或者kubelet日志(/var/log/messages)报出以下错误提示。
unmount failed, output <mount-path> target is busy

问题原因

Pod删除失败,说明有进程正在使用该设备。需要登录到Pod所在宿主机上查找正在使用该设备的进程。

解决方案

  1. 执行以下命令,找到对应挂载路径下的块设备。
    mount | grep <mount-path>
    /dev/vdtest <mount-path>
  2. 执行以下命令,找到使用块设备的进程ID。
    fuser -m /dev/vdtest
  3. 终止对应的进程。
    进程终止后,云盘会被自动卸载。

动态扩容云盘失败,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

问题原因

当前应用使用的云盘缺失。

解决方案

检查当前使用云盘的状态,根据状态进行处理。

  1. 根据云盘挂载目录,通过Pod的VolumeMount定义找到对应的PVC。
  2. 通过kubectl get pvc <pvc-name> 查看PVC状态,记录对应的PV。
  3. 根据PV Name查找到PV的YAML, 在pv.VolumeHandle字段查找当前使用的云盘ID。
  4. 登录ECS管理控制台,根据云盘ID,查看当前使用云盘的状态。
    • 若云盘处于Available状态,表明云盘被拔出,可通过重启Pod重新挂载云盘。

      当前Pod于Running状态,表明磁盘曾经被成功挂载过,然后被拔下。由此推测是多个Pod引用了同一个云盘导致的问题,可通过kubectl describe pvc <pvc-name>查看输出中的UsedBy,确定是否有多个Pod引用当前PVC。

    • 若找不到云盘,表明云盘已经被释放,则无法恢复。
      重要 挂载ESSD类型云盘时,建议使用ESSD云盘自动极速快照功能保护云盘存储数据卷的安全。更多信息,请参见云盘非预期删除导致的数据丢失