云盘存储卷FAQ

本文介绍使用云盘存储卷的常见问题和解决方法。

问题导航

类型

问题

创建

挂载

使用

扩容

卸载

其他

云盘创建

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

问题现象

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

问题原因

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

解决方案

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

问题现象

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

问题原因

指定的可用区内云盘库存不足,导致创建云盘失败。

解决方案

动态创建PV失败且提示disk size is not supported

问题现象

动态创建PV失败,PVC Event提示disk size is not supported

问题原因

PVC中指定的云盘容量大小不符合要求,不同类型云盘有最小容量的限制。关于云盘的容量要求,请参见云盘类型

解决方案

调整PVC中声明的容量大小,使其满足要求。

动态创建PV失败且提示waiting for first consumer to be created before binding

问题现象

使用WaitForFirstConsumerStorageClass创建PV失败,PVC Event提示persistentvolume-controller waiting for first consumer to be created before binding

问题原因

PVC未检测到Pod所调度到的节点。

  • 应用的YAML中显示指定了nodeName,此类Pod不会经过调度器逻辑,导致PVC无法感知。因此通过指定nodeName调度的Pod,无法使用WaitForFirstConsumerStorageClass。

  • 不存在引用当前PVCPod。

解决方案

  • 删除应用YAML中的nodeName相关字段,使用其他调度方式。

  • 创建使用当前PVCPod。

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

解决方案

  1. 查看Pod状态是否正常。

    kubectl get pods -n kube-system -o wide | grep node-XXXX
    • 状态异常:通过命令kubectl logs csi-plugin-xxxx -nkube-system -c csi-plugin查看异常日志。多数情况是因为节点端口被占用,您可参考以下步骤处理。

      • 关闭占用端口的进程。

      • csi-plugin上增加SERVICE_PORT的环境变量,指定新的端口。

        kubectl set env -n kube-system daemonset/csi-plugin --containers="csi-plugin" SERVICE_PORT="XXX"
    • 状态正常:跳转下一步。

  2. 挂载使用系统默认的Driver,即Disk、NAS、OSS等。详情请参见存储目录下的操作文档。

动态创建PV失败且提示selfLink was empty, can't make reference

问题现象

创建PV失败,PVC Event提示selfLink was empty, can't make reference

问题原因

  1. 集群版本和CSI组件版本不匹配。

  2. 集群使用Flexvolume存储插件。

解决方案

  1. 升级CSI组件版本。一般组件版本需要和集群版本保持一致。例如,Kubernetes版本为1.20的集群需要匹配安装的CSI版本为1.20及以上版本。

  2. 如您的集群使用Flexvolume存储插件,请迁移FlexvolumeCSI

PVC的容量申请低于20 GiB时,动态创建PV失败

根据云盘类型的差异,各类型云盘支持的容量范围不同。如果使用ACK提供的默认StorageClass(如alicloud-disk-topology-alltype、alicloud-disk-essd等),默认情况下,自动创建的云盘(如ESSD PL1云盘)的容量限制为最低20 GiB。如果您的存储需求低于20 GiB,建议手动创建StorageClass并指定云盘类型,确保动态创建的云盘为支持低于20 GiB容量的云盘(如ESSD AutoPL云盘、ESSD PL0云盘等)。

云盘挂载

启动挂载了云盘的Pod时提示had volume node affinity conflict

问题现象

启动挂载了云盘的Pod,Pod无法启动,Pod Event提示had volume node affinity conflict

问题原因

所有的PV中都存在nodeaffinity属性,当PVnodeaffinity属性和Podnodeaffinity属性不一致时会出现上述报错,调度器因属性冲突无法调度。

解决方案

修改PV或者Podnodeaffinity属性,使二者的nodeaffinity属性保持一致。

启动挂载了云盘的Pod时提示can't find disk

问题现象

启动挂载了云盘的Pod,Pod无法启动,Pod Event提示can't find disk

问题原因

  • 配置PV时,输入了错误的云盘ID,或者其他Region的云盘ID。

  • 您的账号无权限操作该云盘,可能不是当前账号的云盘。

解决方案

  • 如果是静态挂载的云盘,请检查使用的云盘是否满足要求。

    • 云盘所在的Region与集群所在的Region一致。

    • 云盘ID信息复制无误。

    • 云盘与当前集群处于同一个账号下。

  • 如果是动态挂载的云盘,请检查CSI组件的权限。

    确认当前集群是否存在Addon Token。

    • 如果存在,检查集群中的CSI组件版本,将其直接升级到最新版后再重试。

    • 如果不存在,默认使用的是节点的Worker Role用户自定义的AccessKey,需要检查对应的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实例规格不匹配,即Pod调度到的ECS节点不支持该类型的云盘,因此挂载失败。

解决方案

您可以尝试以下方法解决问题:

  • 查看ECS节点的实例规格,确保存在支持该类型云盘的ECS节点,同时确保已配置调度将Pod调度到该节点。

  • 如果当前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

