存储异常问题排查

挂载和使用存储卷时,如果遇到Pod状态异常现象,可依次排查PodPVC的状态和事件,以及CSI存储组件情况来确认异常原因,进而解决问题。本文介绍存储相关异常问题的排查流程,以及常见的存储问题。

流程

1.检查Pod异常是否由存储问题导致

通过PodPVC事件,确认Pod无法启动是由存储问题导致。

  1. 查看异常Pod的事件。

    kubectl describe pod <pod-name>
    • Events中存在相关事件表明是存储问题(例如示例的FailedSchedulingMessage中表明是由于Volume与节点不匹配导致调度失败),请参考下文继续排查。

      Events:
        Type     Reason            Age    From               Message
        ----     ------            ----   ----               -------
        Warning  FailedScheduling  4m37s  default-scheduler  0/1 nodes are available: 1 node(s) had volume node affinity conflict. preemption: 0/1 nodes are available: 1 Preemption is not helpful for scheduling.,
    • Events中存在相关事件表明Volume已成功挂载(例如示例的SuccessfulAttachVolume),此时Pod未启动(例如CrashLoopBackOff)不属于存储问题,请根据Events排查其他问题,或者提交工单处理。

      Events:
        Type    Reason                  Age   From                     Message
        ----    ------                  ----  ----                     -------
        Normal  Scheduled               97s   default-scheduler        Successfully assigned default/disk-test-0 to cn-shanghai.192.168.5.2
        Normal  SuccessfulAttachVolume  97s   attachdetach-controller  AttachVolume.Attach succeeded for volume "d-uf6b8s2l5ypf48*****"
  2. Pod事件中未看到存储相关事件,可查看所有事件。

    kubectl get events
    • Events中存在相关事件表明是存储问题(例如示例的FailedBinding表明PVC绑定PV失败),请参考下文继续排查。

      LAST SEEN   TYPE      REASON                 OBJECT                                                  MESSAGE
      2m56s       Normal    FailedBinding          persistentvolumeclaim/data-my-release-mariadb-0         no persistent volumes available for this claim and no storage class is set
      41s         Normal    ExternalProvisioning   persistentvolumeclaim/pvc-nas-dynamic-create-subpath8   waiting for a volume to be created, either by external provisioner "nasplugin.csi.alibabacloud.com" or manually created by system administrator
      3m31s       Normal    Provisioning           persistentvolumeclaim/pvc-nas-dynamic-create-subpath8   External provisioner is provisioning volume for claim "default/pvc-nas-dynamic-create-subpath8"
    • Events中没有存储相关事件,请根据Events排查其他问题,或者提交工单处理。

2.检查存储组件是否正常

说明

如果您的集群目前使用Flexvolume组件,由于Flexvolume已废弃,请尽快迁移到CSI组件。具体操作,请参见迁移FlexvolumeCSI

  1. 检查CSI存储组件是否正常工作。

    kubectl get pod -n kube-system |grep csi

    返回示例如下。如果Pod状态非Running,可执行kubectl describe pods <pod-name> -n kube-system查看具体Container退出的原因及PodEvent。

    说明

    CSI存储组件包括csi-plugincsi-provisioner,其中csi-provisioner默认安装托管版。托管版组件由阿里云负责运维,您在集群中无法看到相关Pod。

    NAME                     READY   STATUS        RESTARTS   AGE
    csi-plugin-bpz28         4/4     Running       0          3d
    csi-plugin-h2tdg         4/4     Running       0          3d
    csi-plugin-qpnm4         4/4     Running       0          3d
    csi-plugin-wczgm         4/4     Running       0          3d
  2. 检查CSI存储组件是否为最新版本。

    kubectl get ds csi-plugin -n kube-system -o yaml |grep image

    在返回信息的image中可以确认镜像版本,示例如下:

    image: registry-cn-shanghai-vpc.ack.aliyuncs.com/acs/csi-plugin:v1.33.1-67e8986-aliyun

    若存储组件不是最新版本,请升级csi-plugincsi-provisioner。存储组件最新版本信息,请参见csi-plugin

    说明

    您也可以在控制台的组件管理页面,找到csi-plugincsi-provisioner组件,确认版本信息并升级组件。

  3. 检查PV、PVCStorageClassYAML,确认驱动配置(driverprovisioner字段)为使用CSI存储组件,与当前集群使用的存储组件一致。

3.检查PVC是否为Bound状态

  1. 查看PVC状态。

    kubectl get pvc
  2. 如果PVC为非Bound状态,参考以下方式进行排查和处理。

    问题原因

    • 静态:由于PVCPV之间的Selector无法满足互相绑定的条件导致。例如:PVCSelector配置与PV中的不一致,StorageClass Name不一致、PV状态是Released等问题。

    • 动态:由于csi-provisioner组件的某种原因导致。

    解决方案

