AWS开源Firecracker:面向无服务器计算的安全快速微虚拟机


虚拟化面临着一系列新挑战

时至今日,我们的客户可以利用无服务器计算来构建应用程序,而无需分神于基础设施的配置或者管理工作。开发人员可以利用AWS Fargate或者AWS Lambda的无服务器函数将其代码打包为无服务器容器。根据客户提供的反馈,他们非常喜爱无服务器技术带来的低资源消耗需求,而我们也坚信这种新的计算形式将继续在计算机的未来发展中发挥至关重要的作用。

随着我们的客户越来越多地采用无服务器服务,我们意识到现有虚拟化技术并不具备能够优化此类工作负载所固有的事件驱动以及时常出现的短暂属性。我们认为,有必要专门面向无服务器计算构建起新的虚拟化实现技术,从而在为基于硬件虚拟化的虚拟机提供安全边界的同时,继续保持较小的打包体积以及容器与函数的灵活性。

Firecracker技术

Firecracker正是为此而生,这是一种利用基于Linux内核虚拟机(简称KVM)打造而成的开源虚拟机监控器(简称VMM)。Firecracker允许用户创建出微虚拟机,简称microVM。Firecrakcer在设计当中奉行极简主义思维——即其中仅包含运行安全轻量级虚拟机所必需的内容。在设计过程中的各个环节,我们都对Firecracker进行了安全性、速度以及效率层面的整体优化。举例来说,我们只能启动相对较新的Linux内核,且仅可以利用某组特定配置选项对其进行编译(目前提供超过1000种内核编译配置选项)。此外,它并不支持任何类型的图形或者加速器,不支持硬件直通,也不支持(大部分)传统设备。

Firecracker启动的是最小内核配置,其不依赖于模拟BIOS,也不具备完整的设备模型。其中少数存在的设备就只有virtio net与virtio block,外加单键式键盘(由于没有电源管理设备,因此用户需要使用其中的复位功能)。这种最小设备模型不仅能够带来更快的启动时间(在默认大小的微虚拟机i3.metal上,启动时间低于125毫秒),还能够有效减少攻击面以显著提高安全性水平。感兴趣的朋友可以查阅与Firecracker技术承诺的更多详细信息,包括其如何为容器与无服务器工作负载的执行带来最低资源开销。

2017年秋季,我们决定使用Rust语言编写Firecracker——Rust是一种现代编程语言,能够有效保证线程与内存安全,同时防止可能引发各类安全漏洞的缓冲区溢出以及其它多种常见的内存安全错误。感兴趣的朋友可以参阅Firecracker设计当中与Firecracker VMM功能与架构特性相关的更多细节信息。

Firecracker微虚拟机提高了效率与资源利用率,其中每一套微虚拟机的内存开销低于5 MiB。这意味着您可以将数千套微虚拟机打包至同一台计算机之上。此外,您还可以利用进程内速率限制器以细粒度方式控制网络与存储资源的共享方式,甚至能够跨越数千套微虚拟机进行全面控制。如此一来,您将能够安全地超额预订一切硬件计算资源,从而最大程度提升可运行在主机当中的工作负载总量。

我们还为Firecracker开源项目整理出包含以下指导性原则的上手指南:
  • 内置安全保障:我们提供计算安全约束机制,其支持多租户工作负载且不会被客户错误地加以禁用。客户工作负载将被视为同时具备神圣(不可接触)及恶意(应加以戒备)两种属性。
  • 轻量级虚拟化:我们专注于长期或无状态类工作负载,而非长时间运行或持久性工作负载。Firecracker的硬件资源开销明确且经过大量事实的验证。
  • 功能极简主义:如果没有明确的需求,我们不会在任务当中构建额外的功能。我们针对每项功能保持着独立且唯一的实现方式。
  • 计算超额预订:Firecracker向客户公开的所有硬件计算资源,都可以安全地进行超额预订。


