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

1.检查Pod异常是否由存储问题导致
通过Pod或PVC事件,确认Pod无法启动是由存储问题导致。
- 查看异常Pod的事件。 - kubectl describe pod <pod-name>- 若Events中存在相关事件表明是存储问题(例如示例的 - FailedScheduling的- Message中表明是由于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*****"
 
- 若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组件。具体操作,请参见迁移Flexvolume至CSI。
- 检查CSI存储组件是否正常工作。 - kubectl get pod -n kube-system |grep csi- 返回示例如下。如果Pod状态非Running,可执行 - kubectl describe pods <pod-name> -n kube-system查看具体Container退出的原因及Pod的Event。说明- CSI存储组件包括csi-plugin和csi-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
- 检查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-plugin和csi-provisioner。存储组件最新版本信息,请参见csi-plugin。 说明- 您也可以在控制台的组件管理页面,找到csi-plugin和csi-provisioner组件,确认版本信息并升级组件。 
- 检查PV、PVC和StorageClass的YAML,确认驱动配置( - driver或- provisioner字段)为使用CSI存储组件,与当前集群使用的存储组件一致。
3.检查PVC是否为Bound状态
- 查看PVC状态。 - kubectl get pvc
- 如果PVC为非Bound状态,参考以下方式进行排查和处理。 - 问题原因 - 静态:由于PVC和PV之间的Selector无法满足互相绑定的条件导致。例如:PVC中Selector配置与PV中的不一致,StorageClass Name不一致、PV状态是Released等问题。 
- 动态:由于csi-provisioner组件的某种原因导致。 
 - 解决方案 
4.检查Pod是否为Running状态
- 查看Pod状态。 - kubectl get pod
- 如果PVC为Bound状态,Pod为非Running状态,请根据存储卷类型,参考以下方式进行排查和处理。 - 云盘存储卷重要- 使用云盘存储卷时,需确保待挂载云盘的Pod所调度到的ECS节点的规格支持挂载该类型云盘,并且Pod和云盘处于同一地域可用区。关于云盘类型和ECS实例规格的匹配关系,请参见实例规格族。 - 问题原因 - 没有满足条件的节点可以调度。 
- 云盘挂载出现问题。 
- ECS节点和云盘类型不匹配。 
 - 解决方案 - NAS存储卷重要- 节点与NAS必须在同一个VPC下。若不在同一VPC,请使用云企业网打通。 
- NAS支持跨可用区挂载。 
- 极速型NAS的挂载目录需要以 - /share开头。
 - 问题原因 - 挂载NAS时使用了 - fsGroups,文件较多,导致chmod速度较慢。
- 安全组中限制了2049端口,导致NAS无法挂载。 
- NAS和节点不在同一个VPC下。 
 - 解决方案 - OSS存储卷重要- 节点挂载OSS时,PV中需填写AccessKey信息,可通过Secret方式使用 。 
- 跨地域使用OSS时,需将Bucket URL改成公网地址,同一地域建议使用内网地址。 
 - 问题原因 - 挂载OSS时使用了 - fsGroups,文件较多,导致chmod速度较慢。
- 跨地域使用了内网地址,导致无法连接到Bucket Endpoint。 
 - 解决方案 - 检查是否设置 - fsGroups,如有,去掉后重启Pod并重新挂载。
- 检查是否跨地域且使用内网访问Bucket,如是,请改用公网地址。 
- 其他问题,通过 - kubectl describe pods <pod-name>查看Pod的Event。- 根据Event提示信息进行处理。处理方法请参见ossfs 1.0存储卷FAQ或ossfs 2.0存储卷FAQ。 
- 若没有相关Event信息,请提交工单处理。 
 
 
常见问题
创建或挂载存储卷时,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模板不匹配,创建或挂载存储卷时,无法找到相应的存储组件。
解决方案
检查集群中存储组件是否存在。
- 未安装存储组件,请在集群中安装存储组件。具体操作,请参见管理组件。 
- 已安装存储组件,请确定存储组件与PV和PVC的YAML模板是否匹配,且满足如下条件。 - CSI存储组件使用CSI相关文档进行部署。更多信息,请参见存储CSI。 
- Flexvolume存储组件使用Flexvolume相关文档进行部署。更多信息,请参见存储Flexvolume。 重要- 由于Flexvolume已废弃,建议尽快迁移到CSI组件。具体操作,请参见迁移Flexvolume至CSI。 
 
Pod的Event提示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。
PV为Released状态,无法通过重建PVC绑定
问题现象
PVC误删除后,PV为Released状态,无法通过重建PVC绑定。
问题原因
如果PVC的reclaimPolicy是Retain,当PVC被误删除时,PV会变为Released状态。
解决方案
您需要删除当前PV中的pv.spec.claimRef字段,然后重新使用静态卷方式进行绑定。即可将PV变为Bound状态。
PV为Lost状态,无法通过重建PVC绑定
问题现象
PVC和PV创建后,PV处于Lost状态,且无法与PVC绑定。
问题原因
PV中claimRef引用的PVC名称不存在,导致PV状态为Lost。
解决方案
您需要删除当前PV中的pv.spec.claimRef字段,然后重新使用静态卷方式进行绑定。即可将PV变为Bound状态。
StorageClass变更是否会影响现有存储
若PVC、PV的YAML文件不发生改变,StorageClass的变更不会对现有存储产生影响。例如,修改StorageClass的ALLOWVOLUMEEXPANSION字段时,仅在修改PVC的Capacity后才会生效, 如果PVC的YAML文件不变,此字段不会影响现有配置。