写点什么

AWS 开源 Firecracker,一种运行多租户容器服务的新虚拟化技术

  • 2018-11-27
  • 本文字数:2683 字

    阅读完需:约 9 分钟

AWS开源Firecracker,一种运行多租户容器服务的新虚拟化技术

现在的技术环境下,容器具有快速启动时间和高密度,VM 可以对硬件虚拟化,具有更好的安全性,并对工作负载具有更好的隔离性。容器和 VM 的特性现在还不可兼得。


现在 AWS 开源了 Firecracker,一种利用 KVM 的新虚拟化技术,专门用于创建和管理多租户容器以及基于函数的服务。 你可以在几分之一秒内在非虚拟化环境中启动轻量级微虚拟机(microVM),充分利用传统虚拟机提供的安全性和工作负载隔离,同时兼具容器的资源效率。


Firecracker 实现了一个虚拟机监视器(virtual machine monitor,VMM),它使用基于 Linux 内核的虚拟机(KVM)来创建和管理 microVM。 Firecracker 为客户操作系统提供了最少的所需设备模型,同时排除了非必要功能(仅有 4 个模拟设备:virtio-net,virtio-block,串行控制台和仅有一个按键的键盘控制器,用于停止 microVM)。


由于设备模型极简,内核加载过程也简单,可以实现小于 125 ms 的启动时间和更少的内存占用。Firecracker 目前支持 Intel CPU,并将于 2019 年开始支持 AMD 和 ARM,还将与 containerd 等流行的容器运行时集成。Firecracker 支持内核版本为 4.14 及更高版本的 Linux 主机和客户机操作系统。


Firecracker 由 AWS 的开发人员构建,旨在使 AWS Lambda 和 AWS Fargate 等服务能够提高资源利用率和客户体验,同时提供公有云基础架构所需的安全性和隔离性。Firecracker 采用 Rust 编写,Rust 是一种现代编程语言,可以保证线程安全并防止可能导致安全漏洞的多种类型的缓冲区溢出错误。


下图展示了一台主机如何运行 Firecracker microVM:



Firecracker 在用户空间中运行,使用基于 Linux 内核的虚拟机(KVM)来创建 microVM。每个 microVM 的快速启动时间和低内存开销使你可将数千个 microVM 打包到同一台机器上。这意味着每个函数或容器组都可以使用虚拟机屏障进行封装,从而使不同用户的工作负载能在同一台计算机上运行,而无需在安全性和效率之间进行权衡。Firecracker 是 QEMU 的替代品,QEMU 是一个成熟的 VMM,具有通用和广泛的功能集,可以托管各种客户操作系统。


可以通过 RESTful API 控制 Firecracker 进程,RESTful API 可以启用常见操作:例如配置 vCPU 数量或启动计算机。Firecracker 提供内置速率限制器,可精确控制同一台计算机上数千个 microVM 使用的网络和存储资源。你可以通过 Firecracker API 创建和配置速率限制器,并灵活定义速率限制器来支持突发情况或特定带宽/操作限制。Firecracker 还提供元数据服务,可在主机和客户机操作系统之间安全地共享配置信息。元数据服务可以使用 Firecracker API 设置。


Firecracker 现在还不能在 Kubernetes、Docker 或 Kata Container 上使用。Kata Container 是一个符合 OCI 标准的容器运行时,在基于 QEMU 的虚拟机中执行容器。Firecracker 是 QEMU 的云原生替代品,专门用于安全高效地运行容器,这是 Firecracker 和 Kata Container 以及 QEMU 之间的区别。


Firecracker 的优势如下:


  • 安全 - Firecracker 使用多级隔离和保护,并暴露出最小的攻击面。

  • 高性能 - 可以在短至 125 毫秒内启动 microVM(在 2019 年可以更快),使其成为众多工作负载类型的理想选择,包括瞬态或短期工作负载。

  • 久经沙场 - Firecracker 经过了很多测试,已经为包括 AWS Lambda 和 AWS Fargate 在内的多个高容量 AWS 服务提供支持。

  • 低开销 - Firecracker 每个 microVM 消耗大约 5 MiB 的内存。你可以在同一实例上运行数千个具有不同 vCPU 和内存配置的安全 VM。

  • 开源 - Firecracker 是一个开源项目。AWS 已经准备好审核并接受拉取请求。


Firecracker 的安全功能包括:


  • 简单客户机模型 - Firecracker 客户端提供了一个非常简单的虚拟化设备模型,以最小化攻击面:只有网络设备,block I / O 设备,可编程定时器,KVM 时钟,串行控制台和一个不完全的 键盘(刚好足以让 VM 重置)。

  • 进程监狱 - 使用 cgroups 和 seccomp BPF 对 Firecracker 进程进行监禁,并且可以访问一个严格控制的小型系统调用列表。

  • 静态链接 - Firecracker 进程是静态链接的,可以从进程监狱中启动,以确保主机环境尽可能安全和干净。

