在高密度部署有状态业务(例如数据库)或大量短生命周期的容器(例如持续集成、批处理)等场景中,每个Pod都需要大量的云盘来存储数据,Pod的数量非常多,如果这些Pod同时被调度到同一个节点上,默认使用的串行挂载会导致Pod启动时间显著增加,您可以开启云盘并行挂载功能来解决此类问题。
前提条件
已创建ACK托管集群,集群为1.26及以上版本,且csi-plugin和csi-provisioner组件版本为1.30.4及以上,请参见csi-plugin、csi-provisioner。
已安装配置阿里云CLI,请参见安装阿里云CLI。
注意事项
仅支持拥有磁盘序列号的云盘开启并行挂载功能。关于如何查看磁盘序列号,请详见查看块存储序列号。
2020年06月10日之前创建的云盘没有可识别的序列号信息,无法开启,因为该类云盘会导致无法正常挂载。
多个云盘从同一个节点上卸载时仍然是串行的。
开启并行挂载后,ECS DescribeDisks等OpenAPI返回的
Device
字段,以及控制台上显示的挂载点可能会不可靠,请避免在业务中使用该挂载路径,您可以通过云盘的序列号确认实际路径。
开启步骤
您可以通过自动化脚本或手工配置开启云盘并行挂载功能。
自动化脚本配置
将以下脚本保存为enable_parallel_attach.sh文件。
执行脚本并行挂载云盘。
bash enable_parallel_attach.sh <集群ID>
手工配置
新增集群节点池配置中的ECS 标签,使其键为
supportConcurrencyAttach
,值为true
,确保新创建的ECS实例有该标签。登录容器服务管理控制台,在左侧导航栏选择集群列表。
在集群列表页面,单击目标集群名称,然后在左侧导航栏,选择 。
在节点池列表页面,单击目标节点池所在行操作列的编辑。
在编辑节点池页面最下方的高级选项区域,增加ECS 标签,其键为
supportConcurrencyAttach
,值为true
。
为集群中所有存量节点的ECS实例添加标签,使其键为
supportConcurrencyAttach
,值为true
。具体操作,请参见创建并绑定自定义标签。在左侧导航栏选择运维管理 > 组件管理,单击存储页签,定位csi-provisioner组件,单击组件右下方的配置,将FeatureGate设置为
DiskADController=true,DiskParallelAttach=true
。说明DiskADController=true
设置后,云盘相关attach
和detach
的操作交由csi-provisioner;DiskParallelAttach=true
设置后,将开启云盘并行挂载功能。待csi-provisioner配置完成后,将csi-plugin组件的FeatureGate设置为
DiskADController=true
。
验证云盘并行挂载性能
本示例将在同一节点上创建大量挂载云盘的Pod,以验证开启并行挂载对Pod启动速度的提升。
本文中提供的测试数据仅为理论值(参考值),实际数据以您的操作环境为准。
在ACK集群中,添加一个支持多个云盘挂载的节点。例如,ecs.g7se.16xlarge类型的实例最多可挂载56块云盘。
使用以下内容,创建测试应用attach-stress.yaml文件,并将
<YOUR-HOSTNAME>
替换为实际的节点名称。执行以下命令,确认应用正常启动,然后将副本数量缩容到0,以准备后续的批量挂载测试。
kubectl apply -f attach-stress.yaml kubectl rollout status sts attach-stress kubectl scale sts attach-stress --replicas 0
预期输出:
storageclass.storage.k8s.io/alibabacloud-disk created statefulset.apps/attach-stress created partitioned roll out complete: 1 new pods have been updated... statefulset.apps/attach-stress scaled
执行以下命令,开始批量挂载测试,并统计Pod启动所需的时间。
说明此时该集群尚未开启并行挂载功能,请根据您的节点最大支持的云盘数量调整测试的副本数。
date && \ kubectl scale sts attach-stress --replicas 28 && \ kubectl rollout status sts attach-stress && \ date
预期输出:
2024年10月15日 星期二 19时21分36秒 CST statefulset.apps/attach-stress scaled Waiting for 28 pods to be ready... Waiting for 27 pods to be ready... <省略……> Waiting for 3 pods to be ready... Waiting for 2 pods to be ready... Waiting for 1 pods to be ready... partitioned roll out complete: 28 new pods have been updated... 2024年10月15日 星期二 19时24分55秒 CST
输出表明,在未开启并行挂载时,28个Pod全部启动耗时超过3分钟。
参考上文开启步骤开启该集群的并行挂载功能。
执行以下命令,清理之前创建的Pod,准备下一轮测试。
说明清理时,观察集群中相关的
volumeattachments
资源,等待它们被删除后即可完成云盘的卸载,过程大约需要几分钟。kubectl scale sts attach-stress --replicas 0
再次执行以下测试命令,统计开启并行挂载后Pod启动所需的时间,预期仅需要约40秒,较未开启时的3分钟,有明显提升。
date && \ kubectl scale sts attach-stress --replicas 28 && \ kubectl rollout status sts attach-stress && \ date
预期输出:
2024年10月15日 星期二 20时02分54秒 CST statefulset.apps/attach-stress scaled Waiting for 28 pods to be ready... Waiting for 27 pods to be ready... <省略……> Waiting for 3 pods to be ready... Waiting for 2 pods to be ready... Waiting for 1 pods to be ready... partitioned roll out complete: 28 new pods have been updated... 2024年10月15日 星期二 20时03分31秒 CST
执行以下命令,清理集群中的测试应用。
kubectl delete -f attach-stress.yaml