问题原因

  • 一般出现在新增的节点。由于CSIPod是和业务Pod一起启动,且CSI注册需要一定时间,所以业务Pod开始挂载的时候,CSI还没有注册完成,导致出现警告。

  • 当前节点的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:之前使用PVCPod已经删除,但是PVC对应的云盘未能正常卸载。

    通过ECS管理控制台查看该PVC对应云盘当前被挂载的节点,并查看该节点上csi-pluginPod日志,存在Path is mounted, no remove: /var/lib/kubelet/plugins/kubernetes.io/csi/diskplugin.csi.alibabacloud.com/xxx/globalmount信息。同时,通过以下命令,确认csi-plugin是否直接挂载了/var/runHostPath:

    kubectl get ds -n kube-system csi-plugin -ojsonpath='{.spec.template.spec.volumes[?(@.hostPath.path=="/var/run/")]}'

    若输出不为空,则存在直接挂载,并确认存在该问题。

解决方案

  • 原因1解决方案

    确保多Pod不能引用同一个PVC,解决Pod引用PVC的问题。

  • 原因2解决方案:

    请通过以下命令手动修复csi-pluginYAML文件,修复之后问题即可解决。

    kubectl patch -n kube-system daemonset csi-plugin -p '
    spec:
      template:
        spec:
          containers:
            - name: csi-plugin
              volumeMounts:
                - mountPath: /host/var/run/efc
                  name: efc-metrics-dir
                - mountPath: /host/var/run/ossfs
                  name: ossfs-metrics-dir
                - mountPath: /host/var/run/
                  $patch: delete
          volumes:
            - name: ossfs-metrics-dir
              hostPath:
                path: /var/run/ossfs
                type: DirectoryOrCreate
            - name: efc-metrics-dir
              hostPath:
                path: /var/run/efc
                type: DirectoryOrCreate
            - 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

问题原因

Eventkubelet报出的错误信息,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重试时会成功挂载云盘。

  • 参见使用云盘并行挂载处理。

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

问题原因

云盘的文件系统损坏,导致云盘无法挂载。

解决方案

一般由于业务不正常的拔盘导致,请参考以下步骤处理。

  1. 检查应用使用云盘时是否满足以下要求。

    • 不存在多个Pod挂载同一块云盘。

    • 在拔盘过程中请勿写入数据。

  2. 登录Pod所在的宿主机,通过命令fsck -y /dev/xxxxx修复云盘上的文件系统。

    其中/dev/xxxxxPod 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数量会偏小。

如何更改默认创建的云盘类StorageClass的配置

默认创建的StorageClass不支持更改。

安装csi-provisioner组件后,集群内会默认创建alicloud-disk-topology-alltypeStorageClass,请勿修改这些默认生成的存储类。如果您需要调整StorageClass的配置,例如存储卷类型、回收策略等,您可以创建新的StorageClass(StorageClass数量不受限制)。具体操作,请参见创建StorageClass

多个容器应用是否可以使用同一个云盘存储卷

云盘为非共享存储,未开启多重挂载的云盘只能同时被一个Pod挂载。更多关于多重挂载的信息,请参见使用NVMe云盘多重挂载及Reservation

云盘使用

应用在读写云盘挂载目录时提示input/output error

问题现象

云盘挂载正常,应用顺利启动,但是短时间后,应用突然报错提示input/output error

问题原因

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

解决方案

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

  1. 根据云盘挂载目录,通过PodVolumeMount定义找到对应的PVC。

  2. 通过kubectl get pvc <pvc-name> 查看PVC状态,记录对应的PV。

  3. 根据PV Name查看PVYAML, 在pv.VolumeHandle字段中获取云盘ID。

  4. ECS管理控制台块存储页面,根据云盘ID,查看当前使用云盘的状态。

    • 若云盘处于待挂载状态,表明云盘被卸载,请重启Pod,重新挂载云盘。

      说明

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

    • 若找不到云盘,表明云盘已经被释放,则无法恢复。

      重要

      挂载ESSD类型云盘时,建议使用ESSD云盘自动极速快照功能保护云盘存储数据卷的安全。更多信息,请参见云盘非预期删除导致的数据丢失

使用云盘存储卷时,如何设置云盘挂载目录的用户访问权限

云盘本身不支持设置用户访问权限。如果需要设置挂载目录的用户访问权限,请在创建应用时为Pod配置securityContext来修改权限。更多信息,请参见Pod配置卷访问权限和属主变更策略

说明

配置了securityContext.fsgroup后,挂载云盘时会自动调整卷内文件的所有者,根据文件数量,这可能导致较长的准备时间。对于1.20及以上版本的Kubernetes集群,您可以将fsGroupChangePolicy配置为OnRootMismatch,实现仅在首次启动容器时才会调整文件的所有者,后续Pod升级或重建等场景下,挂载时长会恢复正常。若仍不能满足需求,建议利用initContainer自行实现调整权限相关操作。

云盘扩容

云盘存储卷是否会自动扩容

