更新时间:2024-11-13 GMT+08:00

工作负载异常:添加存储失败

问题现象

实例一直处于创建中,事件中存在“添加存储失败”的告警,事件信息如下所示:

AttachVolume.Attach failed for volume "pvc-***" : rpc error: code = Internal desc = [***][disk.csi.everest.io] attaching volume *** to node *** failed: failed to send request of attaching disk(id=***) to node(id=***): error statuscode 400 for posting request, response is {"badRequest": {"message": "Maximum number of scsi disk exceeded", "code": 400}}, request is {"volumeAttachment":{"volumeId":"***","device":"","id":"","serverId":"","bus":"","pciAddress":"","VolumeWwn":"","VolumeMultiAttach":false,"VolumeMetadata":null}}, url is: ......

问题原因

该告警事件说明节点上绑定的云硬盘已达上限,挂载云硬盘的工作负载实例调度到该节点后,无法继续挂载云硬盘,导致工作负载无法正常运行。

例如,假设节点可挂载的云硬盘上限为20,除去节点上已挂载的1块系统盘和1块数据盘后,节点剩余可挂载的云硬盘数量为18块。若该节点通过ECS控制台自定义挂载了2块裸盘用于创建本地存储池,则实际上仅能挂载16块数据盘。该场景下,如果该节点上调度18个挂载1块云硬盘的工作负载实例,就会出现2个工作负载实例由于节点上无法再挂载云硬盘,出现以上错误。

解决方案

当CCE 容器存储 (Everest)插件版本为2.3.11及以上时,插件提供number_of_reserved_disks参数,该参数可以设置节点上预留的挂盘数,预留出部分盘位供用户自定义挂载云硬盘使用。注意,修改该参数将对集群中所有节点生效。

设置number_of_reserved_disks参数后,节点剩余可挂载的云硬盘数量计算如下:

节点剩余挂盘数 = 节点可挂载的云硬盘上限值 - number_of_reserved_disks

例如,假设节点可挂载的云硬盘上限为20,设置number_of_reserved_disks参数为6,则在调度挂载云硬盘的工作负载时,实际上节点可挂载的云硬盘为20-6=14。预留的6个挂盘数中,除去节点上已挂载的1块系统盘和1块数据盘后,还可以自定义挂载4块云硬盘,可以作为额外的数据盘或者作为裸盘用于创建本地存储池。该场景下,如果集群中需要调度18个挂载1块云硬盘的工作负载实例,则该节点最多可调度14个实例,剩余4个工作负载实例会调度到其他节点,不会出现节点存储无法挂载的情况。