Container vs VM: When and Why?

Container vs VM: When and Why?

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

Container

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

katacontainers

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.