溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶(hù)服務(wù)條款》

AWS Serverless服務(wù)和Firecracker技術(shù)的介紹

發(fā)布時(shí)間:2020-05-27 16:25:57 來(lái)源:億速云 閱讀:985 作者:鴿子 欄目:云計(jì)算

一、AWS Serverless 服務(wù)

近些年 AWS 非常推崇無(wú)服務(wù)器模式,自從2014年 Lambda 發(fā)布之后,無(wú)服務(wù)器大受歡迎,隨之 2017 年推出 AWS Fargate 服務(wù),應(yīng)用于自家的容器服務(wù)平臺(tái) ECS。在 2019 年,EKS 也相繼支持 AWS Fargate。

現(xiàn)在,更多的用戶(hù)使用無(wú)服務(wù)器計(jì)算來(lái)構(gòu)建應(yīng)用程序,AWS 旨在打造讓用戶(hù)無(wú)需擔(dān)心基礎(chǔ)設(shè)施的預(yù)置或管理問(wèn)題。開(kāi)發(fā)人員可以使用 AWS Fargate 將其代碼封裝為無(wú)服務(wù)器容器,或使用 AWS Lambda 封裝為無(wú)服務(wù)器函數(shù)。無(wú)服務(wù)器的低運(yùn)營(yíng)開(kāi)銷(xiāo)特點(diǎn),這將繼續(xù)對(duì)計(jì)算的未來(lái)發(fā)揮關(guān)鍵作用。

隨著用戶(hù)越來(lái)越廣泛采用無(wú)服務(wù)器技術(shù),AWS 認(rèn)識(shí)到現(xiàn)行虛擬化技術(shù)還未同步發(fā)展,以針對(duì)此類(lèi)事件驅(qū)動(dòng)性,有時(shí)又呈短暫性特點(diǎn)的工作負(fù)載進(jìn)行優(yōu)化。AWS 認(rèn)為需要構(gòu)建特別針對(duì)無(wú)服務(wù)器計(jì)算設(shè)計(jì)的虛擬化技術(shù)。這種技術(shù)需要既能提供基于硬件虛擬化的虛擬機(jī)安全性邊界,同時(shí)又能保持容器和函數(shù)較小的封裝型號(hào)和敏捷性。

二、Firecracker 技術(shù)

2.1、簡(jiǎn)介

AWS Serverless服務(wù)和Firecracker技術(shù)的介紹

現(xiàn)在的技術(shù)環(huán)境下,容器具有快速啟動(dòng)時(shí)間和高密度,VM 可以對(duì)硬件虛擬化,具有更好的安全性,并對(duì)工作負(fù)載具有更好的隔離性。容器和 VM 的特性現(xiàn)在還不可兼得。

AWS 開(kāi)源了 Firecracker,一種利用 KVM 的新虛擬化技術(shù),專(zhuān)門(mén)用于創(chuàng)建和管理多租戶(hù)容器以及基于函數(shù)的服務(wù)。你可以在幾分之一秒內(nèi)在非虛擬化環(huán)境中啟動(dòng)輕量級(jí)微虛擬機(jī)(microVM),充分利用傳統(tǒng)虛擬機(jī)提供的安全性和工作負(fù)載隔離,同時(shí)兼具容器的資源效率。

Firecracker 是一種采用基于 Linux 內(nèi)核的虛擬機(jī) (KVM) 技術(shù)的開(kāi)源虛擬機(jī)監(jiān)控程序(VMM)。Firecracker 允許您創(chuàng)建微型虛擬機(jī),即 microVM。Firecracker 堅(jiān)持精簡(jiǎn)主義的設(shè)計(jì)原則,它僅包含運(yùn)行安全、輕量的虛擬機(jī)所需的組件。在設(shè)計(jì)過(guò)程的各個(gè)環(huán)節(jié),AWS 依據(jù)安全性、速度和效率要求來(lái)優(yōu)化 Firecracker。例如,僅啟動(dòng)相對(duì)較新的 Linux 內(nèi)核,并且僅啟動(dòng)使用特定配置選項(xiàng)集編譯的內(nèi)核(內(nèi)核編譯配置選項(xiàng)超過(guò) 1000 種)。此外,不支持任何類(lèi)型的圖形卡或加速器,不支持硬件透?jìng)?,不支持(大多?shù))老舊設(shè)備。

Firecracker 啟動(dòng)的內(nèi)核配置極少,不依賴(lài)仿真 BIOS,不使用完整設(shè)備模式。唯一的設(shè)備是半虛擬化網(wǎng)卡和半虛擬化硬盤(pán),以及單按鈕鍵盤(pán)(復(fù)位引腳在無(wú)電源管理設(shè)備時(shí)使用)。這種極簡(jiǎn)的設(shè)備模式不僅有利于縮短開(kāi)機(jī)時(shí)間(采用默認(rèn) microVM 型號(hào)的 i3.metal 實(shí)例開(kāi)機(jī)時(shí)間 < 125 毫秒),同時(shí)也減少了***面,從而提高了安全性。請(qǐng)參閱有關(guān) Firecracker 承諾支持以極低的開(kāi)銷(xiāo)執(zhí)行容器和無(wú)服務(wù)器工作負(fù)載的更多信息。

2017 年秋,AWS 決定以 Rust 語(yǔ)言來(lái)編寫(xiě) Firecracker,這是一種非常先進(jìn)的編程語(yǔ)言,可保證線(xiàn)程和內(nèi)存安全,防止緩存溢出以及可能導(dǎo)致安全性漏洞的許多其他類(lèi)型的內(nèi)存安全問(wèn)題。請(qǐng)?jiān)L問(wèn) Firecracker 設(shè)計(jì)以了解有關(guān) Firecracker VMM 功能和架構(gòu)的更多詳細(xì)信息。

