AWS開源Firecracker:面向無伺服器計算的安全快速微虛擬機器
隨著我們的客戶越來越多地採用無伺服器服務,我們意識到現有虛擬化技術並不具備能夠優化此類工作負載所固有的事件驅動以及時常出現的短暫屬性。我們認為,有必要專門面向無伺服器計算構建起新的虛擬化實現技術,從而在為基於硬體虛擬化的虛擬機器提供安全邊界的同時,繼續保持較小的打包體積以及容器與函式的靈活性。
Firecracker技術
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的使用方式
在此之前,Fargate Tasks包含一個或者多個運行於專用EC2虛擬機器當中的Docker容器,旨在確保任務間相互隔離。這些任務現在可以在Firecracker微虛擬機器上執行,這使得我們能夠立足EC2裸機例項對Fargate執行時層進行更快、更高效地配置,同時在不影響任務核心級隔離能力的前提下提高工作負載密度。隨著時間的推移,這還使我們得以繼續在執行時層內實現創新,為我們的客戶提供更好的效能表現,同時保持高安全性水平並降低執行無伺服器容器架構的總體成本。
Firecracker目前執行在英特爾處理器之上,並將在2019年年內實現對AMD以及ARM處理器的支援。
您可以在AWS .metal例項上執行Firecracker,同時也可將其執行在任何其它裸機伺服器之上,具體包括內部環境以及開發人員的膝上型電腦。
Firecracker還將啟用目前極具人氣的容器執行時(例如containerd)將容器作為微虛擬機器進行管理。如此一來,使用者的Docker與容器編排框架(例如Kubernetes)將能夠使用Firecracker。我們已經構建起一套原型設計,使得containerd能夠將容器作為Firecracker微虛擬機器加以管理。我們也希望能夠與社群一道進一步推動其廣泛普及。
Firecracker上手指南
下面,讓我們一起來看如何在AWS雲上使用Firecracker(以下步驟亦適用於任何裸機裝置):
建立一個使用Ubuntu 18.04.1版本的i3.metal例項。
Firecracke以KVM為構建基礎,且需要面向/dev/kvm進行讀取/寫入訪問。通過終端登入至該主機,而後設定此訪問:
sudo chmod 777 /dev/kvm
下載並啟動Firecracker二進位制檔案:
curl -L https://github.com/firecracker-microvm/firecracker/releases/download/v0.11.0/firecracker-v0.11.0
./firecracker-v0.11.0 --api-sock /tmp/firecracker.sock
每個微虛擬機器都可以利用一個REST API進行bnaged。在另一終端當中,查詢該微虛擬機器:
curl --unix-socket /tmp/firecracker.sock "http://localhost/machine-config"
這會返回以下響應:
{ "vcpu_count": 1, "mem_size_mib": 128, "ht_enabled": false, "cpu_template": "Uninitialized" }
這將啟動VMM程序並等待微虛擬機器配置。在預設情況下,每個微虛擬機器會被分配予一個vCPU與128 MiB記憶體。現在,該微虛擬機器需要配置一個未壓縮Linux核心二進位制檔案與一套ext4檔案系統映象以充當root檔案系統。
下載示例核心與rootfs:
curl -fsSL -o hello-vmlinux.bin https://s3.amazonaws.com/spec.ccfc.min/img/hello/kernel/hello-vmlinux.bin
curl -fsSL -o hello-rootfs.ext4 https://s3.amazonaws.com/spec.ccfc.min/img/hello/fsfiles/hello-rootfs.ext4
設定該客戶核心:
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" }'
設定root檔案系統:
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 }'
在核心與root檔案系統配置完成之後,即可啟動該客戶機:
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" }'
第一個終端現在顯示一條序列TTY,提示您登入至該客戶機:
Welcome to Alpine Linux 3.8
Kernel 4.14.55-84.37.amzn2.x86_64 on an x86_64 (ttyS0)
localhost login:
以使用者名稱root 以及密碼root 進行登入後,即可檢視該客戶機的終端:
localhost login: root
Password:
Welcome to Alpine!
The Alpine Wiki contains a large amount of how-to guides and general information about administrating Alpine systems.
See <http://wiki.alpinelinux.org>.
You can setup the system with the command: setup-alpine
You may change this message by editing /etc/motd.
login[979]: root login on 'ttyS0'
localhost:~#
您可以使用ls /檢視檔案系統:
localhost:~# ls /
bin home media root srv usr
dev lib mnt run sys var
etc lost+found proc sbin tmp
您可以使用reboot命令終止該微虛擬機器。Firecracker目前還無法實現客戶電源管理,這主要是為了儘可能提升執行效率。在這種情況下,reboot命令會發出鍵盤復位操作,而後將其用作關閉開關。
在這套基本的微虛擬機器建立完成後,您可以向其中新增網路介面、新增更多驅動器並繼續配置微虛擬機器。
如果您打算一口氣在裸機例項上建立數千套微虛擬機器,可以使用以下操作。
for ((i=0; i<1000; i++)); do
./firecracker-v0.10.1 --api-sock /tmp/firecracker-$i.sock &
done
您可以使用單一共享root檔案系統配置多套微虛擬機器,而後為各個微虛擬機器分配其獨立的讀取/寫入份額。
Firecracker與開源
事實上,深入投資基礎性技術的研發正是我們AWS實現創新的核心途徑之一——我們不僅著眼於明天,更著眼於下一個十年乃至更長遠的未來。而這一切都要求我們與社群分享這項技術,從而攜手共同實現創新。Firecracker遵循Apache 2.0開源許可。請訪問Firecracker GitHub repo[7]以瞭解更多細節資訊,我們也歡迎大家為Firecracker的發展做出貢獻。
通過將Firecracker推向開源,我們不僅邀請大家深入探索我們正在構建的這項基礎性技術以支援無伺服器計算的順利發展,同時也希望您能夠加入我們對Firecracker的加強與改進工作。關於更多細節資訊,請參閱Firecracker常見問題列表[8]以及Firecracker發展路線圖[9]。
相關連結:
https://aws.amazon.com/blogs/aws/firecracker-lightweight-virtualization-for-serverless-computing/
https://github.com/firecracker-microvm/firecracker/blob/master/SPECIFICATION.md
https://github.com/firecracker-microvm/firecracker/blob/master/docs/design.md
https://github.com/firecracker-microvm/firecracker/blob/master/CHARTER.md
https://github.com/firecracker-microvm/firecracker/blob/master/docs/getting-started.md
https://github.com/firecracker-microvm/firecracker/blob/master/docs/jailer.md
https://github.com/firecracker-microvm/firecracker/
https://github.com/firecracker-microvm/firecracker/issues
https://github.com/firecracker-microvm/firecracker/labels/Roadmap
原文連結:https://aws.amazon.com/cn/blogs/opensource/firecracker-open-source-secure-fast-microvm-serverless/