概述#

虛擬化(Virtualization)讓多個模擬的虛擬電腦在單一實體電腦上運行,是現代軟體部署的基石。本章涵蓋共享資源的隔離機制、虛擬機器(VM)、容器(Container)、Pod 以及無伺服器架構(Serverless Architecture)等核心概念,說明這些技術如何影響架構師的設計決策。

共享資源(Shared Resources)#

基於經濟考量,組織廣泛採用資源共享來降低部署成本。需要共享的四種核心資源:

  • CPU:現代電腦有多個 CPU(每個 CPU 可有多個核心),也可能有 GPU 或 TPU 等專用處理器
  • 記憶體(Memory):實體電腦具有固定數量的實體記憶體
  • 磁碟儲存(Disk Storage):提供跨重啟的持久化儲存,包含傳統硬碟或固態硬碟
  • 網路連線(Network Connection):所有非平凡的實體電腦都有一個或多個網路連線

各資源的隔離機制

  • 處理器隔離:透過執行緒排程機制(Thread Scheduling),排程器選擇並分配執行緒給可用處理器,無法繞過排程器取得處理器控制權
  • 記憶體隔離:虛擬記憶體技術將行程的位址空間分割為頁面(Page),在實體記憶體與次級儲存之間進行交換,硬體支援位址空間的隔離
  • 磁碟隔離:透過磁碟控制器確保資料串流按序傳遞,作業系統以使用者 ID 和群組標記執行緒與磁碟內容,以限制存取
  • 網路隔離:每個 VM 或容器都有 IP 位址用於路由回應;另外透過 port 機制,服務監聽特定埠號以接收訊息

虛擬機器(Virtual Machines)#

虛擬機器允許在單一實體電腦上執行多個模擬的虛擬電腦。實體電腦稱為主機(Host),VM 稱為客體(Guest)。管理 VM 的作業系統稱為 Hypervisor

裸機 Hypervisor(Type 1)#

裸機(Bare-metal)Hypervisor 直接運行在實體硬體上,通常部署在資料中心或雲端環境。

Figure 16.1: Bare-metal hypervisor and VMs

託管 Hypervisor(Type 2)#

託管(Hosted)Hypervisor 作為服務運行在主機作業系統之上,通常用於桌上型或筆記型電腦。開發者可用它來:

  • 執行與主機 OS 不相容的應用程式(例如在 Windows 上執行 Linux 應用)
  • 在開發電腦上複製生產環境,確保開發與生產環境一致

Figure 16.2: Hosted hypervisor

Hypervisor 要求客體 VM 使用與底層實體 CPU 相同的指令集。若需跨處理器執行(如在 x86 上執行 ARM 程式),則需使用模擬器(Emulator),例如開源的 QEMU。

Hypervisor 的兩大功能#

  1. 管理 VM 內的程式碼:攔截 VM 對虛擬化磁碟或網路介面的外部通訊,由 Hypervisor 代為執行並標記(tagging)請求,以便將回應路由到正確的 VM
  2. 管理 VM 本身
    • 依據使用者或雲端基礎設施的指令建立與銷毀 VM
    • 監控 VM 的健康狀態與資源使用
    • 作為 VM 的安全防禦邊界
    • 確保 VM 不超過 CPU、記憶體、磁碟與網路 I/O 的資源使用限制

VM 對架構師的意涵#

  • 效能:虛擬化有效能成本。Type 1 Hypervisor 開銷較小,Type 2 可能顯著更高。微軟 Hyper-V 的報告顯示約 10% 的效能開銷
  • 關注點分離:虛擬化讓架構師可將執行期資源視為商品(Commodity),將佈建與部署決策延後至他人或其他組織

VM 映像檔(VM Images)#

VM 映像檔是啟動 VM 所載入的磁碟儲存內容,包含作業系統與服務的指令與資料。建立新映像檔的三種方式:

  • 從已運行的機器建立快照(Snapshot)
  • 從既有映像檔出發,加入額外軟體
  • 從零開始,使用安裝媒體格式化磁碟並安裝 OS

使用非自行建立的映像檔時需注意風險:無法控制 OS 與軟體版本、映像檔可能包含漏洞或惡意軟體。

VM 映像檔的其他重要特性:

  • 映像檔體積龐大,網路傳輸耗時
  • 映像檔與所有相依性綁定在一起
  • 可在開發電腦上建構映像檔,再部署至雲端
  • 為避免映像檔增生失控,通常建立只含 OS 的基礎映像檔,VM 啟動後再透過**配置(Configuration)**流程加入服務

容器(Containers)#

VM 雖然解決了資源共享與隔離問題,但映像檔體積大、傳輸與啟動都耗時。容器在保留虛擬化大部分優勢的同時,大幅縮短映像檔傳輸與啟動時間。

Figure 16.3: Containers on top of a container runtime engine

容器的運作原理#

容器運行在**容器執行引擎(Container Runtime Engine)**之上,引擎又運行在固定的作業系統上。關鍵差異在於:

  • VM 虛擬化的是硬體,每個 VM 都有完整的 OS
  • 容器虛擬化的是作業系統,所有容器共享同一個 OS 核心