由于設(shè)備模型極簡(jiǎn),內(nèi)核加載過(guò)程也簡(jiǎn)單,可以實(shí)現(xiàn)小于 125 ms 的啟動(dòng)時(shí)間和更少的內(nèi)存占用。Firecracker 目前支持 Intel CPU,并將于 2019 年開(kāi)始支持 AMD 和 ARM,還將與 containerd 等流行的容器運(yùn)行時(shí)集成。Firecracker 支持內(nèi)核版本為 4.14 及更高版本的 Linux 主機(jī)和客戶(hù)機(jī)操作系統(tǒng)。

Firecracker microVM 提高了效率和利用率,內(nèi)存開(kāi)銷(xiāo)極低,每 microVM 的內(nèi)存開(kāi)銷(xiāo) < 5MiB。這意味著用戶(hù)可以將數(shù)千個(gè) microVM 封裝到一個(gè)虛擬機(jī)中??梢允褂眠M(jìn)程中速率限制器來(lái)實(shí)現(xiàn)對(duì)網(wǎng)絡(luò)和存儲(chǔ)資源的共享方式的精細(xì)控制,即使跨數(shù)千個(gè) microVM 也同樣可行。所有硬件計(jì)算資源可以安全地超訂,從而最大化可以在主機(jī)上運(yùn)行的工作負(fù)載數(shù)量。

2.2、Firecracker 的優(yōu)勢(shì)

AWS 依據(jù)如下開(kāi)放源項(xiàng)目的指導(dǎo)信條開(kāi)發(fā)了 Firecracker。

  • 內(nèi)置安全性:AWS 提供了支持多租戶(hù)工作負(fù)載并且不會(huì)被客戶(hù)錯(cuò)誤禁用的計(jì)算安全性屏障??蛻?hù)工作負(fù)載被認(rèn)為既神圣(不可侵犯)又邪惡(應(yīng)當(dāng)拒之門(mén)外)。
  • 高性能:可以在短至 125 毫秒內(nèi)啟動(dòng) microVM(在 2019 年可以更快),使其成為眾多工作負(fù)載類(lèi)型的理想選擇,包括瞬態(tài)或短期工作負(fù)載。
  • 輕量虛擬化:重視瞬時(shí)性或無(wú)狀態(tài)的工作負(fù)載,而非長(zhǎng)時(shí)間運(yùn)行或持續(xù)性的工作負(fù)載。Firecracker 的硬件資源開(kāi)銷(xiāo)是明確且又保障的。
  • 久經(jīng)沙場(chǎng):Firecracker 經(jīng)過(guò)了很多測(cè)試,已經(jīng)為包括 AWS Lambda 和 AWS Fargate 在內(nèi)的多個(gè)高容量 AWS 服務(wù)提供支持。
  • 低開(kāi)銷(xiāo):Firecracker 每個(gè) microVM 消耗大約 5 MiB 的內(nèi)存。你可以在同一實(shí)例上運(yùn)行數(shù)千個(gè)具有不同 vCPU 和內(nèi)存配置的安全 VM。
  • 功能極簡(jiǎn)主義:不會(huì)構(gòu)建非我們的任務(wù)所明確要求的功能。每個(gè)功能僅實(shí)施一項(xiàng)。
  • 計(jì)算超訂:Firecracker 向來(lái)賓開(kāi)放的所有硬件計(jì)算資源都可以安全地超訂。
  • 開(kāi)源:Firecracker 是一個(gè)開(kāi)源項(xiàng)目。AWS 已經(jīng)準(zhǔn)備好審核并接受拉取請(qǐng)求。

2.3、Firecracker 的安全

  • 簡(jiǎn)單客戶(hù)機(jī)模型:Firecracker 客戶(hù)端提供了一個(gè)非常簡(jiǎn)單的虛擬化設(shè)備模型,以最小化***面:只有網(wǎng)絡(luò)設(shè)備,block I / O 設(shè)備,可編程定時(shí)器,KVM 時(shí)鐘,串行控制臺(tái)和一個(gè)不完全的 鍵盤(pán)(剛好足以讓 VM 重置)。
  • 進(jìn)程監(jiān)獄:使用 cgroups 和 seccomp BPF 對(duì) Firecracker 進(jìn)程進(jìn)行監(jiān)禁,并且可以訪(fǎng)問(wèn)一個(gè)嚴(yán)格控制的小型系統(tǒng)調(diào)用列表。
  • 靜態(tài)鏈接:Firecracker 進(jìn)程是靜態(tài)鏈接的,可以從進(jìn)程監(jiān)獄中啟動(dòng),以確保主機(jī)環(huán)境盡可能安全和干凈。

2.4、Firecracker 的工作模式

2.4.1、與宿主機(jī)的關(guān)系

Firecracker 運(yùn)行在 Linux 主機(jī)上,內(nèi)核為4.14或更新內(nèi)核,并且使用 Linux guest OSs (從這一點(diǎn)來(lái)說(shuō),稱(chēng)為 guest)。 啟動(dòng)該進(jìn)程后,在發(fā)出 instanceart 命令之前,用戶(hù)與 Firecracker API 交互以配置 microVM。

AWS Serverless服務(wù)和Firecracker技術(shù)的介紹

