挂载和使用存储卷时,如果遇到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文件不变,此字段不会影响现有配置。