秒级启动万个容器,如何实现容器镜像的“加速冲刺”?

发布于:2020 年 1 月 15 日 15:03

秒级启动万个容器,如何实现容器镜像的“加速冲刺”?

作者:袁逸凡、木环、陈显鹭

年关将至,各种年货节、秒杀商品、倒计时直播也会纷至沓来。这些业务的共同点都是流量瞬间暴增,运维部必须快速筹备大量的服务器,并在极短时间内扩容容器承接线上流量,避免系统崩溃。除了需要集群节点的快速扩容,也对应用部署速度提出更高要求。

部署启动快,常被认为是容器的核心优势之一。但是果真如此吗?本地镜像实例化成容器的时间很短,即“热启动”;而在本地无镜像情况下的“冷启动”,需要先从镜像仓库下载镜像并解压缩后才能拉起容器,受网络和磁盘性能影响较大,耗时数分钟;大规模批量冷启动甚至可能导致 Registry 因网络拥堵而无法响应。

针对冷启动的痛点,阿里云容器与存储两个团队展开合作,研发出一个全新存储引擎 DADI 加速器,将容器冷启动耗时缩短至数秒。方案沉淀自阿里集团内部大规模应用的数据访问加速经验,曾在双十一大促中为大规模容器集群扩容提供了秒级拉起能力。最终利用 DADI 加速器支持镜像按需读取和 P2P 分发,实现 3.01 秒启动 10000 个容器,完美杜绝容器冷启动的数分钟漫长等待,以及镜像仓库大规模并行分发场景下的网络拥堵。

本文将重现加速测试场景以及镜像加速的几个关键点。测试是在 1000 台 4 核 8G 的节点组成的 Kubernetes 集群中进行,阿里云容器服务 Kubernetes (ACK) 能在极短时间内扩容出 1000 台节点 worker 并加入到 Kubernetes 集群中。ACK 的此能力在应对大促,秒杀,短时流量洪峰时具有亮眼的表现。

同时针对本次测试场景,利用 Kubernetes 强大的扩展性和自定义控制器,加快在大规模集群中创建应用和删除应用的速度,保障了测试在极短时间内方便快捷的进行。

阿里云容器团队联合存储团队研发的 DADI 加速器在本次测试中启动 10000 个容器仅需 3.01 秒,10 秒内启动了近 60000 个容器。

秒级启动万个容器,如何实现容器镜像的“加速冲刺”?

Figure 1 - 1 万个容器的启动耗时为 3.01 秒,其中 p999 分位耗时 2.97 秒。

同时针对 1 万个容器的冷热启动进行对比,即在本地有无镜像缓存对启动时间的影响,热启动耗时 2.91 秒,其中 p999 耗时 2.56 秒

秒级启动万个容器,如何实现容器镜像的“加速冲刺”?

Figure 2 - 1 万个容器的冷热启动耗时对比

DADI 冷启动由于数据按需从 P2P 网络中获取,减轻了磁盘压力避免发生 IO 拥堵,因此长尾容器较少。

此外,还进行了限时摸高测试。在 10 秒的限制时间内利用 1000 台宿主机启动了 59997 个容器,在 10.06 秒时第 6 万容器启动完毕:

秒级启动万个容器,如何实现容器镜像的“加速冲刺”?

Figure 3 - 限时 10 秒摸高测试

冷启动的关键优化,DADI 大地加速器

注:上述图示数据,均在阿里云容器团队的容器服务 ACK 中进行。为方便获得每个容器的启动时间,采用 C/S 模式:worker 中每个容器拉起后向测试的 httpServer 上报自己状态,以 httpServer 记录的请求时间作为容器启动耗时。

一般而言,完整的容器应用镜像往往有数百 M 甚至上 G 的大小。在社区的容器 Registry 的实现中,镜像会以分层方式存储,每一层都是一个 tgz 包。当容器启动时, 容器引擎会从容器 Registry 拉取所有的层,在本地实现解压后,通过层次化文件系统构建完整的容器 rootfs。而容器启动过程中所需要的数据可能只占镜像文件中极小一部分比例。本次测试所用镜像完整大小为 894M,容器启动所需数据仅 15M,占比约 1.6%。如何能避免下载完整镜像到本地而直接获取到这 1.6% 启动数据是加速容器启动的关键。

为何 DADI 加速器能为大规模容器集群扩容提供秒级拉起的能力?其核心在于“按需读取”容器运行时所需数据,避免传统容器 “下载镜像–> 解压镜像–> 启动容器”的启动步骤,容器启动耗时从分钟缩短至数秒。这其中包括以下三点优化工作:

  • 镜像格式优化:为了避免下载 + 解压造成的高时延,DADI 团队设计了一种新的镜像格式,内含索引,无需下载和解压完整镜像即可直接访问;
  • 按需 P2P 数据读取:为减轻批量扩容时对单点 Registry 带来的总体负载,DADI 利用树形 P2P 网络对进行数据分发。即少数 P2P 根节点从 Registry 获取,其他节点(宿主机)之间可相互传输数据,批量扩容时可快速分发数据到所有节点;
  • 高效的解压缩算法:DADI 提供了一种新型的压缩文件格式,可按需单独解压用户访实际问的数据,且解压时间开销可忽略不计。

秒级启动万个容器,如何实现容器镜像的“加速冲刺”?

Figure 4 - 容器启动流程对比

利用 DADI 方案启动容器时,仅从镜像 Registry 下载几 KB 的镜像元数据,并创建虚拟设备 Overlay Block Device 挂载到容器工作目录上, Docker 引擎会认为镜像已经加载完毕。在容器启动时所需的镜像数据则从本地缓存或者 P2P 网络的上游节点按需下载。P2P 网络可以充分缓解对 Registry 的访问压力。

秒级启动万个容器,如何实现容器镜像的“加速冲刺”?

Figure 5 – DADI P2P 数据分发

随着 Kubernetes 被越来越广泛地接受,阿里云容器服务 ACK 有幸支撑了很多企业级客户,此次 ACK 和 DADI 的深度整合,实现秒级启动万个容器,从容应对大规模应用扩容和发布,相关技术在未来也将成为 Serverless 容器的启动加速利器。

阅读数:2741 发布于:2020 年 1 月 15 日 15:03

评论

发布
暂无评论