在高密度部署有状态业务(例如数据库)或大量短生命周期的容器(例如持续集成、批处理)等场景中,每个Pod都需要大量的云盘来存储数据,Pod的数量非常多,如果这些Pod同时被调度到同一个节点上,默认使用的串行挂载会导致Pod启动时间显著增加,您可以开启云盘并行挂载功能来解决此类问题。
前提条件
- ACK托管集群为1.26及以上版本,且csi-plugin和csi-provisioner组件版本为1.30.4及以上。 
- 已安装配置阿里云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