添加链接
link管理
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接
相关文章推荐
腼腆的黑框眼镜  ·  Page Verification·  5 月前    · 
很拉风的荒野  ·  辽宁日报·  10 月前    · 
活泼的蚂蚁  ·  《1921》影评 - 知乎·  1 年前    · 

本文为您介绍存储常见问题的分析流程,云盘存储卷与NAS存储卷常见问题的处理方法。

类型

问题

常见问题分析流程

常见问题分析流程

云盘存储卷常见问题

云盘创建常见问题

云盘挂载常见问题

云盘卸载常见问题

云盘扩容常见问题

动态扩容云盘失败,PVC Event提示Waiting for user to (re-)start a pod to finish file system resize of volume on node

云盘使用常见问题

应用在读写云盘挂载目录时提示input/output error

NAS存储卷常见问题

OSS存储卷常见问题

OSS挂载问题

OSS使用问题

控制台检测失败问题

存储组件常见问题

云原生常见问题

Flexvolume迁移CSI常见问题

Flexvolume迁移CSI常见问题

其他存储问题

常见问题分析流程

通过以下操作查看对应存储插件的日志文件,明确问题现象。

  1. 执行以下命令,查看PVC或Pod上是否有明显的Event。

    kubectl get events

    预期输出:

    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"
  2. 执行以下命令,查看集群是否部署了Flexvolume或CSI存储插件。

    • 执行以下命令,查看集群是否部署了Flexvolume存储插件。

      kubectl get pod -n kube-system |grep flexvolume

      预期输出:

      NAME                      READY   STATUS             RESTARTS   AGE
      flexvolume-***            4/4     Running            0          23d
    • 执行以下命令,查看集群是否部署了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
  3. 查看使用的数据卷模板是否和集群存储插件(Flexvolume或CSI)的模板匹配。

    若在此集群中初次使用数据卷,请检查您的PV对象及StorageClass对象中定义的Driver名称属于CSI还是Flexvolume。Driver名称必须与当前集群部署的插件类型一致。

  4. 查询存储插件是否为最新版本。

    • 执行以下命令,查询Flexvolume插件的镜像版本。

      kubectl get ds flexvolume -n kube-system -oyaml | grep image

      预期输出:

      image: registry.cn-hangzhou.aliyuncs.com/acs/Flexvolume:v1.14.8.109-649dc5a-aliyun

      关于Flexvolume插件信息,请参见 Flexvolume(已弃用)

    • 执行以下命令,查询CSI插件的镜像版本。

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

      预期输出:

      image: registry.cn-hangzhou.aliyuncs.com/acs/csi-plugin:v1.18.8.45-1c5d2cd1-aliyun

      关于CSI插件信息,请参见 csi-plugin csi-provisioner

  5. 查看日志。

    • 若云盘PVC处于 Pending 状态,无法成功创建PV,则需要查看Provisioner日志。

      • 若集群部署了Flexvolume插件,则执行以下命令查询alicloud-disk-controller日志。

        podid=`kubectl get pod -nkube-system | grep alicloud-disk-controller | awk '{print $1}'`
        kubectl logs <PodID> -n kube-system
      • 若集群部署了CSI插件,则执行以下命令查询csi-provisioner日志。

        podid=`kubectl get pod -n kube-system | grep csi-provisioner | awk '{print $1}'`
        kubectl logs <PodID> -n kube-system -c csi-provisioner
        说明

        csi-provisioner的容器组数量为2,上述 kubectl get pod -nkube-system | grep csi-provisioner | awk '{print $1}' 命令操作会输出2个 podid ,请分别执行 kubectl logs <PodID> -nkube-system -c csi-provisioner 命令。

    • 若Pod启动时挂载报错,则需要查看Flexvolume或csi-plugin日志。

      • 若集群部署了Flexvolume插件,则执行以下命令查询Flexvolume日志。

        kubectl get pod <pod-name> -owide

        登录Pod所在节点,在 /var/log/alicloud/flexvolume_**.log 查看Flexvolume日志。

      • 若集群部署了CSI插件,则执行以下命令查询csi-plugin日志。

        nodeID=`kubectl get pod <pod-name> -owide | awk 'NR>1 {print $7}'`
        podID=`kubectl get pods -nkube-system -owide -lapp=csi-plugin | grep $nodeID|awk '{print $1}'`
        kubectl logs <PodID> -nkube-system
    • 查看Kubelet日志。

      执行以下命令,获取Pod所在节点。

      kubectl get pod <pod-name> -owide | awk 'NR>1 {print $7}'

      登录到该节点上查看 /var/log/message 日志文件。

快速恢复

众多Pod挂载不上数据卷场景的问题,可以通过将Pod调度到其他节点快速恢复。具体操作,请参见 调度应用至指定节点

csi-plugin组件升级失败

由于csi-plugin是Daemonset组件,如果当前集群存在 NotReady 或者其他非 Running 状态的节点,就会导致升级失败。您需要手动处理故障节点,然后重新升级。具体操作,请参见 管理CSI组件

CSI组件启动失败

问题现象

csi-provisioner、csi-plugin组件启动失败,csi-plugin、csi-provisioner的main container日志报错 403 - Forbidden

问题原因

由于节点上metadata server开启了安全加固,CSI暂不支持安全加固功能,导致无法访问元信息。

解决方案

提交工单 咨询ECS团队,关闭节点的元数据安全加固。

集群节点数量不符合要求导致csi-provisioner组件升级失败