這帶來兩個效能改善來源:

  1. 共享 OS:目標機器只要有標準的容器執行引擎,容器映像檔不需包含 OS
  2. 層(Layer)機制:容器映像檔由多個層堆疊而成,更新時只需傳輸變更的層

容器映像檔的層疊建構#

LAMP Stack(Linux, Apache, MySQL, PHP)為例:

  1. 建立含 Linux 發行版的容器映像檔
  2. 執行該映像檔,載入 Apache,存為第二個映像檔
  3. 執行第二個映像檔,載入 MySQL,存為第三個映像檔
  4. 執行第三個映像檔,載入 PHP,存為第四個映像檔(完整 LAMP Stack)

當 PHP 更新時,容器管理系統只需移動 PHP 層,無需移動整個 Stack。

層機制僅對最上層有效。若要更新中間層(如 MySQL),需從該層開始重新建構後續所有層。

將容器映像檔建構步驟寫成腳本並納入版本控制,可確保團隊成員建立一致的映像檔。將這些腳本視為程式碼管理,帶來可設計、可測試、可審查、可分享的優勢。

容器 vs. 虛擬機器(Containers and VMs)#

面向VM容器
虛擬化對象實體硬體作業系統
OS 支援任何 OS僅限 Linux、Windows、iOS
服務管理透過 OS 功能啟停透過容器執行引擎啟停
生命週期VM 在服務終止後持續存在容器在服務終止後即停止
映像檔大小大(包含完整 OS)小(僅含必要程式與函式庫)
服務數量可運行多個服務通常運行單一服務
Port 限制有部分限制

VM 的優勢:可運行幾乎任何程式(對 Legacy 或購買的軟體很重要);緊密耦合的服務或共享大型資料集時,可利用同 VM 內高效的通訊機制。

容器的優勢:映像檔小、啟動快、更新時只需傳輸變更的層。

容器可攜性(Container Portability)#

多家供應商提供容器執行引擎,包括 DockercontainerdMesosOpen Container Initiative 已標準化容器與執行引擎之間的介面,意味著:

  • 用 Docker 建立的容器可在 containerd 上執行
  • 可在開發電腦上開發容器,部署到生產環境執行

不同環境的可用資源不同,因此部署仍非完全平凡。將所有資源指定為配置參數可簡化容器移入生產環境的流程。

Pod#

Kubernetes 是管理容器部署、管理與擴展的開源編排軟體。其階層架構為:Node(硬體或 VM) 包含 PodPod 包含 Container

Figure 16.4: Node with Pods that in turn have containers

同一 Pod 中的容器具有以下共享特性:

  • 共享 IP 位址與 port 空間
  • 可使用 IPC 機制(如 semaphore 或共享記憶體)互相通訊
  • 共享 短暫儲存卷(Ephemeral Storage Volume),存活期間與 Pod 相同
  • 相同生命週期 — 一起分配、一起釋放

Pod 的目的是降低緊密相關容器之間的通訊成本。將頻繁互相通訊的容器放入同一 Pod,可利用比訊息傳遞更快的通訊機制。Service Mesh 經常以 Pod 形式包裝。

無伺服器架構(Serverless Architecture)#

容器的載入時間極短 — 冷啟動僅需數秒,重新分配僅需數毫秒。利用這個特性,無伺服器架構將容器的分配與釋放完全交由基礎設施管理:

  • 每個請求分配一個新的容器實例
  • 服務處理完請求後即退出,容器停止並釋放
  • 開發者不需負責分配或釋放伺服器與容器執行引擎

雲端服務商提供的此功能稱為 Function-as-a-Service(FaaS)

無伺服器的關鍵約束#

由於容器隨請求動態分配與釋放,這些短暫存活的容器不能維護任何狀態。協調所需的狀態必須儲存在雲端供應商的基礎設施服務中,或作為參數傳遞。

雲端供應商的實務限制#

  • 基礎映像檔選擇有限:限制了程式語言與函式庫相依性,以縮短容器載入時間
  • 冷啟動延遲:首次分配與載入容器可能需數秒;後續請求因映像檔已快取而近乎即時
  • 執行時間限制:服務必須在供應商設定的時間限制內處理完請求,否則會被終止

有些設計者投入大量精力規避這些限制 — 例如預啟動服務以避免冷啟動延遲、發送虛擬請求以保持服務在快取中、或串接請求以延長有效執行時間。這些做法增加了系統的複雜度。

總結#

  • 虛擬化提供高效、經濟的網路服務分配平台
  • VM 透過 Hypervisor 實現 CPU、記憶體、磁碟和網路的隔離共享,最小化需購買的實體機器數量
  • VM 映像檔是載入 VM 以啟用執行的位元集合,可透過多種佈建技術建立
  • 容器虛擬化作業系統而非硬體,體積更小、啟動更快,透過層機制實現高效更新
  • 容器執行引擎的介面已由 Open Container Initiative 標準化
  • Pod 將多個容器分組,確保一同分配並實現快速容器間通訊
  • 無伺服器架構將容器的分配與釋放責任移交給雲端供應商基礎設施,實現按請求即時啟動