默认情况下,当云盘存储卷的容量耗尽时,并不会自动扩容,您需要手动更新PVC的存储容量声明实现扩容云盘存储卷。具体操作,请参见在线扩容云盘存储卷

如果您有自动扩容的需求,可通过CRD的方式定义云盘自动扩容策略,在存储卷的使用率高于某个阈值时,实现自动扩容。具体操作,请参见配置自动扩容

说明

如果集群版本低于1.16,或者不满足在线扩容云盘存储卷的要求(如云盘类型是普通云盘),您可以在ECS侧直接扩容云盘本身,即手动扩容云盘容量和文件系统。在ECS侧扩容云盘后,集群内资源不受影响(即在集群侧查看PVCPV的容量,仍是扩容前的大小)。

扩容云盘失败,提示Waiting for user to (re-)start a pod to finish file system resize of volume on node

问题现象

更新PVC的存储容量声明后,PVCStatusStorageCapacity无变化,且PVC Event报出以下信息:

 Waiting for user to (re-)start a pod to finish file system resize of volume on node.

问题原因

扩容云盘分两部分:一个是调用ResizeDisk接口扩容云盘容量;另一个是进行文件系统扩容。出现以上错误提示说明底层块设备已经扩容成功,但文件系统扩容失败,说明节点侧存在问题。

解决方案

判断当前节点的类型。

  • 如果当前节点为ECI节点,请执行kubectl get configmap -n kube-system eci-profile -o jsonpath="{.data.enablePVCController}",确认该配置已设置为true,详见eci-profile配置项说明

    若仍然无法解决,请提交工单处理。

  • 如果当前节点为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-pluginPod,然后重试。若问题仍未解决,请加入钉钉用户群(钉钉群号:35532895)处理。

扩容云盘失败,提示only dynamically provisioned pvc can be resized and the storageclass that provisions the pvc must support resize

问题现象

更新PVC的存储容量声明后,发现如下报错信息:

only dynamically provisioned pvc can be resized and the storageclass that provisions the pvc must support resize 

问题原因

  • 原因1:当前云盘存储卷的PVCPV是通过静态方式手动创建的。PVC中的storageClassName的配置为空,或者集群中没有同名的StorageClass。

  • 原因2:PVC引用的StorageClass中,allowVolumeExpansion的配置为false,不支持扩容。

解决方案

  • 原因1解决方案:查看PVCstorageClassName配置,确保集群存在同名的StorageClass。如果没有,请根据已有云盘存储卷的属性创建对应的StorageClass并配置allowVolumeExpansion: true

  • 原因2解决方案:StorageClass不支持修改属性,请新建一个StorageClass,将allowVolumeExpansion配置为true,然后修改PVC引用新的StorageClass,再扩容PVC。

云盘卸载

删除挂载了云盘的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之前,kubeletGC流程对数据卷垃圾回收实现并不完善,需要手动或通过脚本自动化实现垃圾挂载点的清理工作。

解决方案

在问题节点运行以下脚本,对垃圾挂载点进行清理。

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将自动恢复。具体操作,请参见创建和管理节点池移除节点

  • 调整StatefulSetorderedready或去除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之后,云盘依旧残留

问题现象

删除集群中的PVC之后,云盘在ECS控制台依旧残留。

问题原因

  • 原因1:PV的回收策略(reclaimPolicy)为Retain,表示删除PVC后,会保留PV和云盘。

  • 原因2:PVC、PV同时被删除或PVPVC之前被删除。

解决方案

  • 原因1解决方案:如果reclaimPolicy设置为Retain模式,删除PVC时,CSI不会删除PV和云盘,您需要手动删除。

  • 原因2解决方案:PV中若存在deleteTimestamp annotation的情况,CSI将不会负责回收云盘资源。更多信息,请参见controller。如需删除云盘资源,仅删除PVC即可,被删除的PVC绑定的PV将会被自动清理。

删除PVC失败,删除后PVC依旧存在

问题现象

在集群中删除PVC失败,使用--force仍然无法删除。

问题原因

集群中存在Pod使用该PVC,PVC上的finalizer依旧存在,无法删除。

解决方案

  1. 查看当前引用此PVCPod。

    kubectl describe pvc <pvc-name> -n kube-system
  2. 确认引用该PVCPod不再使用后,删除该Pod,然后再次尝试删除PVC。

其他

作为存储卷使用的云盘可以转为包年包月吗

作为存储卷的云盘必须采用按量付费方式,不能转为包年包月。

ECS控制台的块存储页面,如何判断哪些云盘是存储卷关联的云盘

获取云盘存储卷所关联的云盘的ID(格式为d-********),然后在ECS控制台的块存储页面,通过云盘ID确认哪些云盘是存储卷关联的云盘。

  • 默认情况,动态创建的云盘PV的名称即为云盘ID,您可以在集群的存储 > 存储卷页面直接查看。

  • 如果云盘PV的名称不是云盘ID,您可以通过kubectl get pv <pv-name> -o yaml命令查看云盘PV的详情,volumeHandle字段的值即为云盘ID。