全部产品
Search
文档中心

容器服务 Kubernetes 版 ACK:存储异常问题排查

更新时间:Jul 12, 2023

本文介绍关于存储相关异常问题诊断流程和排查思路。

诊断流程

流程
  1. 执行以下命令,查看Pod事件,确认Pod无法启动是由存储问题导致。

    kubectl describe pods <pod-name>

    若查看Pod处于下图所示的状态,说明Pod使用的存储都已成功挂载到Pod上。此时Pod没启动(比如:CrashLoopBackOff)不属于存储问题,请提交工单处理。pod

  2. 执行以下命令,查看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。

  3. 执行以下命令,查询CSI存储插件是否为最新版本。

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

    预期输出:

    image: registry.cn-****.aliyuncs.com/acs/csi-plugin:v*****-aliyun

    存储插件最新版本信息,请参见csi-plugincsi-provisioner,若您集群中存储插件不是最新版本,请升级CSI插件。具体操作,请参见管理组件。其他存储组件升级失败问题排查,请参见组件升级失败问题排查

  4. 排查Pod Pending问题。

  5. 排查PVC处于非Bound问题。

  6. 如果排查后问题仍未解决,请提交工单处理。

组件升级失败问题排查

若组件升级失败,请参考以下操作,进行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。

  • 可能是ECS OpenAPI创建云盘时出现了问题,请参见ECS错误中心进行排查。如果排查失败,请提交工单处理。

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。