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

640

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

640


时至今日,我们的客户可以利用无服务器计算来构建应用程序,而无需分神于基础设施的配置或者管理工作。开发人员可以利用AWS Fargate或者AWS Lambda的无服务器函数将其代码打包为无服务器容器。根据客户提供的反馈,他们非常喜爱无服务器技术带来的低资源消耗需求,而我们也坚信这种新的计算形式将继续在计算机的未来发展中发挥至关重要的作用。
随着我们的客户越来越多地采用无服务器服务,我们意识到现有虚拟化技术并不具备能够优化此类工作负载所固有的事件驱动以及时常出现的短暂属性。我们认为,有必要专门面向无服务器计算构建起新的虚拟化实现技术,从而在为基于硬件虚拟化的虚拟机提供安全边界的同时,继续保持较小的打包体积以及容器与函数的灵活性。
Firecracker技术

640


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

640


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上手指南

640


Firecracker上手指南[5]当中提供有关如何下载Firecracker二进制文件、使用不同选项启动Firecracker、从头开始进行构建以及运行集成测试的大量详细说明。您也可以使用Firecracker Jailer[6]在生产环境当中运行Firecracker。
下面,让我们一起来看如何在AWS云上使用Firecracker(以下步骤亦适用于任何裸机设备):
创建一个使用Ubuntu 18.04.1版本的i3.metal实例。
Firecracke以KVM为构建基础,且需要面向/dev/kvm进行读取/写入访问。通过终端登录至该主机,而后设置此访问:
 
 
  1. sudo chmod 777 /dev/kvm


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

  2. ./firecracker-v0.11.0 --api-sock /tmp/firecracker.sock


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

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值