现在的技术环境下, 容器具有快速启动时间和高密度, 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 -mu:${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/
Firecracker 开源地址: https://github.com/firecracker-microvm/firecracker
来源: http://www.tuicool.com/articles/fA3QVfz