问题现象

  1. csi-provisioner组件前置检查失败,报错集群节点数量不符合要求。

  2. csi-provisioner前置检查成功,升级成功。但是查看csi-provisioner Pod crash,发现日志中出现类似下方 403 Forbidden 的日志。

    time="2023-08-05T13:54:00+08:00" level=info msg="Use node id : <?xml version=\"1.0\" encoding=\"iso-8859-1\"?>\n<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\"\n         \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\" xml:lang=\"en\" lang=\"en\">\n <head>\n  <title>403 - Forbidden</title>\n </head>\n <body>\n  <h1>403 - Forbidden</h1>\n </body>\n</html>\n"

问题原因

现象1原因

csi-provisioner为了保证高可用,它包含主从Pod,并且主从Pod必须在不同的节点上。如果当前集群只有1个节点,会导致该组件升级失败。

现象2原因

csi-provisioner所在节点开启了安全加固模式,该模式禁止了节点上metadata server的访问,导致此报错信息。

解决方案

现象1解决方案

您需要更新csi-provisioner组件。具体操作,请参见 管理CSI组件

现象2解决方案

关闭节点上的安全加固模式,CSI必须要访问到节点的元数据。

StorageClass属性变更导致csi-provisioner组件升级失败

问题现象

csi-provisioner组件前置检查失败,报错StorageClass属性不符合预期。

问题原因

默认StorageClass的属性被变更过,您删除重建过同名的StorageClass。StorageClass属性都是不可变的,否则会导致该组件升级失败。

解决方案

您需要删除集群中默认的StorageClass,包括alicloud-disk-essd,alicloud-disk-available,alicloud-disk-efficiency,alicloud-disk-ssd,alicloud-disk-topology,删除过程不会对现有应用造成任何影响。删除后,请尝试重新安装csi-provisioner组件。安装后,系统会自动重新创建StorageClass,无需您额外处理。

重要

如果您需要自定义的StorageClass,请创建新的StorageClass名称使用,请勿修改默认的StorageClass。

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

若存储的PVC、PV的YAML文件不发生改变,StorageClass的变更不会对现有存储产生影响。例如,修改 StorageClass中的 ALLOWVOLUMEEXPANSION 字段时,仅修改PVC的Capacity后才会生效, 如果PVC的YAML文件不变,此字段不会影响现有配置。

csi-provisioner组件日志出现 failed to renew lease xxx timed out waiting for the condition 报错

问题现象

通过 kubectl logs csi-provisioner-xxxx -nkube-system 命令查看CSI日志,发现 failed to renew lease xxx timed out waiting for the condition 报错。

问题原因

csi-provisioner是高可用多副本组件,多Pod组件之间需通过K8s Lease选主,选主过程中需要访问APIServer来获取指定的Lease,获取到Lease的组件就称为leader,为集群提供服务。当前报错由于csi-provisioner访问集群内的APIServer失败导致。

解决方案

请排查集群网络和APIserver状态是否正常。如无法解决,请 提交工单 处理。

存储组件导致的OOM问题

csi-provisioner是中心化的存储组件,Sidecar主要是缓存Pod、PV、PVC等信息,随着集群规模增加,会造成内存OOM。当发生OOM时,您需要根据集群规模自行调整Limit大小,具体操作如下。

  1. 登录 容器服务管理控制台 ,在左侧导航栏选择 集群

  2. 集群列表 页面,单击目标集群名称,然后在左侧导航栏,选择 运维管理 > 组件管理

  3. 组件管理 页面,找到并选中 csi-provisioner 组件,单击组件右下方的 图标 图标,然后选择 查看YAML

  4. 根据集群规模修改组件的YAML文件,自行调整Limit大小。

    修改limit大小

创建或挂载存储卷时,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已经处于 已废弃 的状态。如果您的ACK集群是早期的版本(版本小于1.18),建议您将Flexvolume插件迁移为CSI插件。关于迁移的具体操作,请参见 Flexvolume迁移至CSI

csi-plugin的Pod监控上出现大量流量

问题现象

在集群Pod监控上,csi-plugin的Pod出现大量流量。

问题原因

csi-plugin负责当前节点上NAS存储卷的挂载。由于NAS走的是网络流量,当节点存在NAS挂载点(即存在使用NAS的Pod)时,Pod发起的NAS请求流量就会经过csi-plugin的Namespace,从而被集群监控记录。造成csi-plugin出现大量网络流量。

解决方案

此种情况无需解决。因为流量只是被记录,并不会翻倍,也不会额外占用网络带宽,所以可以忽略。

Pod的Event提示 0/x nodes are available: x pod has unbound immediate PersistentVolumeClaims

问题现象

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,您需要检查当前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 状态。

Flexvolume迁移CSI常见问题

容器服务ACK早期的存储插件为Flexvolume,随着Kubernetes版本的迭代,Flexvolume已经处于 已废弃 的状态。您的ACK集群如果是早期的版本(版本小于1.18),建议您将Flexvolume插件迁移为CSI插件。关于迁移的具体操作,请参见 Flexvolume迁移至CSI

其他存储类问题

当您遇到 mountOption 拼写有误、PVC引用的StorageClass未创建、未创建挂载点域名等存储类问题时,建议您优先使用CNFS作为容器存储卷,可以避免此类问题。关于CNFS更多内容,请参见 容器网络文件系统CNFS概述

容器多个应用是否可以使用同一个存储卷?

如何更改云盘默认创建的StorageClass的配置?

默认创建的StorageClass不支持更改。

csi-provisioner组件安装后,集群内会默认创建alicloud-disk-topology-alltype等StorageClass,请勿修改这些默认生成的存储类。关于云盘StorageClass的更多信息,请参见 存储类(StorageClass) 。如果您需要调整StorageClass的配置,例如存储卷类型、性能、回收策略等,您可以创建新的StorageClass(StorageClass数量不受限制)。具体操作,请参见 创建StorageClass