2.4.2、Firecracker 內(nèi)部架構(gòu)

每個(gè) Firecracker 進(jìn)程封裝一個(gè)且只有一個(gè) microVM。 該進(jìn)程運(yùn)行以下線(xiàn)程: API、 VMM 和 vCPU。 Api 線(xiàn)程負(fù)責(zé) Firecracker 的 API 服務(wù)器和相關(guān)的控制平面。 它永遠(yuǎn)不會(huì)在虛擬機(jī)的快速路徑上。 Vmm 線(xiàn)程公開(kāi)機(jī)器模型、最小遺留設(shè)備模型、 microVM 元數(shù)據(jù)服務(wù)(MMDS)和 VirtIO 設(shè)備仿真 Net 和 Block 設(shè)備,并提供 i / o 速率限制。 除此之外,還有一個(gè)或多個(gè) vCPU 線(xiàn)程(每個(gè)客戶(hù) CPU 核心一個(gè))。 它們是通過(guò) KVM 創(chuàng)建的,并運(yùn)行 KVM run 主循環(huán)。 它們?cè)谠O(shè)備模型上執(zhí)行同步 i / o 和存儲(chǔ)器映射輸入輸出操作。

AWS Serverless服務(wù)和Firecracker技術(shù)的介紹

2.4.3、Firecracker如何工作

AWS Serverless服務(wù)和Firecracker技術(shù)的介紹

Firecracker 在用戶(hù)空間中運(yùn)行,使用基于 Linux 內(nèi)核的虛擬機(jī)(KVM)來(lái)創(chuàng)建 microVM。每個(gè) microVM 的快速啟動(dòng)時(shí)間和低內(nèi)存開(kāi)銷(xiāo)使你可將數(shù)千個(gè) microVM 打包到同一臺(tái)機(jī)器上。這意味著每個(gè)函數(shù)或容器組都可以使用虛擬機(jī)屏障進(jìn)行封裝,從而使不同用戶(hù)的工作負(fù)載能在同一臺(tái)計(jì)算機(jī)上運(yùn)行,而無(wú)需在安全性和效率之間進(jìn)行權(quán)衡。Firecracker 是 QEMU 的替代品,QEMU 是一個(gè)成熟的 VMM,具有通用和廣泛的功能集,可以托管各種客戶(hù)操作系統(tǒng)。

可以通過(guò) RESTful API 控制 Firecracker 進(jìn)程,RESTful API 可以啟用常見(jiàn)操作:例如配置 vCPU 數(shù)量或啟動(dòng)計(jì)算機(jī)。Firecracker 提供內(nèi)置速率限制器,可精確控制同一臺(tái)計(jì)算機(jī)上數(shù)千個(gè) microVM 使用的網(wǎng)絡(luò)和存儲(chǔ)資源。你可以通過(guò) Firecracker API 創(chuàng)建和配置速率限制器,并靈活定義速率限制器來(lái)支持突發(fā)情況或特定帶寬 / 操作限制。Firecracker 還提供元數(shù)據(jù)服務(wù),可在主機(jī)和客戶(hù)機(jī)操作系統(tǒng)之間安全地共享配置信息。元數(shù)據(jù)服務(wù)可以使用 Firecracker API 設(shè)置。

Firecracker 現(xiàn)在還不能在 Kubernetes、Docker 或 Kata Container 上使用。Kata Container 是一個(gè)符合 OCI 標(biāo)準(zhǔn)的容器運(yùn)行時(shí),在基于 QEMU 的虛擬機(jī)中執(zhí)行容器。Firecracker 是 QEMU 的云原生替代品,專(zhuān)門(mén)用于安全高效地運(yùn)行容器,這是 Firecracker 和 Kata Container 以及 QEMU 之間的區(qū)別。

2.5、AWS Lambda&Fargate 實(shí)現(xiàn)

AWS Lambda 利用 Firecracker 作為沙箱環(huán)境的配置與運(yùn)行基礎(chǔ),AWS 會(huì)在沙箱環(huán)境之上執(zhí)行客戶(hù)代碼。由于Firecracker所配置的安全微虛擬機(jī)能夠以最小體積實(shí)現(xiàn)快速配置,因此能夠在不犧牲安全性水平的前提下帶來(lái)出色性能。如此一來(lái),AWS 將能夠在物理硬件之上實(shí)現(xiàn)高資源利用率——包括對(duì)為L(zhǎng)ambda分配及運(yùn)行工作負(fù)載的具體方式進(jìn)行優(yōu)化,并根據(jù)活動(dòng)/空閑時(shí)段以及內(nèi)存利用率等因素對(duì)工作負(fù)載加以混合。

在此之前,F(xiàn)argate Tasks 包含一個(gè)或者多個(gè)運(yùn)行于專(zhuān)用 EC2 虛擬機(jī)當(dāng)中的 Docker 容器,旨在確保任務(wù)間相互隔離。這些任務(wù)現(xiàn)在可以在 Firecracker 微虛擬機(jī)上執(zhí)行,這使得 AWS 能夠立足 EC2 裸機(jī)實(shí)例對(duì) Fargate 運(yùn)行時(shí)層進(jìn)行更快、更高效地配置,同時(shí)在不影響任務(wù)內(nèi)核級(jí)隔離能力的前提下提高工作負(fù)載密度。隨著時(shí)間的推移,這還使 AWS 得以繼續(xù)在運(yùn)行時(shí)層內(nèi)實(shí)現(xiàn)創(chuàng)新,為客戶(hù)提供更好的性能表現(xiàn),同時(shí)保持高安全性水平并降低運(yùn)行無(wú)服務(wù)器容器架構(gòu)的總體成本。

