OceanBase 开发者大会来啦!一起围观数据库前沿趋势!报名戳 了解详情
写点什么

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

  • 2020-01-15
  • 本文字数:1925 字

    阅读完需:约 6 分钟

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

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


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


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


2020-01-15 15:034193

评论

发布
暂无评论
发现更多内容

ARTS Week9

丽子

ARTS 打卡计划

ARTS打卡 第14周

引花眠

微服务 ARTS 打卡计划

Go: ElasticSearch客户端学习

陈思敏捷

elasticsearch elastic go-elasticsearch Go 语言

Android | dagger细枝篇

哈利迪

android

你真的懂 Java 的 main 方法吗

Rayjun

Java

ARTS Week14

时之虫

ARTS 打卡计划

Ray 分布式计算框架详解

lipi

分布式 数据湖 pandas Apache Arrow

linux入门系列20--Web服务之LNMP架构实战

黑马腾云

php MySQL Linux centos ngnix

打通微信和钉钉服务是一种怎样的体验?

Ceelog

微信 钉钉 微信公众号 Go 语言

巧用HashMap一行代码统计单词出现次数

程序那些事

jdk hashmap 统计字数

架构师训练营第十二周作业

张明森

视频AI第一步-动作识别数据集

flow

Python作业留底--《菜鸟教程》Python 练习和习题

Geek_f6bfca

Flink-有状态算子的扩缩容-12

小知识点

scala 大数据 flink

基于区块链的社会治理探索

CECBC

区块链 大数据 信息技术

更新丢失、写偏、幻读:数据库事务从快照隔离到可序列化

青菜年糕汤

数据库 数据库事务 分布式数据库 数据库设计 分布式系统

比特币挖矿到底挖的是什么?

CECBC

比特币 区块链 数字货币

二叉树深度和大文件排序

escray

学习 面试

算法导论

thuni

算法

架构师第十二周作业

傻傻的帅

SpringBoot+Tess4j实现牛逼的OCR识别工具

小隐乐乐

程序的机器级表示-控制

引花眠

计算机基础

什么是分散式金融(DeFi)?

志学Python

去中心化金融 defi

架构师第十二周学习总结

傻傻的帅

JVM的早期优化与晚期优化

Edison

JVM JVM虚拟机原理

图解Node(上)——直击灵魂的十条拷问

执鸢者

大前端 原理 Node

【持续更新~】常遗忘却可以变更好的心态

01Running

个人成长

oeasy教您玩转linux010108到底哪个which

o

搬家,又一次和过往告别

王磊

程序人生

央行数字货币钱包上线后又秒关 兑换了的 DCEP 别担心

CECBC

数字货币 央行

LeetCode 5. Longest Palindromic Substring

liu_liu

算法 LeetCode

秒级启动万个容器,如何实现容器镜像的“加速冲刺”?_容器_阿里云容器平台_InfoQ精选文章