本文介绍在ACK集群中使用云盘存储卷遇到的常见问题及处理方法。
类型 | 问题 |
云盘创建 | |
云盘挂载 | |
云盘卸载 | |
云盘扩容 | |
云盘使用 |
动态创建PV失败且提示InvalidDataDiskCatagory.NotSupported
问题现象
创建PV失败,PVC Event提示InvalidDataDiskCategory.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
信息。同时,通过以下命令,确认csi-plugin是否直接挂载了/var/run
HostPath:kubectl get ds -n kube-system csi-plugin -ojsonpath='{.spec.template.spec.volumes[?(@.hostPath.path=="/var/run/")]}'
若输出不为空,则存在直接挂载,并确认存在该问题。
解决方案
原因1解决方案:
确保多Pod不能引用同一个PVC,解决Pod引用PVC的问题。
原因2解决方案:
请通过容器服务管理控制台的组件管理页面,升级csi-plugin组件到大于等于v1.26.3-796c9dc-aliyun的版本,并再次确认csi-plugin未直接挂载/var/run
。然后问题应该能在几分钟内自动解决。
若升级后直接挂载/var/run
依然存在,请从组件管理页面卸载并重装csi-plugin组件,或使用以下命令手动修复:
kubectl patch -n kube-system daemonset csi-plugin -p '
spec:
template:
spec:
containers:
- name: csi-plugin
volumeMounts:
- mountPath: /host/var/run/
$patch: delete
volumes:
- name: fuse-metrics-dir
$patch: delete'
启动挂载了云盘的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获取
configmap/serviceaccount defaulttoken
超时导致报错,属于节点网络问题,只能更换节点重试。原因3:在Pod模板中配置了
securityContext.fsGroup
参数时,云盘存储卷挂载时将自动调整卷内文件的所有者。根据文件数量,这可能导致较长的准备时间。原因4:如为静态挂载的存储,需确认存储卷中的
driver
字段是否正确,例如是否存在拼写问题。如果该字段错误,可能导致kubelet无法找到并调用正确的driver
,从而阻塞存储Ready。
解决方案
原因1解决方案:删除Pod,使其重启。找到真正报错的Event,根据真正报错的Event定位具体问题。
原因2解决方案:将Pod重新调度到其他节点。具体操作,请参见调度应用至指定节点。
原因3解决方案:对于1.20及以上版本的Kubernetes集群,可将
fsGroupChangePolicy
配置为OnRootMismatch
,这样只有在首次启动时才会自动调整文件的所有者。后续Pod升级重建等场景下,挂载存储卷的时间将恢复正常。关于fsGroupChangePolicy
参数的更多信息,请参见为Pod或容器配置安全性上下文。若仍不能满足需求,建议利用initContainer
自行实现调整权限相关操作。原因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、任意八代ECS节点类型,且集群版本和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环境变量指定数量的限制。
解决方案
v1.26.4-e3de357-aliyun及以上版本的csi-plugin组件支持自动配置云盘挂载数量,您可以执行以下命令,手动删除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'
v1.26.4-e3de357-aliyun以下版本的csi-plugin组件仅支持通过环境变量配置云盘挂载数量,请根据整个集群中可挂载数据盘数量最少的节点,手动调整该环境变量。
自动配置数量限制仅发生在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环境变量设置过大。
解决方案
v1.26.4-e3de357-aliyun及以上版本的csi-plugin组件支持自动配置云盘挂载数量,您可以执行以下命令,手动删除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'
v1.26.4-e3de357-aliyun以下版本的csi-plugin组件仅支持通过环境变量配置云盘挂载数量,请根据整个集群中可挂载数据盘数量最少的节点,手动调整该环境变量。
自动配置数量限制仅发生在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日志中发现Orphaned pod(不受ACK管理的Pod)
问题现象
Pod卸载失败,并且Kubelet出现不受ACK管理的Pod日志。
问题原因
Pod异常退出,导致数据卷挂载点在卸载过程中没有清理干净,最终导致Pod无法删除。在Kubernetes v1.22之前,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之后,云盘依旧残留
问题现象
删除集群中动态创建的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失败,删除后PVC依旧存在
问题现象
在集群中删除PVC失败,使用--force
仍然无法删除。
问题原因
集群中还有Pod在使用此PVC,PVC上的finalizer
依旧存在,无法删除。
解决方案
执行以下命令,查看当前引用此PVC的Pod。
kubectl describe pvc <pvc-name> -n kube-system
确认引用此PVC的Pod不再使用后,将此Pod删除,然后再次尝试删除PVC。
动态扩容云盘失败,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节点,请执行
kubectl get configmap -n kube-system eci-profile -ojsonpath="{.data.enablePVCController}"
,确认该配置已设置为true
,详见eci-profile配置项说明。若仍然无法解决,请提交工单给ECI团队处理。如果当前节点为ECS节点,请执行
kubectl get pods -n kube-system -l app=csi-plugin --field-selector=spec.nodeName=<node-name>
命令,获取当前节点的csi-plugin状态。若csi-plugin状态正常,请加入钉钉用户群(钉钉群号:35532895)咨询。
若csi-plugin状态异常,需重启csi-plugin的Pod,然后重试。若问题仍未解决,请加入钉钉用户群(钉钉群号:35532895)处理。
动态扩容云盘失败,Edit PVC时报错提示only dynamically provisioned pvc can be resized and the storageclass that provisions the pvc must support resize
问题现象
通过命令行或控制台编辑PVC Storage之后,发现如下报错信息:
only dynamically provisioned pvc can be resized and the storageclass that provisions the pvc must support resize
问题原因
原因1:当前云盘存储卷的PVC和PV是通过静态方式手动创建的,静态挂载的云盘不支持动态扩容。
原因2:集群当前PVC引用的StorageClass中allowVolumeExpansion
的值为false
,不支持动态扩容。
解决方案
解决方案1:通过手动方式扩容云盘静态存储卷。具体操作,请参见手动扩容云盘存储卷。
解决方案2:将PVC引用的StorageClass中allowVolumeExpansion
对应的值改为true
,然后再扩容PVC。
应用在读写云盘挂载目录时提示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云盘自动极速快照功能保护云盘存储数据卷的安全。更多信息,请参见云盘非预期删除导致的数据丢失。