Firecracker目前運(yùn)行在英特爾處理器之上,并將在2019年年內(nèi)實(shí)現(xiàn)對(duì) AMD 以及 ARM 處理器的支持。

用戶(hù)可以在 AWS .metal 實(shí)例上運(yùn)行 Firecracker,同時(shí)也可將其運(yùn)行在任何其它裸機(jī)服務(wù)器之上,具體包括內(nèi)部環(huán)境以及開(kāi)發(fā)人員的筆記本電腦。

Firecracker 還將啟用目前極具人氣的容器運(yùn)行時(shí)(例如 containerd )將容器作為微虛擬機(jī)進(jìn)行管理。如此一來(lái),用戶(hù)的 Docker 與容器編排框架(例如 Kubernetes )將能夠使用 Firecracker。

三、Firecracker 入門(mén)

3.1、先決條件

Firecracker 入門(mén) 提供了有關(guān)如何下載 Firecracker 二進(jìn)制代碼、以不同的選項(xiàng)啟動(dòng) Firecracker、從源進(jìn)行構(gòu)建以及運(yùn)行集成測(cè)試等方面的詳細(xì)說(shuō)明。您可以通過(guò) Firecracker Jailer 在生產(chǎn)環(huán)境中運(yùn)行 Firecracker。

下面我們來(lái)看如何在 AWS 云上開(kāi)始使用 Firecracker(這些步驟可以在任何裸機(jī)上使用):

使用 Ubuntu 18.04.1 創(chuàng)建一個(gè) i3.metal 實(shí)例。

Firecracker 在 KVM 上構(gòu)建并且需要 /dev/kvm 的讀/寫(xiě)權(quán)限。登錄一個(gè)終端中的主機(jī),然后設(shè)置該訪(fǎng)問(wèn)權(quán)限:

sudo chmod 777 /dev/kvm

3.2、下載二進(jìn)制包

Firecracker 二進(jìn)制不依賴(lài)任何庫(kù),You can just download the latest binary from our release page, and run it on your x86_64 or aarch74 Linux machine.

wget https://github.com/firecracker-microvm/firecracker/releases/download/v0.21.0/firecracker-v0.21.0-x86_64
chmod +x firecracker-v0.21.0-x86_64
./firecracker-v0.21.0-x86_64 --api-sock /tmp/firecracker.sock

我們通過(guò) ps -ef 查看到 firecracker 的進(jìn)程為 3501,然后查看一下其占用內(nèi)存情況,發(fā)現(xiàn)為啟動(dòng)前只占用 4kb 內(nèi)存。

# cat /proc/3501/status|grep VmRSS
VmRSS:         4 kB

3.3、運(yùn)行 Firecracker

3.3.1、修改 vcpu 和 內(nèi)存

現(xiàn)在我們啟動(dòng)了一個(gè) microVM,每個(gè) microVM 都可以使用 REST API 來(lái)訪(fǎng)問(wèn)。在另一個(gè)終端中查詢(xún) microVM:

# curl --unix-socket /tmp/firecracker.sock "http://localhost/machine-config"
{ "vcpu_count": 1, "mem_size_mib": 128,  "ht_enabled": false,  "cpu_template": "Uninitialized" }

這將啟動(dòng)一個(gè) VMM 進(jìn)程并等待 microVM 配置。默認(rèn)情況下,每個(gè) microVM 將分配一個(gè) vCPU 和 128MiB 內(nèi)存,如果需要修改 vCPU 和內(nèi)存大小,可以向 microVM API 發(fā)送下面的請(qǐng)求:

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": 2,
        "mem_size_mib": 4096,
        "ht_enabled": false
    }'

3.3.2、設(shè)置啟動(dòng)內(nèi)核和根目錄

現(xiàn)在此 microVM 需要使用解壓后的 Linux 內(nèi)核二進(jìn)制代碼和將用作根文件系統(tǒng)的 ext4 文件系統(tǒng)來(lái)進(jìn)行配置。

下載示例內(nèi)核和 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

設(shè)置來(lái)賓內(nèi)核:

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" 
    }'

返回如下內(nèi)容:

HTTP/1.1 204 
Server: Firecracker API
Connection: keep-alive

然后設(shè)置根文件系統(tǒng):

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
    }'

3.3.3、啟動(dòng) microVM

配置好內(nèi)核和根文件系統(tǒng)后,將會(huì)啟動(dòng)來(lái)賓虛擬機(jī):

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"
    }'

第一個(gè)終端現(xiàn)在將顯示一個(gè)序列 TTY,提示您登錄到來(lái)賓虛擬機(jī),我們切換到第一個(gè)終端可以看到 microVM 的整個(gè)啟動(dòng)過(guò)程,我們通過(guò)啟動(dòng)過(guò)程可以看到,啟動(dòng)完成大約需要 150ms,我貼在下面:

