容器(container),並非一種虛擬化(virtualization)技術,而是一種進程隔離(isolation)技術,從內核空間、資源和安全等方面對進程作隔離。linux
Linux 容器採用 Linux 控制組(cgroups)和命名空間(namespace),其中,cgroups 定義了一個進程能使用什麼(CPU、內存、網絡等資源),namespace 定義了一個進程能看到什麼(uid,gid,pid,mount,filesystem等)。一方面,並不是全部系統資源均可以經過這些機制來控制(好比時間和Keyring,https://blog.jessfraz.com/post/two-objects-not-namespaced-linux-kernel/)。另外一方面,在Linux 容器中運行的應用程序與常規(非容器化)應用程序以相同的方式訪問系統資源;直接對主機內核進行系統調用。內核以特權模式運行,容許它與必要的硬件交互並將結果返回陰應用程序。所以,即便使用了不少限制,內核仍然面向惡意程序暴露出了過多的攻擊面。git
除了cgroups 和 namespace,Linux 容器還會使用到象 seccomp 這樣的技術。seccomp是內核防火牆,限制一個進程對內核系統調用(systemcall)的訪問限制,可以在應用程序和內核之間提供更好的隔離,可是它們要求用戶建立預約義的系統調用白名單。在實際中,很難事先羅列出應用程序所需的全部系統調用。若是你須要調用的系統調用存在漏洞,那麼這類過濾器也很難發揮做用。github
所以,容器被認爲不具有和虛擬機以及沙盒(sanbox)同樣的隔離能力。關於容器、虛擬機和沙盒之間的區別,Jessie 的這篇博文(Setting the Record Straight: containers vs. Zones vs. Jails vs. VMs )給出了很好的解釋。編程
Jessie Frazelle(他的博客地址爲 https://blog.jessfraz.com,強烈推薦)將多租戶隔離模式分爲兩大類:安全
弱隔離(Soft multi-tenancy):同一個組織中的多個用戶使用同一個集羣。這種隔離模式中,由於用戶處於同一個組織中,所以互相之間默認是信任關係,可是也存在可能的狀況,好比有惡意的員工。這種隔離模式的主要目的就是爲了防止這種惡意事件。服務器
從上面的定義能夠看出,基本上,私有云的隔離模式是弱隔離模式,而公有云的隔離模式是強隔離模式。微信
由於容器天生隔離不足,若是隻是採用傳統 Linux 容器的話,公有云每每採用每一個用戶單首創建 Kubernetes 集羣的方式來實現強隔離:網絡
Jessie Frazelle 的這個圖是假設 K8S 可以在不一樣的宿主機上建立和管理不一樣的K8S 集羣(那時候 K8S 真的成爲集羣操做系統了)。實際上,當前這種角色每每由公有云本身的雲管平臺實現,而後在若干臺虛擬機或物理機上爲每一個用戶搭建完整的Kubernetes集羣,每一個集羣利用傳統的Linux 容器來運行客戶的應用。由於傳統Linux容器的隔離性不足,每一個用戶的容器必須容許在獨佔的環境中。架構
可是,若是把運行環境從 Linux 傳統容器換成微虛機(好比 kata container)的話,由於微虛機自己具備的強隔離能力,則能夠在一個宿主機上建立不一樣用戶的這種運行環境,此時這些環境在集羣中是混部的。less
AWS 上多個服務都利用到容器,好比 Lambda 利用了傳統Linux 容器,而 ECS 和 EKS 則利用了 Docker 容器。以 Lambda 爲例,咱們來看看過去和如今容器在AWS上的落地方式。
下圖是 Lambda 的技術架構:
從名字上基本上就能夠看出來每一個組件是幹什麼的。其中, 一個 Worker 就是實際運行用戶函數的一個安全環境。以前,一個 worker 是一個 EC2 實例,其操做系統爲 Amazon Linux。
下圖是 Worker 被建立以及函數被調度到 worker 中的基本流程:
其中,Worker manage 負責 worker 的建立和管理,Placement 服務負責將用戶的函數調度到某個或某些worker 上運行。
此時Lambda的強隔離模式的實現方式以下圖所示:
這個圖仍是簡單明瞭的,具體就不解釋了。
引用 AWS Lambda 團隊工程師所說的,基於CPU的硬件虛擬化技術是AWS上用戶之間隔離的最低要求。所以,和 AWS 上不少利用容器的服務同樣,Lambda 也利用了 EC2 虛機來實現用戶之間的強隔離。
可是,其侷限也是顯而易見的,好比:
亞馬遜在2018 年 re:invent 大會上宣佈了一個新的開源項目 Firecracker,並已經用在Lambda 和 Fargate 服務之中了。 Firecracker 是一種採用基於 Linux 內核的虛擬機 (KVM) 技術的開源虛擬機監控程序(VMM)。 Firecracker 負責建立和管理微虛機(microVM)。 Firecracker 微虛機提升了效率和利用率,內存開銷極低,使得在一臺物理服務器上能夠建立數千個微虛機。後文下面再介紹。
使用Firecracker後的 Lambda 隔離模型:
其好處也是不言自明的,好比:
Firecracker 的中文意思是『鞭炮』。顧名猜意,不知道AWS是否是認爲在公有云上運行容器就像放鞭炮同樣,看起來絢麗多彩,可是弄很差就會引發火災。
簡單地能夠將 Firecracker 看作被大大簡化了的 QEMU。它和 QEMU 同樣,利用 KVM,負責建立和管理虛機。由於這種虛機面向 Serverless 這種場景,適合於運行暫時性( transient and short-lived)進程,所以被稱爲微虛機,即microVM。
由於公有云對微虛機的要求是具備象常規虛擬機同樣的隔離能力,同時還有象Linux 容器那樣的輕量特性(硬件開銷小,啓動快)。所以,Firecracker 的設計思路是:
Firecracker 堅持精簡主義的設計原則,它僅包含運行安全、輕量的虛擬機所需的組件。在設計過程的各個環節,都依據安全性、速度和效率要求來優化 Firecracker。例如,僅啓動相對較新的 Linux 內核,而且僅啓動使用特定配置選項集編譯的內核(內核編譯配置選項超過 1000 種)。此外,不支持任何類型的圖形卡或加速器,不支持硬件透傳,不支持(大多數)老舊設備。只支持四種設備虛擬化(virtio-net, virtio-block, serial console, 和只有一個按鈕的鍵盤控制器)。
這麼作的結果也是很是明顯的,好比:
項目的開源地址是 https://firecracker-microvm.github.io/。更多信息,可查閱更多文章,甚至閱讀源碼。
AWS 宣佈開源 Firecracker在業界引發了很大的關注。加上以前已有的 Kata container(由Intel,Hyper.sh 和 OpenStack主導)和 gVisor(由Google開源),微虛機愈來愈引發人們的重視。基於我的理解,對將來作一點不負責任的預測:
參考連接:
感謝您的閱讀,歡迎關注個人微信公衆號: