本文为您介绍存储常见问题的分析流程,云盘存储卷与NAS存储卷常见问题的处理方法。
类型 |
问题 |
常见问题分析流程 |
|
云盘存储卷常见问题 |
云盘创建常见问题 云盘挂载常见问题
云盘卸载常见问题 云盘扩容常见问题 云盘使用常见问题 |
NAS存储卷常见问题 |
|
OSS存储卷常见问题 |
OSS挂载问题 OSS使用问题 控制台检测失败问题 |
存储组件常见问题 |
|
云原生常见问题 |
|
Flexvolume迁移CSI常见问题 |
|
其他存储问题 |
常见问题分析流程
通过以下操作查看对应存储插件的日志文件,明确问题现象。
-
执行以下命令,查看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"
-
执行以下命令,查看集群是否部署了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
-
-
查看使用的数据卷模板是否和集群存储插件(Flexvolume或CSI)的模板匹配。
若在此集群中初次使用数据卷,请检查您的PV对象及StorageClass对象中定义的Driver名称属于CSI还是Flexvolume。Driver名称必须与当前集群部署的插件类型一致。
-
查询存储插件是否为最新版本。
-
执行以下命令,查询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 。
-
-
查看日志。
-
若云盘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组件升级失败
问题现象
-
csi-provisioner组件前置检查失败,报错集群节点数量不符合要求。
-
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大小,具体操作如下。
-
登录 容器服务管理控制台 ,在左侧导航栏选择 集群 。
-
在 集群列表 页面,单击目标集群名称,然后在左侧导航栏,选择 。
-
在 组件管理 页面,找到并选中 csi-provisioner 组件,单击组件右下方的 图标,然后选择 查看YAML 。
-
根据集群规模修改组件的YAML文件,自行调整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
状态。
-
关于如何绑定NAS静态卷的具体操作,请参见 使用NAS静态存储卷 。
-
关于如何绑定OSS静态卷的具体操作,请参见 使用OSS静态存储卷 。
-
关于如何绑定云盘静态卷的具体操作,请参见 使用云盘静态存储卷 。
PV为Lost状态,无法通过重建PVC绑定
问题现象
PVC和PV创建后,PV处于 Lost 状态,且无法与PVC绑定。
问题原因
PV中
claimRef
引用的PVC名称不存在,导致PV状态为Lost。
解决方案
您需要删除当前PV中的
pv.spec.claimRef
字段,然后重新使用静态卷方式进行绑定。即可将PV变为
Bound
状态。
-
关于如何绑定NAS静态卷的具体操作,请参见 使用NAS静态存储卷 。
-
关于如何绑定OSS静态卷的具体操作,请参见 使用OSS静态存储卷 。
-
关于如何绑定云盘静态卷的具体操作,请参见 使用云盘静态存储卷 。
Flexvolume迁移CSI常见问题
容器服务ACK早期的存储插件为Flexvolume,随着Kubernetes版本的迭代,Flexvolume已经处于 已废弃 的状态。您的ACK集群如果是早期的版本(版本小于1.18),建议您将Flexvolume插件迁移为CSI插件。关于迁移的具体操作,请参见 Flexvolume迁移至CSI 。
其他存储类问题
当您遇到 mountOption 拼写有误、PVC引用的StorageClass未创建、未创建挂载点域名等存储类问题时,建议您优先使用CNFS作为容器存储卷,可以避免此类问题。关于CNFS更多内容,请参见 容器网络文件系统CNFS概述 。
容器多个应用是否可以使用同一个存储卷?
-
云盘:不支持
云盘为阿里云存储团队提供的非共享存储,只能同时被一个Pod挂载,不支持多个应用使用。
-
NAS、OSS:支持
NAS、OSS为共享存储,可以同时为多个Pod提供共享存储服务,即一个PVC可以同时被多个应用使用。关于NAS并发写入的一些限制条件,请参见 如何避免多进程或多客户端并发写同一日志文件可能出现的异常? 和 如何解决向NFS文件系统中写入数据延迟问题?
-
关于如何挂载NAS存储卷,请参见 创建CNFS管理NAS文件系统(推荐) 、 使用NAS静态存储卷 、 使用NAS动态存储卷 。
-
关于如何挂载OSS存储卷,请参见 使用OSS静态存储卷 ;通过CNFS实现OSS动态存储卷挂载的具体操作,请参见 对OSS生命周期管理 。
-
如何更改云盘默认创建的StorageClass的配置?
默认创建的StorageClass不支持更改。
csi-provisioner组件安装后,集群内会默认创建alicloud-disk-topology-alltype等StorageClass,请勿修改这些默认生成的存储类。关于云盘StorageClass的更多信息,请参见 存储类(StorageClass) 。如果您需要调整StorageClass的配置,例如存储卷类型、性能、回收策略等,您可以创建新的StorageClass(StorageClass数量不受限制)。具体操作,请参见 创建StorageClass 。