[    0.000000] Linux version 4.14.55-84.37.amzn2.x86_64 (mockbuild@ip-10-0-1-79) (gcc version 7.3.1 20180303 (Red Hat 7.3.1-5) (GCC)) #1 SMP Wed Jul 25 18:47:15 UTC 2018
[    0.000000] Command line: console=ttyS0 reboot=k panic=1 pci=off root=/dev/vda rw virtio_mmio.device=4K@0xd0000000:5
[    0.000000] x86/fpu: Supporting XSAVE feature 0x001: 'x87 floating point registers'
[    0.000000] x86/fpu: Supporting XSAVE feature 0x002: 'SSE registers'
[    0.000000] x86/fpu: Supporting XSAVE feature 0x004: 'AVX registers'
[    0.000000] x86/fpu: xstate_offset[2]:  576, xstate_sizes[2]:  256
[    0.000000] x86/fpu: Enabled xstate features 0x7, context size is 832 bytes, using 'standard' format.
[    0.000000] e820: BIOS-provided physical RAM map:
[    0.000000] BIOS-e820: [mem 0x0000000000000000-0x000000000009fbff] usable
[    0.000000] BIOS-e820: [mem 0x0000000000100000-0x0000000007ffffff] usable
[    0.000000] NX (Execute Disable) protection: active
[    0.000000] DMI not present or invalid.
[    0.000000] Hypervisor detected: KVM
[    0.000000] tsc: Using PIT calibration value
[    0.000000] e820: last_pfn = 0x8000 max_arch_pfn = 0x400000000
[    0.000000] MTRR: Disabled
[    0.000000] x86/PAT: MTRRs disabled, skipping PAT initialization too.
[    0.000000] CPU MTRRs all blank - virtualized system.
[    0.000000] x86/PAT: Configuration [0-7]: WB  WT  UC- UC  WB  WT  UC- UC  
[    0.000000] found SMP MP-table at [mem 0x0009fc00-0x0009fc0f] mapped at [ffffffffff200c00]
[    0.000000] Scanning 1 areas for low memory corruption
[    0.000000] Using GB pages for direct mapping
[    0.000000] No NUMA configuration found
[    0.000000] Faking a node at [mem 0x0000000000000000-0x0000000007ffffff]
[    0.000000] NODE_DATA(0) allocated [mem 0x07fde000-0x07ffffff]
[    0.000000] kvm-clock: Using msrs 4b564d01 and 4b564d00
[    0.000000] kvm-clock: cpu 0, msr 0:7fdc001, primary cpu clock
[    0.000000] kvm-clock: using sched offset of 125681660769 cycles
[    0.000000] clocksource: kvm-clock: mask: 0xffffffffffffffff max_cycles: 0x1cd42e4dffb, max_idle_ns: 881590591483 ns
[    0.000000] Zone ranges:
[    0.000000]   DMA      [mem 0x0000000000001000-0x0000000000ffffff]
[    0.000000]   DMA32    [mem 0x0000000001000000-0x0000000007ffffff]
[    0.000000]   Normal   empty
[    0.000000] Movable zone start for each node
[    0.000000] Early memory node ranges
[    0.000000]   node   0: [mem 0x0000000000001000-0x000000000009efff]
[    0.000000]   node   0: [mem 0x0000000000100000-0x0000000007ffffff]
[    0.000000] Initmem setup node 0 [mem 0x0000000000001000-0x0000000007ffffff]
[    0.000000] Intel MultiProcessor Specification v1.4
[    0.000000] MPTABLE: OEM ID: FC      
[    0.000000] MPTABLE: Product ID: 000000000000
[    0.000000] MPTABLE: APIC at: 0xFEE00000
[    0.000000] Processor #0 (Bootup-CPU)
[    0.000000] IOAPIC[0]: apic_id 2, version 17, address 0xfec00000, GSI 0-23
[    0.000000] Processors: 1
[    0.000000] smpboot: Allowing 1 CPUs, 0 hotplug CPUs
[    0.000000] PM: Registered nosave memory: [mem 0x00000000-0x00000fff]
[    0.000000] PM: Registered nosave memory: [mem 0x0009f000-0x000fffff]
[    0.000000] e820: [mem 0x08000000-0xffffffff] available for PCI devices
[    0.000000] Booting paravirtualized kernel on KVM
[    0.000000] clocksource: refined-jiffies: mask: 0xffffffff max_cycles: 0xffffffff, max_idle_ns: 7645519600211568 ns
[    0.000000] random: get_random_bytes called from start_kernel+0x94/0x486 with crng_init=0
[    0.000000] setup_percpu: NR_CPUS:128 nr_cpumask_bits:128 nr_cpu_ids:1 nr_node_ids:1
[    0.000000] percpu: Embedded 41 pages/cpu @ffff880007c00000 s128728 r8192 d31016 u2097152
[    0.000000] KVM setup async PF for cpu 0
[    0.000000] kvm-stealtime: cpu 0, msr 7c15040
[    0.000000] PV qspinlock hash table entries: 256 (order: 0, 4096 bytes)
[    0.000000] Built 1 zonelists, mobility grouping on.  Total pages: 32137
[    0.000000] Policy zone: DMA32
[    0.000000] Kernel command line: console=ttyS0 reboot=k panic=1 pci=off root=/dev/vda rw virtio_mmio.device=4K@0xd0000000:5
[    0.000000] PID hash table entries: 512 (order: 0, 4096 bytes)
[    0.000000] Memory: 111064K/130680K available (8204K kernel code, 622K rwdata, 1464K rodata, 1268K init, 2820K bss, 19616K reserved, 0K cma-reserved)
[    0.000000] SLUB: HWalign=64, Order=0-3, MinObjects=0, CPUs=1, Nodes=1
[    0.000000] Kernel/User page tables isolation: enabled
[    0.004000] Hierarchical RCU implementation.
[    0.004000]  RCU restricting CPUs from NR_CPUS=128 to nr_cpu_ids=1.
[    0.004000] RCU: Adjusting geometry for rcu_fanout_leaf=16, nr_cpu_ids=1
[    0.004000] NR_IRQS: 4352, nr_irqs: 48, preallocated irqs: 16
[    0.004000] Console: colour dummy device 80x25
[    0.004000] console [ttyS0] enabled
[    0.004000] tsc: Detected 2299.998 MHz processor
[    0.004000] Calibrating delay loop (skipped) preset value.. 4599.99 BogoMIPS (lpj=9199992)
[    0.004000] pid_max: default: 32768 minimum: 301
[    0.004000] Security Framework initialized
[    0.004000] SELinux:  Initializing.
[    0.004187] Dentry cache hash table entries: 16384 (order: 5, 131072 bytes)
[    0.005499] Inode-cache hash table entries: 8192 (order: 4, 65536 bytes)
[    0.006697] Mount-cache hash table entries: 512 (order: 0, 4096 bytes)
[    0.008013] Mountpoint-cache hash table entries: 512 (order: 0, 4096 bytes)
[    0.009671] Last level iTLB entries: 4KB 64, 2MB 8, 4MB 8
[    0.010636] Last level dTLB entries: 4KB 64, 2MB 0, 4MB 0, 1GB 4
[    0.012005] Spectre V2 : Mitigation: Full generic retpoline
[    0.012987] Speculative Store Bypass: Vulnerable
[    0.025015] Freeing SMP alternatives memory: 28K
[    0.026799] smpboot: Max logical packages: 1
[    0.027795] x2apic enabled
[    0.028005] Switched APIC routing to physical x2apic.
[    0.030291] ..TIMER: vector=0x30 apic1=0 pin1=0 apic2=-1 pin2=-1
[    0.031291] smpboot: CPU0: Intel(R) Xeon(R) Processor @ 2.30GHz (family: 0x6, model: 0x4f, stepping: 0x1)
[    0.032000] Performance Events: unsupported p6 CPU model 79 no PMU driver, software events only.
[    0.032000] Hierarchical SRCU implementation.
[    0.032093] smp: Bringing up secondary CPUs ...
[    0.032817] smp: Brought up 1 node, 1 CPU
[    0.033456] smpboot: Total of 1 processors activated (4599.99 BogoMIPS)
[    0.034834] devtmpfs: initialized
[    0.035417] x86/mm: Memory block size: 128MB
[    0.036178] clocksource: jiffies: mask: 0xffffffff max_cycles: 0xffffffff, max_idle_ns: 7645041785100000 ns
[    0.037685] futex hash table entries: 256 (order: 2, 16384 bytes)
[    0.038868] NET: Registered protocol family 16
[    0.039717] cpuidle: using governor ladder
[    0.040006] cpuidle: using governor menu
[    0.044665] HugeTLB registered 1.00 GiB page size, pre-allocated 0 pages
[    0.045744] HugeTLB registered 2.00 MiB page size, pre-allocated 0 pages
[    0.046973] dmi: Firmware registration failed.
[    0.047770] NetLabel: Initializing
[    0.048026] NetLabel:  domain hash size = 128
[    0.048731] NetLabel:  protocols = UNLABELED CIPSOv4 CALIPSO
[    0.049639] NetLabel:  unlabeled traffic allowed by default
[    0.050631] clocksource: Switched to clocksource kvm-clock
[    0.051521] VFS: Disk quotas dquot_6.6.0
[    0.051521] VFS: Dquot-cache hash table entries: 512 (order 0, 4096 bytes)
[    0.053231] NET: Registered protocol family 2
[    0.054036] TCP established hash table entries: 1024 (order: 1, 8192 bytes)
[    0.055137] TCP bind hash table entries: 1024 (order: 2, 16384 bytes)
[    0.056156] TCP: Hash tables configured (established 1024 bind 1024)
[    0.057164] UDP hash table entries: 256 (order: 1, 8192 bytes)
[    0.058077] UDP-Lite hash table entries: 256 (order: 1, 8192 bytes)
[    0.059067] NET: Registered protocol family 1
[    0.060338] virtio-mmio: Registering device virtio-mmio.0 at 0xd0000000-0xd0000fff, IRQ 5.
[    0.061666] platform rtc_cmos: registered platform RTC device (no PNP device found)
[    0.063021] Scanning for low memory corruption every 60 seconds
[    0.064162] audit: initializing netlink subsys (disabled)
[    0.065238] Initialise system trusted keyrings
[    0.065946] Key type blacklist registered
[    0.066623] audit: type=2000 audit(1582381251.667:1): state=initialized audit_enabled=0 res=1
[    0.067999] workingset: timestamp_bits=36 max_order=15 bucket_order=0
[    0.070284] squashfs: version 4.0 (2009/01/31) Phillip Lougher
[    0.073661] Key type asymmetric registered
[    0.074318] Asymmetric key parser 'x509' registered
[    0.075091] Block layer SCSI generic (bsg) driver version 0.4 loaded (major 254)
[    0.076319] io scheduler noop registered (default)
[    0.077122] io scheduler cfq registered
[    0.077799] virtio-mmio virtio-mmio.0: Failed to enable 64-bit or 32-bit DMA.  Trying to continue, but this might not work.
[    0.079660] Serial: 8250/16550 driver, 1 ports, IRQ sharing disabled
[    0.102677] serial8250: ttyS0 at I/O 0x3f8 (irq = 4, base_baud = 115200) is a U6_16550A
[    0.105548] loop: module loaded
[    0.106732] tun: Universal TUN/TAP device driver, 1.6
[    0.107583] hidraw: raw HID events driver (C) Jiri Kosina
[    0.108489] nf_conntrack version 0.5.0 (1024 buckets, 4096 max)
[    0.109523] ip_tables: (C) 2000-2006 Netfilter Core Team
[    0.110405] Initializing XFRM netlink socket
[    0.111154] NET: Registered protocol family 10
[    0.112326] Segment Routing with IPv6
[    0.112931] NET: Registered protocol family 17
[    0.113638] Bridge firewalling registered
[    0.114325] sched_clock: Marking stable (112005721, 0)->(211417276, -99411555)
[    0.115605] registered taskstats version 1
[    0.116270] Loading compiled-in X.509 certificates
[    0.117814] Loaded X.509 cert 'Build time autogenerated kernel key: 3472798b31ba23b86c1c5c7236c9c91723ae5ee9'
[    0.119392] zswap: default zpool zbud not available
[    0.120179] zswap: pool creation failed
[    0.120924] Key type encrypted registered
[    0.123818] EXT4-fs (vda): recovery complete
[    0.124608] EXT4-fs (vda): mounted filesystem with ordered data mode. Opts: (null)
[    0.125761] VFS: Mounted root (ext4 filesystem) on device 254:0.
[    0.126874] devtmpfs: mounted
[    0.128116] Freeing unused kernel memory: 1268K
[    0.136083] Write protecting the kernel read-only data: 12288k
[    0.138147] Freeing unused kernel memory: 2016K
[    0.140430] Freeing unused kernel memory: 584K
OpenRC init version 0.35.5.87b1ff59c1 starting
Starting sysinit runlevel

   OpenRC 0.35.5.87b1ff59c1 is starting up Linux 4.14.55-84.37.amzn2.x86_64 (x86_64)

 * Mounting /proc ...
 [ ok ]
 * Mounting /run ...
 * /run/openrc: creating directory
 * /run/lock: creating directory
 * /run/lock: correcting owner
 * Caching service dependencies ...
