亚马逊AWS官方博客

宣布推出 Firecracker 开源技术:适用于无服务器计算的安全、快速的 microVM

Firecracker 徽标

虚拟化的新挑战

现在,客户可以使用无服务器计算来构建应用程序,无需担心基础设施的预置或管理问题。开发人员可以使用 AWS Fargate 将其代码封装为无服务器容器,或使用 AWS Lambda 封装为无服务器函数。客户表示他们喜欢无服务器的低运营开销特点,我们认为这将继续对计算的未来发挥关键作用。

随着客户越来越广泛采用无服务器技术,我们认识到现行虚拟化技术还未同步发展,以针对此类事件驱动性,有时又呈短暂性特点的工作负载进行优化。我们认为需要构建特别针对无服务器计算设计的虚拟化技术。我们需要既能提供基于硬件虚拟化的虚拟机安全性边界,同时又能保持容器和函数较小的封装型号和敏捷性。

Firecracker 技术

Firecracker 是一种采用基于 Linux 内核的虚拟机 (KVM) 技术的开源虚拟机监控程序(VMM)。Firecracker 允许您创建微型虚拟机,即 microVM。Firecracker 坚持精简主义的设计原则,它仅包含运行安全、轻量的虚拟机所需的组件。在设计过程的各个环节,我们依据安全性、速度和效率要求来优化 Firecracker。例如,我们仅启动相对较新的 Linux 内核,并且仅启动使用特定配置选项集编译的内核(内核编译配置选项超过 1000 种)。此外,我们不支持任何类型的图形卡或加速器,不支持硬件透传,不支持(大多数)老旧设备。

Firecracker 启动的内核配置极少,不依赖仿真 BIOS,不使用完整设备模式。唯一的设备是半虚拟化网卡和半虚拟化硬盘,以及单按钮键盘(复位引脚在无电源管理设备时使用)。这种极简的设备模式不仅有利于缩短开机时间(采用默认 microVM 型号的 i3.metal 实例开机时间 < 125 毫秒),同时也减少了攻击面,从而提高了安全性。请参阅有关 Firecracker 承诺支持以极低的开销执行容器和无服务器工作负载的更多信息。

2017 年秋,我们决定以 Rust 语言来编写 Firecracker,这是一种非常先进的编程语言,可保证线程和内存安全,防止缓存溢出以及可能导致安全性漏洞的许多其他类型的内存安全问题。请访问 Firecracker 设计以了解有关 Firecracker VMM 功能和架构的更多详细信息。

Firecracker microVM 提高了效率和利用率,内存开销极低,每 microVM 的内存开销 < 5MiB。这意味着您可以将数千个 microVM 封装到一个虚拟机中。您可以使用进程中速率限制器来实现对网络和存储资源的共享方式的精细控制,即使跨数千个 microVM 也同样可行。所有硬件计算资源可以安全地超订,从而最大化可以在主机上运行的工作负载数量。

我们依据如下开放源项目的指导信条开发了 Firecracker(除非您知道更好的原则):

  • 内置安全性:我们提供了支持多租户工作负载并且不会被客户错误禁用的计算安全性屏障。客户工作负载被认为既神圣(不可侵犯)又邪恶(应当拒之门外)。
  • 轻量虚拟化:我们重视瞬时性或无状态的工作负载,而非长时间运行或持续性的工作负载。Firecracker 的硬件资源开销是明确且又保障的。
  • 功能极简主义:我们不会构建非我们的任务所明确要求的功能。每个功能仅实施一项。
  • 计算超订:Firecracker 向来宾开放的所有硬件计算资源都可以安全地超订。

我们将这一基础性的技术开源化,是因为我们相信我们为无服务器计算建设下一代虚拟化的使命刚刚开始。

Firecracker 的使用

AWS Lambda 将 Firecracker 作为预置和运行用于执行客户代码的沙盒的基础。由于 Firecracker 提供了安全的 microVM,可以快速预置,占用空间极小,从而在不牺牲安全性的前提下提高了性能。这让我们能够保持极高的物理硬件利用率,因为我们现在可以优化如何为 Lambda 分配和运行工作负载的方式,根据活跃/空闲时段以及内存利用率等因素来混合工作负载。