我们之所以要对这项基础技术加以开源,是因为我们相信我们承担着为无服务器计算构建下一代虚拟化方案的使命,而目前这项工作才刚刚迈出第一步。

Firecracker的使用方式

AWS Lambda利用Firecracker作为沙箱环境的配置与运行基础,而我们会在沙箱环境之上执行客户代码。由于Firecracker所配置的安全微虚拟机能够以最小体积实现快速配置,因此我们能够在不牺牲安全性水平的前提下带来出色性能。如此一来,我们将能够在物理硬件之上实现高资源利用率——包括对我们为Lambda分配及运行工作负载的具体方式进行优化,并根据活动/空闲时段以及内存利用率等因素对工作负载加以混合。

在此之前,Fargate Tasks包含一个或者多个运行于专用EC2虚拟机当中的Docker容器,旨在确保任务间相互隔离。这些任务现在可以在Firecracker微虚拟机上执行,这使得我们能够立足EC2裸机实例对Fargate运行时层进行更快、更高效地配置,同时在不影响任务内核级隔离能力的前提下提高工作负载密度。随着时间的推移,这还使我们得以继续在运行时层内实现创新,为我们的客户提供更好的性能表现,同时保持高安全性水平并降低运行无服务器容器架构的总体成本。

Firecracker目前运行在英特尔处理器之上,并将在2019年年内实现对AMD以及ARM处理器的支持。

您可以在AWS .metal实例上运行Firecracker,同时也可将其运行在任何其它裸机服务器之上,具体包括内部环境以及开发人员的笔记本电脑。

Firecracker还将启用目前极具人气的容器运行时(例如containerd)将容器作为微虚拟机进行管理。如此一来,用户的Docker与容器编排框架(例如Kubernetes)将能够使用Firecracker。我们已经构建起一套原型设计,使得containerd能够将容器作为Firecracker微虚拟机加以管理。我们也希望能够与社区一道进一步推动其广泛普及。

Firecracker上手指南

Firecracker上手指南当中提供有关如何下载Firecracker二进制文件、使用不同选项启动Firecracker、从头开始进行构建以及运行集成测试的大量详细说明。您也可以使用Firecracker Jailer在生产环境当中运行Firecracker。

下面,让我们一起来看如何在AWS云上使用Firecracker(以下步骤亦适用于任何裸机设备):

创建一个使用Ubuntu 18.04.1版本的i3.metal实例。

Firecracke以KVM为构建基础,且需要面向/dev/kvm进行读取/写入访问。通过终端登录至该主机,而后设置此访问:
sudo chmod 777 /dev/kvm

下载并启动Firecracker二进制文件:
curl -L https://github.com/firecracker-microvm/firecracker/releases/download/v0.11.0/firecracker-v0.11.0
./firecracker-v0.11.0 --api-sock /tmp/firecracker.sock

每个微虚拟机都可以利用一个REST API进行bnaged。在另一终端当中,查询该微虚拟机:
curl --unix-socket /tmp/firecracker.sock "http://localhost/machine-config"

这会返回以下响应:
{ "vcpu_count": 1, "mem_size_mib": 128,  "ht_enabled": false,  "cpu_template": "Uninitialized" } 

这将启动VMM进程并等待微虚拟机配置。在默认情况下,每个微虚拟机会被分配予一个vCPU与128 MiB内存。现在,该微虚拟机需要配置一个未压缩Linux内核二进制文件与一套ext4文件系统镜像以充当root文件系统。

下载示例内核与rootfs:
curl -fsSL -o hello-vmlinux.bin https://s3.amazonaws.com/spec.ccfc.min/img/hello/kernel/hello-vmlinux.bin
curl -fsSL -o hello-rootfs.ext4 https://s3.amazonaws.com/spec.ccfc.min/img/hello/fsfiles/hello-rootfs.ext4