Service `hwdrivers' needs non existent service `dev'
 [ ok ]
Starting boot runlevel
 * Remounting devtmpfs on /dev ...
 [ ok ]
 * Mounting /dev/mqueue ...
 [ ok ]
 * Mounting /dev/pts ...
 [ ok ]
 * Mounting /dev/shm ...
 [ ok ]
 * Setting hostname ...
 [ ok ]
 * Checking local filesystems  ...
 [ ok ]
 * Remounting filesystems ...
 [ ok[    0.292620] random: fast init done
 ]
 * Mounting local filesystems ...
 [ ok ]
 * Loading modules ...
modprobe: can't change directory to '/lib/modules': No such file or directory
modprobe: can't change directory to '/lib/modules': No such file or directory
 [ ok ]
 * Mounting misc binary format filesystem ...
 [ ok ]
 * Mounting /sys ...
 [ ok ]
 * Mounting security filesystem ...
 [ ok ]
 * Mounting debug filesystem ...
 [ ok ]
 * Mounting SELinux filesystem ...
 [ ok ]
 * Mounting persistent storage (pstore) filesystem ...
 [ ok ]
Starting default runlevel
[    1.088040] clocksource: tsc: mask: 0xffffffffffffffff max_cycles: 0x212733415c7, max_idle_ns: 440795236380 ns