开启 Firecracker

示例启动了一个 i3.metal 实例并下载了三个文件(firecracker二进制文件,一个根文件系统镜像和一个 Linux 内核):



设置访问/ dev / kvm的适当权限:


$  sudo setfacl -m u:${USER}:rw /dev/kvm
复制代码


在一个 PuTTY 会话中启动 Firecracker,然后在另一个 PuTTY 会话中发出命令(该进程侦听 Unix 域套接字并实现一个 REST API)。 第一个命令设置第一台客户机的配置:


$ curl --unix-socket /tmp/firecracker.sock -i \    -X PUT "http://localhost/machine-config" \    -H "accept: application/json" \    -H "Content-Type: application/json" \    -d "{        \"vcpu_count\": 1,        \"mem_size_mib\": 512    }"
复制代码


第二个命令设置 guest kernel:


$ 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\"     }"
复制代码


第一个 VM 已经起来并可以运行了:



参考链接:


https://firecracker-microvm.github.io/


https://amazonaws-china.com/cn/blogs/aws/firecracker-lightweight-virtualization-for-serverless-computing/


Firecracker 开源地址:https://github.com/firecracker-microvm/firecracker

活动推荐


12 月 7 日北京 ArchSummit 全球架构师峰会上,来自阿里、京东、Streamlio 的讲师齐聚一堂,共同分享“Apache Pulsar 解决运维痛点”、“Dubbo 应用实践”和“Flutter 在京东的实践效果”等开源技术相关经验与实践。详情点击 https://bj2018.archsummit.com/schedule


2018-11-27 16:583663
用户头像
张婵 InfoQ 技术编辑

发布了 87 篇内容, 共 55.3 次阅读, 收获喜欢 218 次。

关注

评论 1 条评论

发布
暂无评论
发现更多内容

千万级学生管理系统试卷存储方案(架构实战营 模块四作业)

Gor

在线多行文本行转列工具

入门小站

工具

uni-app进阶之生命周期【day8】

恒山其若陋兮

6月月更

scanf的使用,cin和scanf的区别

工程师日月

6月月更

【作业四 千万级学生管理系统的考试试卷存储方案】

wuli洋

《网络是怎么样连接的》读书笔记 - Tcp/IP连接(二)

懒时小窝

TCP 网络编程 IP

在线JSON转TSV工具

入门小站

工具

课程背景

IT蜗壳-Tango

6月月更

架构实战营模块4作业

挖了蘑菇哩斯

架构实战营 存储方案

redis内存优化

乌龟哥哥

6月月更

dart使用技巧集合【01】

坚果

6月月更

GetX 响应式状态管理简介

岛上码农

flutter ios 安卓 跨平台应用 6月月更

JVM调优简要思想及简单案例-JVM分代模型

zarmnosaj

6月月更

【Python技能树共建】字符编码与解码

梦想橡皮擦

Python 6月月更

远程办公三部曲 - 如何提高工作效率| 社区征文

耳东@Erdong

工作效率 远程办公 6月月更 初夏征文

Linux开发_采用线程处理网络请求

DS小龙哥

6月月更

面试突击58:truncate、delete和drop的6大区别

王磊

Java java常见面试题 常见面试题

linux几个不常用但是很有用的命令

入门小站

Linux

初创公司,如何拥有企业级Java脚手架

昵称不能为null

Java脚手架 企业级代码架构

【Spring 学习笔记(十四)】Spring AOP 通知中获取数据

倔强的牛角

Java spring 6月月更

DOM核心——Element类型

大熊G

JavaScript 前端 6月月更

wapper解析

卢卡多多

6月月更

echo命令实用技巧

Nick

Docker 镜像源 echo 6月月更 tldr

DOM

Jason199

DOM js 6月月更

ImportSelector与DeferredImportSelector的区别(spring4)

程序员欣宸

Java spring SpringFramework 6月月更

我理解的微服务 -- 读《微服务设计模式》总结

潜水员

golang 微服务

618战报销冠谜底:“收割机”联想屠榜背后的三大利器是什么?

脑极体

解决k8s调度不均衡问题

劼哥stone

Kubernetes 云原生 调度 调度不均衡 kube-scheduler

Python 设计模式:原型模式

宇宙之一粟

设计模式 原型模式 6月月更

敲了几万行源码后,我给Mybatis画了张“全地图”

小傅哥

源码分析 面试 小傅哥 mybatis 大厂面试

Jenkins 通过检查代码提交自动触发编译

HoneyMoose

AWS开源Firecracker,一种运行多租户容器服务的新虚拟化技术_容器_张婵_InfoQ精选文章