设置该客户内核:
curl --unix-socket /tmp/firecracker.sock -i \
-X PUT 'http://localhost/boot-source'   \
-H 'Accept: application/json'           \
-H 'Content-Type: application/json'     \
-d '{        "kernel_image_path": "./hello-vmlinux.bin", "boot_args": "console=ttyS0 reboot=k panic=1 pci=off"    }'

设置root文件系统:
curl --unix-socket /tmp/firecracker.sock -i \
-X PUT 'http://localhost/drives/rootfs' \
-H 'Accept: application/json'           \
-H 'Content-Type: application/json'     \
-d '{        "drive_id": "rootfs",        "path_on_host": "./hello-rootfs.ext4",        "is_root_device": true,        "is_read_only": false    }'

在内核与root文件系统配置完成之后,即可启动该客户机:
curl --unix-socket /tmp/firecracker.sock -i \
-X PUT 'http://localhost/actions'       \
-H  'Accept: application/json'          \
-H  'Content-Type: application/json'    \
-d '{        "action_type": "InstanceStart"     }'

第一个终端现在显示一条串行TTY,提示您登录至该客户机:
Welcome to Alpine Linux 3.8
Kernel 4.14.55-84.37.amzn2.x86_64 on an x86_64 (ttyS0)
localhost login:

以用户名root 以及密码root 进行登录后,即可查看该客户机的终端:
localhost login: root
Password:
Welcome to Alpine! 

The Alpine Wiki contains a large amount of how-to guides and general information about administrating Alpine systems. 

See <http://wiki.alpinelinux.org>. 

You can setup the system with the command: setup-alpine 

You may change this message by editing /etc/motd.

login[979]: root login on 'ttyS0' 
localhost:~#

您可以使用ls /查看文件系统:
localhost:~# ls /
bin         home        media       root        srv         usr
dev         lib         mnt         run         sys         var
etc         lost+found  proc        sbin        tmp

您可以使用reboot命令终止该微虚拟机。Firecracker目前还无法实现客户电源管理,这主要是为了尽可能提升执行效率。在这种情况下,reboot命令会发出键盘复位操作,而后将其用作关闭开关。

在这套基本的微虚拟机创建完成后,您可以向其中添加网络接口、添加更多驱动器并继续配置微虚拟机。

如果您打算一口气在裸机实例上创建数千套微虚拟机,可以使用以下操作。
for ((i=0; i<1000; i++)); do
./firecracker-v0.10.1 --api-sock /tmp/firecracker-$i.sock &
done

您可以使用单一共享root文件系统配置多套微虚拟机,而后为各个微虚拟机分配其独立的读取/写入份额。

Firecracker与开源

我们的使命在于始终为客户提供并帮助其实现创新,我们将继续在此堆栈的全部三个关键层(即应用层、虚拟化层与硬件层)上深入探索无服务器计算的发展前景。我们希望为客户提供能够切实满足其需求的计算选项——包括实例与无服务器计算,且确保各类选项都不会对安全性、可扩展性或者性能造成影响。Firecracker正是提供这种体验的基础构件之一。

事实上,深入投资基础性技术的研发正是我们AWS实现创新的核心途径之一——我们不仅着眼于明天,更着眼于下一个十年乃至更长远的未来。而这一切都要求我们与社区分享这项技术,从而携手共同实现创新。Firecracker遵循Apache 2.0开源许可。请访问Firecracker GitHub repo以了解更多细节信息,我们也欢迎大家为Firecracker的发展做出贡献。

通过将Firecracker推向开源,我们不仅邀请大家深入探索我们正在构建的这项基础性技术以支持无服务器计算的顺利发展,同时也希望您能够加入我们对Firecracker的加强与改进工作。关于更多细节信息,请参阅Firecracker常见问题列表以及Firecracker发展路线图

原文链接:Announcing the Firecracker Open Source Technology: Secure and Fast microVM for Serverless Computing

0 个评论

要回复文章请先登录注册