Welcome to Alpine Linux 3.8
Kernel 4.14.55-84.37.amzn2.x86_64 on an x86_64 (ttyS0)

localhost login: 

3.3.4、登錄到 microVM

使用 root 和密碼 root 登錄以查看來(lái)賓虛擬機(jī)的終端:

Welcome to Alpine Linux 3.8
Kernel 4.14.55-84.37.amzn2.x86_64 on an x86_64 (ttyS0)

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[855]: root login on 'ttyS0'
localhost:~# 

您可以使用 ls / 查看文件系統(tǒng):

localhost:~# ls /
bin         home        media       root        srv         usr
dev         lib         mnt         run         sys         var
etc         lost+found  proc        sbin        tmp

這時(shí),我們?cè)俨榭匆幌缕湔加脙?nèi)存占用 36MB。

# cat /proc/3501/status|grep VmRSS
VmRSS:     36996 kB

使用 reboot 命令終止 microVM。為了權(quán)衡效率,F(xiàn)irecracker 目前并未實(shí)施來(lái)賓電源管理。相反,reboot 命令會(huì)發(fā)出一個(gè)鍵盤(pán)復(fù)位操作以作為關(guān)機(jī)開(kāi)關(guān)。

創(chuàng)建基本的 microVM 后,您可以添加網(wǎng)絡(luò)接口、更多的驅(qū)動(dòng)器以及繼續(xù)配置 microVM。

需要在您的裸機(jī)實(shí)例上創(chuàng)建上千個(gè) microVMs?

for ((i=0; i<1000; i++)); do
    ./firecracker-v0.21.0-x86_64 --api-sock /tmp/firecracker-$i.sock &
done

多個(gè) microVM 可以配置同一個(gè)共享根文件系統(tǒng),然后為每個(gè) microVM 分配自己的讀/寫(xiě)份額。

3.4、為 microVM 配置網(wǎng)絡(luò)

3.4.1、創(chuàng)建 tap 設(shè)備

目前創(chuàng)建的 microVM 沒(méi)有網(wǎng)絡(luò)或者其他 I/O,現(xiàn)在我們?yōu)槠渑渲镁W(wǎng)絡(luò),我們首先在宿主機(jī)上面為其添加一個(gè) tap0 設(shè)備。

sudo ip tuntap add tap0 mode tap

