随着我们的客户越来越多地采用无服务器服务,我们意识到现有虚拟化技术并不具备能够优化此类工作负载所固有的事件驱动以及时常出现的短暂属性。我们认为,有必要专门面向无服务器计算构建起新的虚拟化实现技术,从而在为基于硬件虚拟化的虚拟机提供安全边界的同时,继续保持较小的打包体积以及容器与函数的灵活性。
Firecracker技术
Firecracker启动的是最小内核配置,其不依赖于模拟BIOS,也不具备完整的设备模型。其中少数存在的设备就只有virtio net与virtio block,外加单键式键盘(由于没有电源管理设备,因此用户需要使用其中的复位功能)。这种最小设备模型不仅能够带来更快的启动时间(在默认大小的微虚拟机i3.metal上,启动时间低于125毫秒),还能够有效减少攻击面以显著提高安全性水平。感兴趣的朋友可以查阅与Firecracker技术承诺的更多详细信息[2],包括其如何为容器与无服务器工作负载的执行带来最低资源开销。
2017年秋季,我们决定使用Rust语言编写Firecracker——Rust是一种现代编程语言,能够有效保证线程与内存安全,同时防止可能引发各类安全漏洞的缓冲区溢出以及其它多种常见的内存安全错误。感兴趣的朋友可以参阅Firecracker设计[3]当中与Firecracker VMM功能与架构特性相关的更多细节信息。
Firecracker微虚拟机提高了效率与资源利用率,其中每一套微虚拟机的内存开销低于5 MiB。这意味着您可以将数千套微虚拟机打包至同一台计算机之上。此外,您还可以利用进程内速率限制器以细粒度方式控制网络与存储资源的共享方式,甚至能够跨越数千套微虚拟机进行全面控制。如此一来,您将能够安全地超额预订一切硬件计算资源,从而最大程度提升可运行在主机当中的工作负载总量。
我们还为Firecracker开源项目整理出包含以下指导性原则[4]的上手指南:
内置安全保障:我们提供计算安全约束机制,其支持多租户工作负载且不会被客户错误地加以禁用。客户工作负载将被视为同时具备神圣(不可接触)及恶意(应加以戒备)两种属性。
轻量级虚拟化:我们专注于长期或无状态类工作负载,而非长时间运行或持久性工作负载。Firecracker的硬件资源开销明确且经过大量事实的验证。
功能极简主义:如果没有明确的需求,我们不会在任务当中构建额外的功能。我们针对每项功能保持着独立且唯一的实现方式。
计算超额预订:Firecracker向客户公开的所有硬件计算资源,都可以安全地进行超额预订。
我们之所以要对这项基础技术加以开源,是因为我们相信我们承担着为无服务器计算构建下一代虚拟化方案的使命,而目前这项工作才刚刚迈出第一步。
Firecracker的使用方式
在此之前,Fargate Tasks包含一个或者多个运行于专用EC2虚拟机当中的Docker容器,旨在确保任务间相互隔离。这些任务现在可以在Firecracker微虚拟机上执行,这使得我们能够立足EC2裸机实例对Fargate运行时层进行更快、更高效地配置,同时在不影响任务内核级隔离能力的前提下提高工作负载密度。随着时间的推移,这还使我们得以继续在运行时层内实现创新,为我们的客户提供更好的性能表现,同时保持高安全性水平并降低运行无服务器容器架构的总体成本。
Firecracker目前运行在英特尔处理器之上,并将在2019年年内实现对AMD以及ARM处理器的支持。
您可以在AWS .metal实例上运行Firecracker,同时也可将其运行在任何其它裸机服务器之上,具体包括内部环境以及开发人员的笔记本电脑。
Firecracker还将启用目前极具人气的容器运行时(例如containerd)将容器作为微虚拟机进行管理。如此一来,用户的Docker与容器编排框架(例如Kubernetes)将能够使用Firecracker。我们已经构建起一套原型设计,使得containerd能够将容器作为Firecracker微虚拟机加以管理。我们也希望能够与社区一道进一步推动其广泛普及。
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与开源
事实上,深入投资基础性技术的研发正是我们AWS实现创新的核心途径之一——我们不仅着眼于明天,更着眼于下一个十年乃至更长远的未来。而这一切都要求我们与社区分享这项技术,从而携手共同实现创新。Firecracker遵循Apache 2.0开源许可。请访问Firecracker GitHub repo[7]以了解更多细节信息,我们也欢迎大家为Firecracker的发展做出贡献。
通过将Firecracker推向开源,我们不仅邀请大家深入探索我们正在构建的这项基础性技术以支持无服务器计算的顺利发展,同时也希望您能够加入我们对Firecracker的加强与改进工作。关于更多细节信息,请参阅Firecracker常见问题列表[8]以及Firecracker发展路线图[9]。
相关链接:
https://aws.amazon.com/blogs/aws/firecracker-lightweight-virtualization-for-serverless-computing/
https://github.com/firecracker-microvm/firecracker/blob/master/SPECIFICATION.md
https://github.com/firecracker-microvm/firecracker/blob/master/docs/design.md
https://github.com/firecracker-microvm/firecracker/blob/master/CHARTER.md
https://github.com/firecracker-microvm/firecracker/blob/master/docs/getting-started.md
https://github.com/firecracker-microvm/firecracker/blob/master/docs/jailer.md
https://github.com/firecracker-microvm/firecracker/
https://github.com/firecracker-microvm/firecracker/issues
https://github.com/firecracker-microvm/firecracker/labels/Roadmap
原文链接:https://aws.amazon.com/cn/blogs/opensource/firecracker-open-source-secure-fast-microvm-serverless/