容器與無服務器,是競爭對手還是隊友?

作者 | Omer Hamerman

譯者 | 明知山

策劃 | 丁曉昀

本文解讀容器和無服務器函數,探索開發人員如何在技術棧中採用它們。

在 IT 行業,我們經常會聽到諸如雲計算、容器、無服務器框架等術語。

那麼什麼是雲計算?容器是如何工作的?函數又如何變成無服務器的?

本文將嘗試解讀這些技術術語,並探索開發人員應該如何在技術棧中考慮採用容器或無服務器函數。

例如,如果你的應用程序啓動時間較長,那麼容器可以更好地滿足你的需求。

需要進行大規模伸縮的高效無狀態函數將從運行無服務器函數中受益。

容器的工作原理

容器是被打包好的應用程序,包含了代碼以及必要的庫和依賴項,可以在任何環境中運行,不管是哪種操作系統。它可以幫助開發人員輕鬆地構建、發佈、部署和擴展應用程序。

圖 1 虛擬機與容器之間的比較

以前,在容器還不是那麼流行的時候,開發人員習慣於將應用程序部署在單獨的虛擬機中以實現隔離。每個虛擬機都需要一個客戶操作系統,需要物理硬件提供 CPU 和內存,這會導致虛擬機耗盡應用程序所需的資源。

採用了容器之後就不再需要客戶操作系統了,因爲容器引擎可以與一個或多個容器共享物理操作系統。與虛擬機相比,這是一個巨大的優勢,因爲現在更多的資源可用於應用程序。

容器鏡像是由開發人員創建的,其中包含了關於容器應該如何運行的指令。然後,開發人員可以使用容器鏡像來啓動運行實際應用程序的容器。它包含了可以在完全隔離的環境中運行的可執行代碼。應用程序的庫和依賴項也打包在鏡像中。Docker、Amazon ECS、Kubernetes 和 GCP Autopilot 是主要的容器化平臺。

什麼是無服務器函數

顧名思義,無服務器計算是計算機科學的一種範式,即開發人員不需要自己管理服務器,而由第三方服務來管理服務器,這樣開發人員就可以更多地關注應用程序邏輯,不需要操心與維護服務器相關的問題。無服務器函數,一般來說,是對容器的進一步抽象,兩者使用的是相同的底層技術。

無服務器計算的工作原理

如果沒有物理服務器,無服務器計算是不可能實現的——只是開發人員不需要與它們交互,因爲供應商(通常是像 AWS、Azure 或 GCP 這樣的雲供應商)承擔了管理服務器的工作。通常,無服務器基礎設施中是有容器的。例如,AWS 開源了他們的 Rust 項目,用於處理函數的實例化(firecracker)和用於承載容器節點的輕量級操作系統(bottlerocket)。在這種範式中,供應商爲開發人員提供了一個可以編寫和提交代碼的環境。平臺負責執行、分配物理內存、CPU 和輸出,並根據應用程序運行的時間以及內存和 CPU 消耗向用戶收費。這是一個巨大的優勢,因爲與自己運行或管理基礎設施相比,它大大降低了成本。需要注意的是,無服務器函數也利用了底層的容器。在你啓動無服務器函數時,雲平臺會啓動容器,應用程序將在容器中運行。因此,底層技術是相似的,只是環境的部署、擴展和使用方式不同。

容器與無服務器之間的

基本區別

你可以在下表中看到容器與無服務器函數之間的一些關鍵區別。

用   例

容器和無服務器計算有幾種日常的應用場景。有些解決方案可以通過使用容器或無服務器函數來實現。不過,主要的區別在於容器和無服務器函數的定價方式、與雲端其他應用程序和服務的集成以及基於負載進行伸縮的能力。

例如,如果你的應用程序是一個基於 IP 地址查找地理位置的短時間進程,那麼它可以是無服務器的。隨着請求數量的增加,無服務器函數將會自動伸縮,無需任何人工干預。如果是 Web 應用程序,需要長時間保持運行,那麼容器可能更合適。

此外,需要更快訪問存儲的進程可以使用容器,因爲它們可以與文件系統集成。一個例子是集成運行在 Amazon ECS 上的容器,這些容器可以使用高度可伸縮的 EFS 或 Azure Files 進行存儲。

下面的決策樹可能有助於決定選擇容器還是無服務器函數。

圖 2 選擇容器或無服務器函數的簡單決策樹

兩者之間可能存在重疊,下面將討論容器和無服務器函數的一些常見用例。

容器

編程語言支持

當你將應用程序打包到容器中,它就與平臺無關了。無服務器函數支持一些最常見的運行時環境,如 Java、Python、Go 等。但是,如果無服務器函數的運行時不支持應用程序所使用的編程語言,那麼容器將是理想的解決方案。容器可以使用任何容器編排平臺(如 Kubernetes)進行部署。

託管長時間運行的應用程序

容器更容易運行需要作爲服務長時間運行的 Web 應用程序。例如,跟蹤網站用戶行爲的跟蹤應用程序就可以使用容器部署。容器可以根據生成的事件進行伸縮。我們還可以利用 Kubernetes、AWS Fargate 等流行技術來編排容器。

無服務器

API 端點

組織可以使用無服務器應用程序爲 Web 或移動服務器部署 API 端點。這些 API 可以是無狀態的和短生命週期的,可以根據事件觸發。

物聯網處理

隨着家庭和工業自動化的發展,物聯網設備的使用顯著增加。這些物聯網設備可以利用無服務器計算的強大功能。

事件流

在實時事件流場景中,需要根據特定條件填充或過濾事件,開發人員可以使用短生命週期的無服務器函數。然後,你可以使用這些函數檢查事件是否有效,或者用人口統計信息來填充事件,等等。

總   結

容器和無服務器應用程序都是可以讓開發人員受益的與雲無關的工具。根據經驗,容器提供隔離性和靈活性,而無服務器有助於開發,並幫助你以最小的運行時成本進行自動伸縮。

選擇使用容器還是無服務器應用程序取決於具體的用例。例如,如果需要構建一個提供快速、短時間響應的 API 服務器,那麼無服務器框架會更好。如果應用程序需要始終可用和運行,那麼選擇容器化應用程序更合適。

原文鏈接:

https://www.infoq.com/articles/containers-serverless-rivals-cohorts/

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/0Ryy__29j96LoMkKhj90pA