microVM 需要訪(fǎng)問(wèn)公網(wǎng),我們這里使用 NAT,這里需要配置 iptables,首先把 iptables 規(guī)則清除,以免引起其他問(wèn)題,我這里的宿主機(jī)網(wǎng)絡(luò)接口名稱(chēng)為enp4s0

sudo ip addr add 172.16.0.1/24 dev tap0
sudo ip link set tap0 up
sudo sh -c "echo 1 > /proc/sys/net/ipv4/ip_forward"
sudo iptables -t nat -A POSTROUTING -o enp4s0 -j MASQUERADE
sudo iptables -A FORWARD -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
sudo iptables -A FORWARD -i tap0 -o enp4s0 -j ACCEPT

現(xiàn)在我們可以查看創(chuàng)建的 tap0:

root@ip-172-31-20-74:~# ifconfig tap0
tap0: flags=4099<UP,BROADCAST,MULTICAST>  mtu 1500
        inet 172.16.0.1  netmask 255.255.255.0  broadcast 0.0.0.0
        ether fe:2d:e3:ba:09:ae  txqueuelen 1000  (Ethernet)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

如果我們一臺(tái)物理機(jī)要啟動(dòng)多個(gè) microVM,我們需要為每個(gè) microVM 創(chuàng)建 tap# 設(shè)備,為每個(gè) tap 設(shè)備設(shè)置 iptables NAT 規(guī)則。

3.4.2、為 microVM 配置 tap

在 microVM 啟動(dòng)之前,我們通過(guò) microVM API 為其配置網(wǎng)絡(luò)接口。

curl --unix-socket /tmp/firecracker.sock -i \
  -X PUT 'http://localhost/network-interfaces/eth0' \
  -H 'Accept: application/json' \
  -H 'Content-Type: application/json' \
  -d '{
      "iface_id": "eth0",
      "guest_mac": "AA:FC:00:00:00:01",
      "host_dev_name": "tap0"
    }'

3.4.3、為 microVM 配置 IP

我們登錄到 microVM 中,為其網(wǎng)絡(luò)接口 eth0 配置 IP:

ip addr add 172.16.0.2/24 dev eth0
ip link set eth0 up
ip route add default via 172.16.0.1 dev eth0

查看網(wǎng)絡(luò)情況。

localhost:~# ifconfig
eth0      Link encap:Ethernet  HWaddr AA:FC:00:00:00:01  
          inet addr:172.16.0.2  Bcast:0.0.0.0  Mask:255.255.255.0
          inet6 addr: fe80::a8fc:ff:fe00:1/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:6 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:0 (0.0 B)  TX bytes:516 (516.0 B)

localhost:~# ping 8.8.8.8
PING 8.8.8.8 (8.8.8.8): 56 data bytes
64 bytes from 8.8.8.8: seq=0 ttl=47 time=1.491 ms
64 bytes from 8.8.8.8: seq=1 ttl=47 time=1.118 ms
64 bytes from 8.8.8.8: seq=2 ttl=47 time=1.136 ms

3.4.4、清除網(wǎng)絡(luò)

當(dāng)我們刪掉某個(gè) microVM 的時(shí)候,可以把其相關(guān)網(wǎng)絡(luò)設(shè)備刪除。

sudo ip link del tap0
sudo iptables -F
sudo sh -c "echo 0 > /proc/sys/net/ipv4/ip_forward"

這里只是簡(jiǎn)單的介紹了一下 Firecracker 的使用方法,關(guān)于生產(chǎn)環(huán)境的使用,請(qǐng)?jiān)敿?xì)查看官方 github 文檔的推薦。

四、應(yīng)用

4.1、成本

讓我們直面這樣的現(xiàn)實(shí):云服務(wù)(IaaS)比擁有自己的基礎(chǔ)架構(gòu)更昂貴(如果你想要按需擴(kuò)展你的基礎(chǔ)架構(gòu))。同樣的道理,不必關(guān)心配置、管理和擴(kuò)展服務(wù)器是要需要付出代價(jià)。如果你的應(yīng)用十分簡(jiǎn)單,云服務(wù)并不是最優(yōu)解。

Fargate實(shí)好,但是其價(jià)格幾乎是等配置EC2實(shí)例的價(jià)格的 4 倍(例如t2.medium)這讓我們很難抉擇,讓我們期待它能夠降價(jià)。

AWS Serverless服務(wù)和Firecracker技術(shù)的介紹

4.2、我應(yīng)該將所有ECS任務(wù)都切換到Fargate嗎?

當(dāng)然不是。如上所述,在某些情況下,您的成本將增加三倍以上,所以在它們降低成本之前,您可能最好使用標(biāo)準(zhǔn)EC2實(shí)例。

但是,在以下情況下,F(xiàn)argate可能對(duì)您更有益:

  • 如果您無(wú)法很好地伸縮你的ECS任務(wù),會(huì)導(dǎo)致大量空閑的CPU或內(nèi)存,而使用Fargate,您只需為在任務(wù)中定義的資源付費(fèi)。
  • 對(duì)于按需或按定時(shí)計(jì)劃運(yùn)行的任務(wù),并不需要一直運(yùn)行著的EC2實(shí)例。使用Fargate,您只需在任務(wù)運(yùn)行時(shí)付款。
  • 適用于有內(nèi)存和/或CPU使用率峰值的任務(wù)。這僅僅是因?yàn)槭褂肍argate可以在這類(lèi)情況下節(jié)省您配置和管理的時(shí)間。


向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI