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