以前,Fargate 任务由一个或多个在 EC2 虚拟机内运行的 Docker 容器组成,以确保任务之间的隔离。现在,这些任务在 Firecracker microVM 上运行,让我们可以在 EC2 裸机实例上更快、更高效地预置 Fargate 运行时层,提高计算密度,同时又不牺牲任务的内核级隔离。随着时间推移,这将有利于我们继续进行运行时层的创新,为客户提供更高的性能,同时保持高安全性标准,降低运行无服务器容器架构的总体成本。

Firecracker 目前采用英特尔处理器,2019 年将开始支持 AMD 和 ARM 处理器。

您可以在 AWS .metal 实例上以及其他裸机服务器上运行 Firecracker,包括本地环境和开发人员的笔记本电脑。

Firecracker 还将支持 containerd 等流行的容器运行时来管理 microVM 等容器。这将便于 Docker 和 Kubernetes 等容器编排框架来使用 Firecracker。我们已经构建了一个支持使用 containerd 来管理 Firecracker microVM 等容器的原型,并且将携手社区一起发展它。

Firecracker 入门

Firecracker 入门提供了有关如何下载 Firecracker 二进制代码、以不同的选项启动 Firecracker、从源进行构建以及运行集成测试等方面的详细说明。您可以通过 Firecracker Jailer 在生产环境中运行 Firecracker。

下面我们来看如何在 AWS 云上开始使用 Firecracker(这些步骤可以在任何裸机上使用):

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

Firecracker 在 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

每个 microVM 都可以使用 REST API 来访问。在另一个终端中查询 microVM:

curl --unix-socket /tmp/firecracker.sock "http://localhost/machine-config"

这将返回如下应答:

{ "vcpu_count": 1, "mem_size_mib": 128,  "ht_enabled": false,  "cpu_template": "Uninitialized" }

这将启动一个 VMM 进程并等待 microVM 配置。默认情况下,每个 microVM 将分配一个 vCPU 和 128MiB 内存。现在此 microVM 需要使用解压后的 Linux 内核二进制代码和将用作根文件系统的 ext4 文件系统来进行配置。

下载示例内核和 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"    }'

设置根文件系统:

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    }'

配置好内核和根文件系统后,将会启动来宾虚拟机:

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 命令终止 microVM。为了权衡效率,Firecracker 目前并未实施来宾电源管理。相反,reboot 命令会发出一个键盘复位操作以作为关机开关。

创建基本的 microVM 后,您可以添加网络接口、更多的驱动器以及继续配置 microVM。

需要在您的裸机实例上创建上千个 microVMs?

for ((i=0; i<1000; i++)); do
    ./firecracker-v0.10.1 --api-sock /tmp/firecracker-$i.sock &
done

多个 microVM 可以配置同一个共享根文件系统,然后为每个 microVM 分配自己的读/写份额。

Firecracker 与开源

我们以代表并为了客户进行创新为使命,将继续大力投资在堆栈的所有三个关键层的无服务器计算:应用层、虚拟化层和硬件层。我们矢志为客户提供他们需要的计算能力,不论是实例还是无服务器计算,同时安全性、可扩展性和性能上不打任何折扣。Firecracker 是提供这一体验的基础组件。

大力投资基础技术是 AWS 创新方法的关键要义之一,这不仅是为了明天,更是为了下一个十年甚至更远的将来。在此创新的过程中,我们也与社区紧密共享这一技术。Firecracker 依据 Apache 2.0 进行许可。请访问 Firecracker GitHub 存储库以了解更多信息和为 Firecracker 做贡献。

通过将 Firecracker 开源化,我们不仅欢迎您深入研究我们构建无服务器计算的未来的基础技术,也希望您能与我们一起强化和完善 Firecracker。更多信息请参阅 Firecracker 问题列表Firecracker 路线图