現在的技術環境下,容器具有快速啓動時間和高密度,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/
Firecracker 開源地址:https://github.com/firecracker-microvm/firecracker