Container vs VM: When and Why?

Container vs VM

Container 跟 Virtual Machine 的使用時機在網路上已經被討論了很久。每個人都有自己的看法和意見,有些人支持純 Container,有些支持純 VM,也有些支持 Container on VM。本篇文章將以個人看法針對 Container vs VM 做介紹跟其適用的使用時機做論述。

Container

Container Architecture

Container 在這 5 年來快速竄紅,憑的是其輕量化和快速部署的彈性。與其虛擬化整個硬體,Container 透過 cgroups 跟 namespace 將 host OS 的資源做隔離,也有人稱之為 OS 的虛擬化。 Container 共用 host 上的 kernel,只有其獨立的 binary 跟 libraries,所以比起 VM 在 image 大小跟啟動速度都快的許多。

Container 的優點:

  • Image 很小:因為跟 host 共用 kernel,只需要提供需要的 OS 元件跟 libraries。
  • 速度:部署極快,通常花數秒就可以生成一個 container。
  • 可攜性:在正確的 kernel 下 ,container 可以容易在不同 host 或環境中移動。
  • CI/CD:container 因其可攜性跟速度在 CI/CD 的建置相對 VM 來得容易。
  • 週期管理:container 需要更新只需利用新的 image 重新啟動即可。

需要解決的問題:

  • 安全性:跟 host 共用 kernel,安全性比起虛擬化整個硬體來得差。
  • 無法選擇 OS:同樣因為跟 host 共用 kernel 的關係,因此沒辦法在每個 container 都運行不同的 kernel。
  • 需要比較複雜的網路:container 通常切分成 micro-service 的方式做部署,在各元件中的網路連結會比較複雜。

VM

VM 相對 container 是比較老跟成熟的技術。VM 會虛擬化整個硬體層並在上面安裝 OS,使用起來比較像一台獨立的系統。

VM 的優點:

  • 整個系統的虛擬化:這讓 VM 在使用上跟 baremetal server 沒有什麼差別,能夠比較直覺的操作。
  • 不需要拆分應用程式:由於使用上跟 baremetal server 相同,可以不需要大幅更改應用程式的架構。
  • 安全性:由於整個硬體層都是虛擬化的,安全跟隔離性相對 container 好很多。
  • OS 選擇的彈性:在 VM 上可以自由選擇安裝不同的 OS

缺點:

  • 大小:VM 的 image 大小很大,通常是 GB 以上。
  • 啟動速度:VM 的啟動可能需要花個數分鐘,對需要快速增加應對需求的場合就沒有那麼好。
  • 運行速度:VM 由於需要虛擬化硬體層,效能相較於 baremetal server 會有一些減損。

使用時機

Container

使用 Baremetal Container 前應該先評估過以下條件:

  • Application 已經 microservice 化:Container 在使用的 best practice 需要使用 microservice 的架構。
  • 運行的是 trusted code:如果運行的是 trusted code 可以避免各種 kernel 漏洞被利用。
  • 有完善的 baremetal 部署機制:Container 還是需要跑在裝有 OS 的 baremetal server 上,這時就需要一個完整的 baremetal provisioning 機制。
  • 沒有特殊的網路需求:現在 Container Orchestration Engine 如 Kubernetes 對於特殊網路需求例如多網卡等受限於 CNI spec 支援並不是很好。

Baremetal Provisioning 近期在 OpenStack 也是可快速發展的方向,新推出的 Rocky 版本 Ironic 就新增了許多實用的功能。有興趣的可以讀 What you need to know about the OpenStack Rocky release

Virtual Machine

VM 的部分則有相當不一樣的條件需要評估

  • Application 不需要快速 scale out:VM 在生成的速度比 container 慢許多,如果需要快速的 scale out 因應 load spike,效果沒有 container 好。
  • 運行 untrusted code:運行 untrusted code 會建議在 VM 上,有比較完善的隔離。這也是為什麼 Public Cloud 上跑的還是隔了一層 VM,因為服務提供者無法確認使用者會在上面運行什麼程式。
  • 需要 hard multi-tenancy:hard multi-tenancy 在 Container Orchestration Engine 上還沒有被實現。
  • 有特殊的網路需求:VM 在動態 plug-in, plug-out 新網卡、多網卡等應用上發展比較完善。

目前 VM 最大宗的使用需求還是在傳統應用程式還有 Public Cloud 上。前者是因為並非 microservice 架構,使用 container 意義不大,後者則是使用者的隔離性還有系統的安全性考量後的選擇。

Somewhere in the Middle

Kata Containers

Kata containers architecture

Kata Containers 是去年開始的一個 open source 專案,目標是要提供輕量化且快速的VM based containers。有別於一般使用 namespace 做隔離的 container,kata 將 container 放在輕量化的 VM 之中以提升安全性,希望在速度和安全性中達到平衡。

Kata Containers 透過輕量化的 VM 做隔離,這時就能夠在其中運行 untrusted code,但又同時達到接近 container 的速度。算是一種介於 VM 跟 container 中的解決方法。目前在 community 上還沒有聽到大量使用的 use case,但是是一個很值得探討跟嘗試應用在各種不同環境中。

結論

現今大多數情況下,VM 仍然作為 Infrastructure 的基礎,而 Container 則作為 Application 的基礎。Container 跟 VM 都有其適合應用的時機,兩者目前還是屬於可以共存的並且互相應用的狀態。

最後,軟體的世界跟愛情一樣,沒有唯一的最佳解,只有最適合不同應用的解決方法,挑選最適合自己應用的解決方法才是正確的做法,千萬不要當前世界流行什麼,就一窩蜂的轉移什麼。

Reference

Kata Containers
To containerize or not to containerize, that is the question, or Containers vs VMs: the eternal debate


Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.