本文介绍在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类型的云盘,或者当前可用区内当前指定类型库存不足。
解决方案
-
使用自定义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
观察到有多个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将自动恢复。具体操作,请参见创建节点池及移除节点。
-
调整StatefulSet为
orderedready
或去除podManagementPolicy: "Parallel"
属性。 -
如果当前集群节点数较少,可以采用以下方案。
-
将当前Pod所在的节点添加
cordon
标签,设置为不可调度状态。 -
删除Pod,等待Pod状态变为Pending。
-
去除节点上的
cordon
标签,等待Pod重启。
-
-
如果当前集群节点数较多,则将Pod调度到其他节点后可正常启动。
删除挂载了云盘的Pod时提示target is busy
问题现象
在删除Pod时,Pod Event或者kubelet日志(/var/log/messages)报出以下错误提示。
unmount failed, output target is busy
问题原因
Pod删除失败,说明有进程正在使用该设备。需要登录到Pod所在宿主机上查找正在使用该设备的进程。
解决方案
-
执行以下命令,找到对应挂载路径下的块设备。
mount | grep /dev/vdtest
-
执行以下命令,找到使用块设备的进程ID。
fuser -m /dev/vdtest
-
终止对应的进程。
进程终止后,云盘会被自动卸载。
删除集群中动态创建的PVC之后,云盘依旧残留
问题现象
删除集群中动态创建的PVC之后,云盘在ECS控制台依旧残留。
问题原因
-
检查PVC、PV是否声明了集群中已经存在的StorageClass。如果未声明,说明使用的是静态PVC和PV。
-
检查StorageClass中的
reclaimPolicy
是否为Retain
模式。 -
PVC、PV同时被删除或PV在PVC之前被删除。
解决方案
-
CSI不会删除静态创建的PVC、PV,您需要登录容器服务管理控制台或调用OpenAPI手动删除。
-
如果
reclaimPolicy
设置为Retain
模式,CSI同样不负责处理,您需要登录容器服务管理控制台或调用OpenAPI手动删除。 -
PV中若存在
deleteTimestamp annotation
的情况,CSI将不会负责回收云盘资源。更多信息,请参见controller。如需删除云盘资源,仅删除PVC即可,被删除的PVC绑定的PV将会被自动清理。
动态扩容云盘失败,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
命令,获取当前节点的csi-plugin状态。-
若csi-plugin状态正常,请加入钉钉用户群(钉钉群号:35532895)咨询。
-
若csi-plugin状态异常,需重启csi-plugin的Pod,然后重试。若问题仍未解决,请加入钉钉用户群(钉钉群号:35532895)处理。
-
若有其他疑问,请联系我们。
应用在读写云盘挂载目录时提示input/output error
问题现象
云盘挂载正常,应用顺利启动,但是短时间后,应用突然报错提示input/output error。
问题原因
当前应用使用的云盘缺失。
解决方案
检查当前使用云盘的状态,根据状态进行处理。
-
根据云盘挂载目录,通过Pod的
VolumeMount
定义找到对应的PVC。 -
通过
kubectl get pvc
查看PVC状态,记录对应的PV。 -
根据PV Name查找到PV的YAML, 在
pv.VolumeHandle
字段查找当前使用的云盘ID。 -
登录ECS管理控制台,根据云盘ID,查看当前使用云盘的状态。
-
若云盘处于Available状态,表明云盘被拔出,可通过重启Pod重新挂载云盘。
当前Pod于Running状态,表明磁盘曾经被成功挂载过,然后被拔下。由此推测是多个Pod引用了同一个云盘导致的问题,可通过
kubectl describe pvc
查看输出中的UsedBy
,确定是否有多个Pod引用当前PVC。 -
若找不到云盘,表明云盘已经被释放,则无法恢复。
重要
挂载ESSD类型云盘时,建议使用ESSD云盘自动极速快照功能保护云盘存储数据卷的安全。更多信息,请参见云盘非预期删除导致的数据丢失。
-
内容没看懂? 不太想学习?想快速解决? 有偿解决: 联系专家
阿里云企业补贴进行中: 马上申请
腾讯云限时活动1折起,即将结束: 马上收藏
同尘科技为腾讯云授权服务中心。
购买腾讯云产品享受折上折,更有现金返利:同意关联,立享优惠
转转请注明出处:https://www.yunxiaoer.com/171605.html