1、背景和动机
随着云原生(Cloud Native)被工业界广泛接受,容器(container)在数据中心被广泛部署,其地位正在逐步取代传统的虚拟机(Virtual Machine)。当然目前依然存在用轻量虚拟机来运行和部署容器,比如使用Kata Containers。简单来讲, 容器化是将程序的代码以及相关的软件库(包括对操作系统依赖库等)打包在一起, 创建可在任意基础架构上一直运行的轻量级执行文件(容器)。容器通常以镜像(image)的形式进行发布,一般用户可以直接通过一些轻量级容器运行工具,比如containerd,docker等进行运行。更高级一些,用户可以通过K8S (Kubernetes)这样的开源系统,进行容器的自动部署,扩展和管理。
随着容器技术的广泛普及,用户对容器技术的优化需求也越来越高。比如大规模部署容器的时候,客户希望能够在非常短的时间内启动容器。举个实际的应用场景,FaaS (Function as a service)目前也会采用容器的方式进行部署和扩展。一般来讲,如果使用容器来部署FaaS,可以采用以下的几个步骤:
根据用户的需求,将所要执行的函数,进行编译生成二进制文件,将可执行二进制文件与所需的库打包到文件系统,并且生成相应的镜像。
镜像被调度到某个节点, 尽快准备好容器执行环境,包括将container的镜像解包到文件系统中。
启动容器(包括计算,网络环境以及文件系统),然后在选定的容器中执行 FaaS 应用程序。
对于FaaS这样的程序,快速启动在计算以及网络方面都有相应的优化方案,在这篇文章中不再赘述。但是对于容器镜像的下载以及容器文件系统的构建,是我们今天讨论的重点。本文提出DPU (Data Processing Unit)/ IPU (Infrastructure processing Unit) 可以对容器的镜像以及文件系统的构建进行相应的卸载(offloading) 。//由于DPU 和IPU 是类似概念,文中后续内容主要采用IPU 这个说法。
2、解决方案
正常的容器启动,首先需要下载容器(container)的镜像(image),然后把下载来的容器的镜像层进行解压(unpack)操作,接着选择容器的一个Runtime time进行启动。当然目前也有一些工作,是在容器生命管理周期软件(诸如containerd)中采用特定snapshot实现,从而在容器启动后可以按需获取解压后的镜像内容。我们在2023年SDC会议上的议题 [1] 提出可以使用IPU进行容器启动前镜像的准备工作,包括镜像的管理以及unpack操作。那么容器的镜像将完全放入IPU,而不用存放在主机中。具体的做法:
容器的管理软件需要和IPU进行通信,即让IPU 完成整个容器镜像的准备工作;
接着IPU 通知主机中的管