4.检查Pod是否为Running状态

  1. 查看Pod状态。

    kubectl get pod
  2. 如果PVCBound状态,Pod为非Running状态,请根据存储卷类型,参考以下方式进行排查和处理。

    云盘存储卷

    重要

    使用云盘存储卷时,需确保待挂载云盘的Pod所调度到的ECS节点的规格支持挂载该类型云盘,并且Pod和云盘处于同一地域可用区。关于云盘类型和ECS实例规格的匹配关系,请参见实例规格族

    问题原因

    • 没有满足条件的节点可以调度。

    • 云盘挂载出现问题。

    • ECS节点和云盘类型不匹配。

    解决方案

    • 通过将Pod调度到其他节点快速恢复。具体操作,请参见调度应用至指定节点

    • 通过kubectl describe pods <pod-name>查看PodEvent。

    • 由于ECS节点和云盘类型不匹配导致的,请选择合适类型的云盘。更多信息,请参见实例规格族

    • 其他ECS OpenAPI类型问题的处理方法,请参见ErrorCode

    NAS存储卷

    重要
    • 节点与NAS必须在同一个VPC下。若不在同一VPC,请使用云企业网打通。

    • NAS支持跨可用区挂载。

    • 极速型NAS的挂载目录需要以/share开头。

    问题原因

    • 挂载NAS时使用了fsGroups,文件较多,导致chmod速度较慢。

    • 安全组中限制了2049端口,导致NAS无法挂载。

    • NAS和节点不在同一个VPC下。

    解决方案

    • 检查是否设置fsGroups,如有,去掉后重启Pod并重新挂载。

    • 确认Pod调度的节点是否限制了2049端口,如果该端口被限制,将2049端口放开后,重新挂载。具体操作,请参见添加安全组规则

    • 确认NAS和节点在同一VPC下,若不在同一VPC,请使用云企业网打通。

    • 其他问题,通过kubectl describe pods <pod-name>查看PodEvent。

    OSS存储卷

    重要
    • 节点挂载OSS时,PV中需填写AccessKey信息,可通过Secret方式使用 。

    • 跨地域使用OSS时,需将Bucket URL改成公网地址,同一地域建议使用内网地址。

    问题原因

    • 挂载OSS时使用了fsGroups,文件较多,导致chmod速度较慢。

    • 跨地域使用了内网地址,导致无法连接到Bucket Endpoint。

    解决方案

    • 检查是否设置fsGroups,如有,去掉后重启Pod并重新挂载。

    • 检查是否跨地域且使用内网访问Bucket,如是,请改用公网地址。

    • 其他问题,通过kubectl describe pods <pod-name>查看PodEvent。

常见问题

创建或挂载存储卷时,PVC提示no volume plugin matched

问题现象

创建或挂载存储卷时,PVC提示Unable to attach or mount volumes: unmounted volumes=[xxx], unattached volumes=[xxx]: failed to get Plugin from volumeSpec for volume "xxx" err=no volume plugin matched

问题原因

存储组件与YAML模板不匹配,创建或挂载存储卷时,无法找到相应的存储组件。

解决方案

检查集群中存储组件是否存在。

  • 未安装存储组件,请在集群中安装存储组件。具体操作,请参见管理组件

  • 已安装存储组件,请确定存储组件与PVPVCYAML模板是否匹配,且满足如下条件。

    • CSI存储组件使用CSI相关文档进行部署。更多信息,请参见存储CSI

    • Flexvolume存储组件使用Flexvolume相关文档进行部署。更多信息,请参见存储Flexvolume

      重要

      由于Flexvolume已废弃,建议尽快迁移到CSI组件。具体操作,请参见迁移FlexvolumeCSI

PodEvent提示0/x nodes are available: x pod has unbound immediate PersistentVolumeClaims

问题现象

Pod启动失败,Pod Event提示如下:

0/x nodes are available: x pod has unbound immediate PersistentVolumeClaims. preemption: 0/x nodes are available: x Preemption is not helpful for scheduling

问题原因

由于自定义StorageClass未创建,导致Pod引用的自定义StorageClass未找到。

解决方案

需要检查当前Pod引用的StorageClass是否存在,若不存在,需重新创建StorageClass。

PVReleased状态,无法通过重建PVC绑定

问题现象

PVC误删除后,PVReleased状态,无法通过重建PVC绑定。

问题原因

如果PVCreclaimPolicyRetain,当PVC被误删除时,PV会变为Released状态。

解决方案

您需要删除当前PV中的pv.spec.claimRef字段,然后重新使用静态卷方式进行绑定。即可将PV变为Bound状态。

PVLost状态,无法通过重建PVC绑定

问题现象

PVCPV创建后,PV处于Lost状态,且无法与PVC绑定。

问题原因

PVclaimRef引用的PVC名称不存在,导致PV状态为Lost

解决方案

您需要删除当前PV中的pv.spec.claimRef字段,然后重新使用静态卷方式进行绑定。即可将PV变为Bound状态。

StorageClass变更是否会影响现有存储

PVC、PVYAML文件不发生改变,StorageClass的变更不会对现有存储产生影响。例如,修改StorageClassALLOWVOLUMEEXPANSION字段时,仅在修改PVCCapacity后才会生效, 如果PVCYAML文件不变,此字段不会影响现有配置。