本文介绍关于存储相关异常问题诊断流程和排查思路。
诊断流程
执行以下命令,查看Pod事件,确认Pod无法启动是由存储问题导致。
kubectl describe pods <pod-name>
若查看Pod处于下图所示的状态,说明Pod使用的存储都已成功挂载到Pod上。此时Pod没启动(比如:CrashLoopBackOff)不属于存储问题,请提交工单处理。
执行以下命令,查看CSI存储插件是否正常工作。
kubectl get pod -n kube-system |grep csi
预期输出:
NAME READY STATUS RESTARTS AGE csi-plugin-*** 4/4 Running 0 23d csi-provisioner-*** 7/7 Running 0 14d
说明如果出现非Running状态的Pod,使用
kubectl describe pods <pod-name> -n kube-system
查看具体Container退出的原因及Pod的Event。执行以下命令,查询CSI存储插件是否为最新版本。
kubectl get ds csi-plugin -n kube-system -oyaml |grep image
预期输出:
image: registry.cn-****.aliyuncs.com/acs/csi-plugin:v*****-aliyun
存储插件最新版本信息,请参见csi-plugin和csi-provisioner,若您集群中存储插件不是最新版本,请升级CSI插件。具体操作,请参见管理组件。其他存储组件升级失败问题排查,请参见组件升级失败问题排查。
排查Pod Pending问题。
云盘的Pod Pending问题处理,请参见下文云盘Pod的状态为非Running。
NAS的Pod Pending问题处理,请参见下文NAS Pod的状态为非Running。
OSS的Pod Pending问题处理,请参见下文OSS Pod的状态为非Running。
排查PVC处于非Bound问题。
云盘的PVC非Bound问题处理,请参见下文云盘PVC的状态为非Bound。
NAS的PVC非Bound问题处理,请参见下文NAS PVC的状态为非Bound。
OSS的PVC非Bound问题处理,请参见下文OSS PVC的状态为非Bound。
如果排查后问题仍未解决,请提交工单处理。
组件升级失败问题排查
若组件升级失败,请参考以下操作,进行csi-provisioner和csi-plugin组件升级失败问题排查。
csi-provisioner
该组件默认是2个副本的Deployment,这两个副本互斥,无法部署在同一个节点上。出现升级失败,需要先确认集群中是否只存在一个可用节点。
该组件的历史版本(1.14及之前版本)是StatefulSet,如果集群中存在StatefulSet类型的csi-provisioner,您可以通过执行
kubectl delete sts csi-provisioner
先删除sts csi-provisioner,然后登录容器服务管理控制台重新安装csi-provisioner组件,具体操作,请参见管理组件。
csi-plugin
检查集群是否存在
NotReady
的节点,如果存在NotReady
的节点, csi-plugin对应的DaemonSet会升级失败。若发现组件升级失败,但所有的Plugin均正常,这是因为组件中心一旦检查组件升级超时,就会自动回滚。遇到此问题,请提交工单处理。
云盘异常问题排查
节点挂载云盘时,节点与云盘必须是同一地域和同一可用区的,不支持跨地域和跨可用区使用。
不同规格的ECS支持挂载的云盘类型也不相同。更多信息,请参见实例规格族。
Pod的状态为非Running
问题现象:
PVC为Bound状态,Pod为非Running状态。
问题原因:
没有满足条件的节点可以调度。
云盘挂载出现问题。
ECS节点和云盘类型不匹配。
解决方案:
通过将Pod调度到其他节点快速恢复。具体操作,请参见调度应用Pod至指定节点。
通过命令
kubectl describe pods <pod-name>
查看Pod的Event。由于ECS节点和云盘类型不匹配导致的,请选择合适类型的云盘。更多信息,请参见实例规格族。
其他ECS OpenAPI类型问题的处理方法,请参见ErrorCode。
PVC的状态为非Bound
问题现象:
PVC为非Bound状态,Pod为非Running状态。
问题原因:
静态方式:由于PVC和PV之间的Selector无法满足互相绑定的条件导致。例如:PVC中Selector配置与PV中的不一致,StorageClass Name不一致、PV状态是Release等问题。
动态方式:由于csi-provisioner组件的某种原因未能创建出对应的云盘。
解决方案:
静态方式:请检查相关的YAML书写是否正确。更多信息,请参见通过kubectl命令行的方式使用云盘静态存储卷。
说明若PV的状态是Release,则该PV无法被复用,需要将云盘ID取出重新创建PV。
动态方式:通过命令
kubectl describe pvc <pvc-name> -n <namespace>
查看PVC的Event。
NAS异常问题排查
节点挂载NAS时,节点与NAS必须在同一个VPC网络下。若不在同一VPC,请使用云企业网打通。
NAS支持跨可用区挂载。
极速型NAS以及CPFS2.0挂载目录需要以/share开头。
Pod的状态为非Running
问题现象:
PVC为Bound状态,Pod为非Running状态。
问题原因:
挂载NAS时使用了
fsGroups
,文件较多,导致chmod速度较慢。安全组中限制了2049端口,导致NAS无法挂载。
NAS和节点不在同一个VPC下。
解决方案:
确认是否有
fsGroups
设置,如有,将其去掉后重启Pod,尝试重新挂载。确认Pod调度的节点是否限制了2049端口,如果该端口被限制,将2049端口放开后,重新挂载。具体操作,请参见添加安全组规则。
确认NAS和节点在同一VPC下,若不在同一VPC,请使用云企业网打通。
其他问题,通过命令
kubectl describe pods <pod-name>
查看Pod的Event。
PVC的状态为非Bound
问题现象:
PVC为Bound状态,Pod为非Running状态。
问题原因:
静态方式:由于PVC和PV之间的Selector无法满足互相绑定的条件导致。例如:PVC中Selector配置与PV中的不一致,StorageClass Name不一致、PV状态是Release等问题。
动态方式:由于csi-provisioner组件的某种原因未能挂载NAS。
解决方案:
静态方式:请检查相关的YAML书写是否正确。更多信息,请参见通过kubectl命令行方式使用NAS静态存储卷。
说明若PV的状态是Release,则该PV无法被复用,需要将PV中的Service取出,重新创建PV。
动态方式:通过命令
kubectl describe pvc <pvc-name> -n <namespace>
查看PVC的Event。
OSS异常问题排查
节点挂载OSS时,PV中需要填写相应的AK/SK信息,可通过Secret方式使用AK/SK。
跨地域使用OSS,需要将Bucket URL改成公网地址,同一地域建议使用内网地址。
Pod的状态为非Running
问题现象:
PVC为Bound状态,Pod状态为非Running。
问题原因:
挂载NAS时使用了
fsGroups
,文件较多,导致chmod速度较慢。跨地域使用了内网地址,导致无法连接到Bucket Endpoint。
解决方案:
确认是否有
fsGroups
设置,如果有,将其去掉后,重启Pod,尝试重新挂载。确认是否为跨地域且通过内网访问Bucket,如果是,请使用公网地址访问Bucket。
其他问题,通过命令
kubectl describe pods <pod-name>
查看Pod的Event。
PVC的状态为非Bound
问题现象:
PVC为非Bound状态,Pod为非Running状态。
静态方式:由于PVC和PV之间的Selector无法满足互相绑定的条件导致。例如:PVC中Selector配置与PV中的不一致,StorageClass Name不一致、PV状态是Release等问题。
动态方式:由于csi-provisioner组件的某种原因未能挂载OSS。
解决方案:
静态方式:请检查相关的YAML书写是否正确。更多信息,请参见通过kubectl命令行的方式使用OSS静态存储卷。
说明若PV的状态是Release,则该PV无法被复用,需要将PV中的Bucket地址取出重新创建PV。
动态方式:通过命令
kubectl describe pvc <pvc-name> -n <namespace>
查看PVC的Event。