從虛擬機到容器,詳談各種服務虛擬化技術及其應用場景
本文轉載自微信公眾號「 jameswhale的技術人生」,轉載本文請聯系 jameswhale的技術人生公眾號。
原文鏈接:https://mp.weixin.qq.com/s/LOXB36aevXoH9EQHFr5E9Q
原文出處: jameswhale的技術人生
微信公眾號的ID:jameswhale的技術人生
前言
近幾年容器(Container)、Kubernetes等技術在數據中心、云計算、各互聯網公司的業務服務中得到廣泛應用,和20世紀60年代就興起的虛擬機(Virtual Machine,VM)技術一樣,容器也是一種服務虛擬化技術(Server Virtualization),但是它更加輕量,同時將焦點從Machine轉移到Application,極大提高了開發、測試、生產環境部署的效率,不過其安全性和隔離性比虛擬機稍遜一籌,在一些場景下也無法完全替代虛擬機。本文主要從以下幾部分來梳理虛擬機和容器技術,詳細講一下他們的區別與聯系。
- 為何需要服務虛擬化技術
- 虛擬化技術分類
- Host-based server virtualization(虛擬機)架構
- OS virtualization(容器)架構
- 內核對容器的支持
- 虛擬機技術舉例(VMWare ESXi)
- 容器技術舉例(Docker Container)
- 虛擬化技術在云平臺的應用( Google Cloud Platform, GCP )
為何需要服務虛擬化技術?
- 節省硬件資源(機房、服務器、冷卻系統等),提高資源利用率:12306網站的負載存在明顯的峰值和低谷(節日前夕較大,春運最為明顯,而在平時則比較低),若完全用實體服務器去抗峰值流量,在平時則會出現巨大浪費。通過服務虛擬化(Server Virtualization/Machine Virtualization)技術構建的云計算平臺(Cloud Computer Platform)則可以有效解決這一難題,峰值時增加算力去滿足購票需求,低谷時則將算力售賣出去以提高資源的利用率。騰訊云可以按照CPU、內存、存儲(比如1C/1G/50GB)等方式對外提供服務,普通用戶不用為購買服務器、搭建機房、規劃網絡訪問、數據容災而煩勞,就像購買水、電、煤氣等基本市政服務一樣。
- 邏輯資源整合:通過虛擬機(Virtual Machine,簡稱VM)技術,多個不同的Guest操作系統(及運行在其上的各種應用程序)可以運行在一臺物理服務器上面,例如,郵件服務器、數據庫服務器、Web服務器等應用可以部署在一起,同時可以做到有效的隔離(資源和訪問)。
- 服務器可移植性:Virtual Machine Monitor/Hypervisor屏蔽底層差異,同一Guest操作系統可以在硬件架構完全不同的服務器上運行(Mac,X86等),沒有硬件依賴,它可以從一種硬件服務器遷移到另外一臺完全不同的硬件服務器,不需要做改變和適配,用戶無感知。
- 應用程序可靠性:虛擬機(VM)所在的硬件服務器損壞后,可以快速遷移到另外一臺硬件服務器(都部署有Virtual Machine Monitor/Hypervisor),極大提高了其中運行的應用程序的可靠性。容器(Container)所在的Linux服務器無法訪問后,容器管理者(比如,K8s)可以在另外一臺Linux服務器創建一個新容器,業務不會受到影響。(借助虛擬機技術,容器也可以在非Linux服務器上運行,Guest操作系統為Linux即可。)
- 網絡和存儲也在采用虛擬化技術:從使用獨立磁盤冗余陣列(RAID)開始,存儲虛擬化已經出現了很多年,RAID提供了一種對物理磁盤進行邏輯分組并將這些分組作為一個或多個虛擬磁盤呈現給操作系統的方法。華為的OceanStor系列存儲陣列屬于存儲區域網絡(SAN),通過DevLun(設備邏輯單元號)來呈現給上層主機訪問,內部封裝了各種算法(SmartVirtualiztion,SmartQos,smartPartition等)保障主機的I/O訪問質量。網絡虛擬化是另一種已經存在了幾十年的虛擬化形式,例如,虛擬局域網(VLAN)長期以來提供了一種對物理網絡交換機進行邏輯細分的方法。因此,主機對其本地交換機的視圖并不局限于它所連接的交換機的物理組成,而是由VLAN本身的邏輯表示來確定。
服務虛擬化技術的分類
- 基于主機的服務器虛擬化技術(Host-based server virtualization ,虛擬機)允許具有不同操作系統的多個虛擬機(Virtual Machine)在同一物理主機系統上并發運行,又可以細分為如下三類。
- 完全虛擬化(Full virtualization):完全虛擬化提供了完整的硬件模擬,這有一個優勢,即完全的虛擬機可移植性,例如,允許在Dell服務器上運行的虛擬機重新定位到HP服務器,而不會出現任何問題。代價是性能會降低,內存讀寫大概損失2%,網絡和硬盤I/O大概損失8%~20%。
- 半虛擬化(Paravirtualizaton):虛擬機中的Guest操作系統需要重新編譯,讓其知道處于虛擬化環境中,以便可以和 Host 操作系統或者VMM/Hypervisor協調工作。可以通過兩種方式來實現半虛擬化:1)重新編譯操作系統內核,這需要操作系統品牌商提供和半虛擬化環境兼容的OSbuild;2)安裝半虛擬化的內核模式驅動,通過安裝半虛擬化的內核模式存儲和網絡驅動,可以有效降低硬盤和網絡讀寫延遲(從完全虛擬化的8%~20%降到2%)。
- 硬件輔助虛擬化( Hardware-Assisted Virtualization ):英特爾和AMD都積極致力于使其處理器實現虛擬化,意識到虛擬環境的存在,CPU可以直接和VMM/Hypervisor交互,讓其運行在Ring-1,這樣一來,Guest操作系統可以運行在Ring0,從而不需要借助于VMM/Hypervisor的Trap中斷來執行特權指令,極大降低了特權指令的執行延遲。在提高處理性能的同時,通過分配不同的硬件地址空間給虛擬機從而在硬件層面實現有效隔離。
綜合以上,直接訪問資源可以提供本機級別的性能,但是會犧牲可移植性,為了獲得更好的可移植性,虛擬化供應商將進一步開發可感知VMM/Hypervisor的半虛擬化Guest操作系統驅動程序,這些驅動程序將表示合成虛擬設備,如網卡和存儲控制器。使用合成設備驅動程序將允許 Guest 操作系統看到一組一致的硬件資源(即使遷移到不同的Host),同時仍然能夠提供接近本機的性能。
- 操作系統虛擬化技術(OS virtualization ,容器)
操作系統虛擬化以應用程序為中心,允許多個虛擬環境(VE)共享一個通用操作系統,每個環境的運行開銷比完全虛擬化的主機少得多。單就內存而言,虛擬機的需求就相當大。例如,假設八個虛擬機在一個Host服務器上運行,并且每個 Guest操作系統使用512MB的RAM。這意味著,在不計算應用程序或VMM開銷的情況下,虛擬化的成本將是8x512 MB,或者是4GB的RAM。假設每個操作系統安裝需要4GB的磁盤空間,那么物理主機系統上需要32GB的磁盤空間來存儲所有Guest操作系統。
操作系統虛擬化的另一個好處是它不需要虛擬環境中的任何驅動程序或完整硬件仿真。這允許虛擬環境中的I/O以接近本機的性能運行。由于VE作為應用程序外殼運行,它們提供了與VM相同的可移植性,不需要依賴于主機系統硬件(但是必須都在Linux操作系統上)。
安全性和隔離性不如虛擬機(操作系統提供的應用級別隔離),單就這一點,容器技術無法替代虛擬機技術。
Host-based server virtualization(虛擬機)架構
根據有無 Host 操作系統,虛擬機分為兩大類。
Type2(有操作系統)
VMM(Virtual Machine Monitor)/Hypervisor的作用
- 為VM提供硬件模擬(完全虛擬化場景下,其他場景是直接訪問硬件)。
- 隔離VM彼此之間的訪問(只可以通過網絡進行通信,例如socket)。
- 限制單個VM對系統資源的訪問,防止不穩定的VM影響整個系統性能。
指令的執行等級
指令執行等級分為Ring0~Ring3,通常操作系統內核運行在Ring0,設備驅動運行在Ring1~Ring2(也可都運行在Ring0),應用程序運行在Ring3。
- 傳統X86架構
- 虛擬機場景下(CPU硬件未協助)
- 虛擬機場景下(CPU硬件協助)
操作系統虛擬化技術(OS virtualization ,容器)
架構OS虛擬化層借助Linux操作系統內核的特性(比如namespace,cgroup等)為每個應用程序構建獨立的虛擬環境(VE-id),各自擁有獨立的根文件系統、啟動腳本、init、進程ID(同一虛擬環境下的進程ID不重復,不同虛擬環境下的進程ID可以重復),使其認為獨占了整個硬件系統。虛擬環境(VE)不需要安裝操作系統、設備驅動等,相比虛擬機,要省去了很多內存和硬盤開銷。同時,不需要模擬硬件指令(直接調用操作系統的system Call),虛擬環境中的應用程序執行性能接近本機。
內核對容器的支持
基于容器的虛擬化使用了內核提供的許多功能,以便隔離進程或實現其他有助于實現此目的的目標,大多數解決方案都基于Linux內核,由于內核提供了所需的大部分功能,容器工具包通常不必再次實現它們,內核代碼已經被其他被認為是穩定的并且已經在生產中使用的軟件所使用。如果內核提供的機制存在安全問題,則會隨著內核更新而分發修復程序,這意味著不需要修補容器軟件,用戶只需保持內核的最新狀態。
- chroot:chroot機制允許更改進程及其所有子進程的根目錄,用于限制對單個文件夾的文件系統訪問,目標進程及其子進程將該文件夾視為根文件夾(/)(不提供進程隔離)。
- namespace(by IBM):內核命名空間是進程隔離的基礎,是實現基于容器的虛擬化的關鍵概念之一,它能夠隔離進程、進程組甚至完整的子系統(如進程間通信或者內核的網絡子系統)。每個命名空間中的進程ID分配是獨立的,不同命名空間中的進程可能具有相同的進程ID。
- Control group(by Google ):cgroup是一種跟蹤進程和進程組(包括創建的子進程)的機制,它提供的鉤子允許其他子系統擴展這些功能,并實現細粒度的資源控制和限制。將資源分配給進程、進程組并管理這些分配的能力允許規劃和控制容器的使用。同樣,若有進程已聲明了對某些資源的占用,其他進程則無法使用。
- Mandatory Access Control :MAC策略通常用于限制對敏感資源的訪問(而這些訪問在一定上下文下是不需要的),以減輕從容器內部對主機和其他容器的攻擊,從而提高容器虛擬化技術的安全性。
虛擬機技術舉例(VMWare ESXi)
VMWare在虛擬機市場處于領導地位,以VMWare的ESXi舉例。
VMkernel提供與操作系統類似的功能,例如,進程創建與控制,信號,文件系統,進程和線程等,它是專門設計用來支持運行多個虛擬機,提供如下核心功能:資源調度,設備驅動,輸入輸出棧等。直接運行在硬件設備上面,不再需要借助通用的操作系統。
VMWareESXi優勢(相比其他虛擬機平臺)
- 極少的狀態信息:ESXi系統可以作為無狀態計算節點來處理,所有的狀態信息都可以從保存的配置文件中輕松上傳。
- 更好的安全性:ESXi僅使用少量的內存(32MB),接口少,從而使得被攻擊的危險降到最低。
- 硬件級的可靠性:當它集成到固件中時,軟件比存儲在磁盤上時更不容易損壞,通過消除本地磁盤驅動器可以提供更高的系統可靠性。
容器技術舉例(Docker)
Docker鏡像樣例
從鏡像到容器(實例化)
鏡像內容分發
容器虛擬化技術從FreeBSD jails,solaris Zones,到Linux Containers(LXC),再到這幾年名聲大噪的Docker Containers,極大的提高了開發、測試、生產環境部署的效率。Docker容器技術通常是指如下三個部分。
- 鏡像(image):鏡像是一個靜態規范,包括應用程序代碼和運行時配置設置,規定了容器運行起來后是什么樣子,它由若干個只讀層組成,一旦創建完成就不能修改(除非基于此鏡像再創建一個新鏡像),可通過Dockerfile來組織創建鏡像的多個命令。
- 容器(Container):容器是指鏡像的實例化,每個運行的容器在只讀的鏡像基礎上有一個可寫層,在容器運行期間發生變化的數據都保存在這個可寫層,容器被刪除后,這個可寫層內容也會被刪除。通過Docker–commit可顯示的進行保存(生成另外一個新的鏡像),不過,在實際業務場景,一般不會也不需要這么做。
- Docker Daemon(或者叫Docker Engine):介于容器和Linux操作系統之間的一個廋層,用于管理容器的持久運行時環境,正因為通過這一層來屏蔽底層差異,才可以讓Docker容器運行在任何Linux服務器上。
虛擬化技術在云平臺的應用(Google Cloud Platform,GCP)
Google Compute Engine(GCE,Google計算引擎)是Google云平臺的基礎設施即服務(IaaS)組件,它建立在運行Google搜索引擎、Gmail、YouTube和其他服務的全球基礎設施之上。GCE允許用戶按需啟動虛擬機(VMs),VMs可以從用戶創建的標準圖鏡像或自定義鏡像啟動。
GCE采用KVM作為其虛擬機的VMM/Hypervisor,KVM(Kernel-based Virtual Machine)是一個完全虛擬化方案,同時包含了CPU硬件提供的虛擬化技術擴展(IntelVT或AMD-V),適用于x86硬件上的Linux。可加載的內核模塊(kvm.ko,intel的是kvm-intel.ko,amd的是kvm-amd.ko)提供核心虛擬化基礎架構。使用KVM,可以運行多個含有未經修改的Linux或Windows Guest OS的虛擬機,每個虛擬機都有專用的虛擬硬件:網卡、磁盤、圖形適配器等。
通過K8s容器編排系統在VMs之上部署多個容器,一方面可以快速啟動程序(容器比虛擬機啟動時間要小很多),二是可以有效降低虛擬機的額外負載(容器可以部署多個,虛擬機則只能部署少量的),三是可以實現容器的自動升級、節點修復、自動擴縮容等特性。