AWS开源Firecracker,一种运行多租户容器服务的新虚拟化技术
酆晔
2023-12-01
\u003cp\u003e现在的技术环境下,容器具有快速启动时间和高密度,VM可以对硬件虚拟化,具有更好的安全性,并对工作负载具有更好的隔离性。容器和VM的特性现在还不可兼得。\u003c/p\u003e\n\u003cp\u003e现在AWS开源了Firecracker,一种利用KVM的新虚拟化技术,专门用于创建和管理多租户容器以及基于函数的服务。 你可以在几分之一秒内在非虚拟化环境中启动轻量级微虚拟机(microVM),充分利用传统虚拟机提供的安全性和工作负载隔离,同时兼具容器的资源效率。\u003c/p\u003e\n\u003cp\u003eFirecracker实现了一个虚拟机监视器(virtual machine monitor,VMM),它使用基于Linux内核的虚拟机(KVM)来创建和管理microVM。 Firecracker为客户操作系统提供了最少的所需设备模型,同时排除了非必要功能(仅有4个模拟设备:virtio-net,virtio-block,串行控制台和仅有一个按键的键盘控制器,用于停止microVM)。\u003c/p\u003e\n\u003cp\u003e由于设备模型极简,内核加载过程也简单,可以实现小于125 ms的启动时间和更少的内存占用。Firecracker目前支持Intel CPU,并将于2019年开始支持AMD和ARM,还将与containerd等流行的容器运行时集成。Firecracker支持内核版本为4.14及更高版本的Linux主机和客户机操作系统。\u003c/p\u003e\n\u003cp\u003eFirecracker由AWS的开发人员构建,旨在使AWS Lambda和AWS Fargate等服务能够提高资源利用率和客户体验,同时提供公有云基础架构所需的安全性和隔离性。Firecracker采用Rust编写,Rust是一种现代编程语言,可以保证线程安全并防止可能导致安全漏洞的多种类型的缓冲区溢出错误。\u003c/p\u003e\n\u003cp\u003e下图展示了一台主机如何运行 Firecracker microVM:\u003c/p\u003e\n\u003cp\u003e\u003cimg src=\"https://static.geekbang.org/infoq/5bfce9728144d.png?imageView2/0/w/800\" alt=\"\" /\u003e\u003c/p\u003e\n\u003cp\u003eFirecracker在用户空间中运行,使用基于Linux内核的虚拟机(KVM)来创建microVM。每个microVM的快速启动时间和低内存开销使你可将数千个microVM打包到同一台机器上。这意味着每个函数或容器组都可以使用虚拟机屏障进行封装,从而使不同用户的工作负载能在同一台计算机上运行,而无需在安全性和效率之间进行权衡。Firecracker是QEMU的替代品,QEMU是一个成熟的VMM,具有通用和广泛的功能集,可以托管各种客户操作系统。\u003c/p\u003e\n\u003cp\u003e可以通过RESTful API控制Firecracker进程,RESTful API可以启用常见操作:例如配置vCPU数量或启动计算机。Firecracker提供内置速率限制器,可精确控制同一台计算机上数千个microVM使用的网络和存储资源。你可以通过Firecracker API创建和配置速率限制器,并灵活定义速率限制器来支持突发情况或特定带宽/操作限制。Firecracker还提供元数据服务,可在主机和客户机操作系统之间安全地共享配置信息。元数据服务可以使用Firecracker API设置。\u003c/p\u003e\n\u003cp\u003eFirecracker现在还不能在Kubernetes、Docker或Kata Container上使用。Kata Container是一个符合OCI标准的容器运行时,在基于QEMU的虚拟机中执行容器。Firecracker是QEMU的云原生替代品,专门用于安全高效地运行容器,这是Firecracker和Kata Container以及QEMU之间的区别。\u003c/p\u003e\n\u003cp\u003eFirecracker的优势如下:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003e安全\u003c/strong\u003e - Firecracker使用多级隔离和保护,并暴露出最小的攻击面。\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003e高性能\u003c/strong\u003e - 可以在短至125毫秒内启动microVM(在2019年可以更快),使其成为众多工作负载类型的理想选择,包括瞬态或短期工作负载。\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003e久经沙场\u003c/strong\u003e - Firecracker经过了很多测试,已经为包括AWS Lambda和AWS Fargate在内的多个高容量AWS服务提供支持。\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003e低开销\u003c/strong\u003e - Firecracker每个microVM消耗大约5 MiB的内存。你可以在同一实例上运行数千个具有不同vCPU和内存配置的安全VM。\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003e开源\u003c/strong\u003e - Firecracker是一个开源项目。AWS已经准备好审核并接受拉取请求。\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eFirecracker的安全功能包括:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003e简单客户机模型\u003c/strong\u003e - Firecracker客户端提供了一个非常简单的虚拟化设备模型,以最小化攻击面:只有网络设备,block I / O设备,可编程定时器,KVM时钟,串行控制台和一个不完全的 键盘(刚好足以让VM重置)。\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003e进程监狱\u003c/strong\u003e - 使用cgroups和seccomp BPF对Firecracker进程进行监禁,并且可以访问一个严格控制的小型系统调用列表。\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003e静态链接\u003c/strong\u003e - Firecracker 进程是静态链接的,可以从进程监狱中启动,以确保主机环境尽可能安全和干净。\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2\u003e开启Firecracker\u003c/h2\u003e\n\u003cp\u003e示例启动了一个i3.metal实例并下载了三个文件(\u003ccode\u003efirecracker\u003c/code\u003e二进制文件,一个根文件系统镜像和一个Linux内核):\u003c/p\u003e\n\u003cp\u003e\u003cimg src=\"https://static.geekbang.org/infoq/5bfce7e6ce3e2.png?imageView2/0/w/800\" alt=\"\" /\u003e\u003c/p\u003e\n\u003cp\u003e设置访问\u003ccode\u003e/ dev / kvm\u003c/code\u003e的适当权限:\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003e$ sudo setfacl -m u:${USER}:rw /dev/kvm\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003e在一个PuTTY会话中启动Firecracker,然后在另一个PuTTY会话中发出命令(该进程侦听Unix域套接字并实现一个REST API)。 第一个命令设置第一台客户机的配置:\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003e$ curl --unix-socket /tmp/firecracker.sock -i \\\n -X PUT \u0026quot;http://localhost/machine-config\u0026quot; \\\n -H \u0026quot;accept: application/json\u0026quot; \\\n -H \u0026quot;Content-Type: application/json\u0026quot; \\\n -d \u0026quot;{\n \\\u0026quot;vcpu_count\\\u0026quot;: 1,\n \\\u0026quot;mem_size_mib\\\u0026quot;: 512\n }\u0026quot;\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003e第二个命令设置 guest kernel:\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003e$ curl --unix-socket /tmp/firecracker.sock -i \\\n -X PUT \u0026quot;http://localhost/boot-source\u0026quot; \\\n -H \u0026quot;accept: application/json\u0026quot; \\\n -H \u0026quot;Content-Type: application/json\u0026quot; \\\n -d \u0026quot;{\n \\\u0026quot;kernel_image_path\\\u0026quot;: \\\u0026quot;./hello-vmlinux.bin\\\u0026quot;,\n \\\u0026quot;boot_args\\\u0026quot;: \\\u0026quot;console=ttyS0 reboot=k panic=1 pci=off\\\u0026quot;\n }\u0026quot;\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003e第三个命令设置根文件系统:\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003e$ curl --unix-socket /tmp/firecracker.sock -i \\\n -X PUT \u0026quot;http://localhost/drives/rootfs\u0026quot; \\\n -H \u0026quot;accept: application/json\u0026quot; \\\n -H \u0026quot;Content-Type: application/json\u0026quot; \\\n -d \u0026quot;{\n \\\u0026quot;drive_id\\\u0026quot;: \\\u0026quot;rootfs\\\u0026quot;,\n \\\u0026quot;path_on_host\\\u0026quot;: \\\u0026quot;./hello-rootfs.ext4\\\u0026quot;,\n \\\u0026quot;is_root_device\\\u0026quot;: true,\n \\\u0026quot;is_read_only\\\u0026quot;: false\n }\u0026quot;\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003e所有都设置好以后,能启动一台客户机:\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003e# curl --unix-socket /tmp/firecracker.sock -i \\\n -X PUT \u0026quot;http://localhost/actions\u0026quot; \\\n -H \u0026quot;accept: application/json\u0026quot; \\\n -H \u0026quot;Content-Type: application/json\u0026quot; \\\n -d \u0026quot;{\n \\\u0026quot;action_type\\\u0026quot;: \\\u0026quot;InstanceStart\\\u0026quot;\n }\u0026quot;\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003e第一个VM已经起来并可以运行了:\u003c/p\u003e\n\u003cp\u003e\u003cimg src=\"https://static.geekbang.org/infoq/5bfce9282acd9.png?imageView2/0/w/800\" alt=\"\" /\u003e\u003c/p\u003e\n\u003cp\u003e参考链接:\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"https://firecracker-microvm.github.io/\"\u003ehttps://firecracker-microvm.github.io/\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"https://amazonaws-china.com/cn/blogs/aws/firecracker-lightweight-virtualization-for-serverless-computing/\"\u003ehttps://amazonaws-china.com/cn/blogs/aws/firecracker-lightweight-virtualization-for-serverless-computing/\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003eFirecracker 开源地址:\u003ca href=\"https://github.com/firecracker-microvm/firecracker\"\u003ehttps://github.com/firecracker-microvm/firecracker\u003c/a\u003e\u003c/p\u003e\n\u003ch2\u003e活动推荐\u003c/h2\u003e\n\u003cp\u003e\u003cimg src=\"https://static001.geekbang.org/resource/image/8c/29/8cf8f8d7ac09d6b12bdb59a4b407b729.jpg\" alt=\"\" /\u003e\u003c/p\u003e\n\u003cp\u003e12 月 7 日北京 ArchSummit 全球架构师峰会上,来自阿里、京东、Streamlio的讲师齐聚一堂,共同分享“Apache Pulsar解决运维痛点”、“Dubbo应用实践”和“Flutter在京东的实践效果”等开源技术相关经验与实践。详情点击 \u003ca href=\"https://bj2018.archsummit.com/schedule\"\u003ehttps://bj2018.archsummit.com/schedule\u003c/a\u003e\u003c/p\u003e\n