深入理解虛擬化
什么是虛擬化
虛擬化技術(shù)是云計(jì)算的根基,在計(jì)算機(jī)技術(shù)中,虛擬化(技術(shù))或虛擬技術(shù)(英語:Virtualization)是一種資源管理技術(shù),是將計(jì)算機(jī)的各種實(shí)體資源(CPU、內(nèi)存、磁盤空間、網(wǎng)絡(luò)適配器等),予以抽象、轉(zhuǎn)換后呈現(xiàn)出來并可供分割、組合為一個(gè)或多個(gè)電腦配置環(huán)境。由此,打破實(shí)體結(jié)構(gòu)間的不可切割的障礙,使用戶可以比原本的配置更好的方式來應(yīng)用這些電腦硬件資源。這些資源的新虛擬部分是不受現(xiàn)有資源的架設(shè)方式,地域或物理配置所限制。一般所指的虛擬化資源包括計(jì)算(CPU+內(nèi)存),網(wǎng)絡(luò),存儲(chǔ)。
虛擬化的本質(zhì)
虛擬化本質(zhì)是指資源的抽象化,要想資源充分利用,必須把資源最小單位化(池化),這樣上層才能按需使用資源,虛擬化不但解放了操作系統(tǒng),也解放了物理硬件,大大提高了資源的利用率。

-
虛擬化管理程序Hypervisor(VMM),位于虛擬機(jī)與底層硬件設(shè)備之間的虛擬層,直接運(yùn)行于硬件設(shè)備之上,負(fù)責(zé)對(duì)硬件資源進(jìn)行抽象,為上層虛擬機(jī)提供運(yùn)行環(huán)境所需資源,并使每個(gè)虛擬機(jī)都能夠互不干擾、相互獨(dú)立地運(yùn)行于同一個(gè)系統(tǒng)中。
虛擬化主要分為幾大類:
- 計(jì)算虛擬化,針對(duì)CPU和內(nèi)存資源虛擬化技術(shù)。
- 網(wǎng)絡(luò)虛擬化,針對(duì)網(wǎng)絡(luò)鏈路資源虛擬化技術(shù)。
- IO虛擬化,針對(duì)IO資源虛擬化技術(shù)。
- 存儲(chǔ)虛擬化,針對(duì)磁盤存儲(chǔ)資源虛擬化技術(shù)。
計(jì)算虛擬化
計(jì)算虛擬化通過虛擬化管理程序(Hypervisor或VMM)將物理服務(wù)器的硬件資源與上層應(yīng)用進(jìn)行解耦,形成統(tǒng)一的計(jì)算資源池,然后可彈性分配給邏輯上隔離的虛擬機(jī)共享使用。如圖2、基于VMM所在位置與虛擬化范圍可以分三種類型。


容器(應(yīng)用級(jí)):容器是一種更加輕量的應(yīng)用級(jí)虛擬化技術(shù),將應(yīng)用的可執(zhí)行文件及其所需的運(yùn)行時(shí)環(huán)境與依賴庫打包,實(shí)現(xiàn)一次構(gòu)建,到處運(yùn)行的目標(biāo)。相比虛擬化,容器技術(shù)多了容器引擎層(如Docker),但上層應(yīng)用無需與Guest OS綁定,可以實(shí)現(xiàn)秒級(jí)部署、跨平臺(tái)遷移,靈活的資源分配,彈性調(diào)度管理等優(yōu)勢(shì)。容器、微服務(wù)與DevOps為云原生的三大要素,是推動(dòng)企業(yè)技術(shù)中臺(tái)建設(shè)與微服務(wù)化轉(zhuǎn)型不可或缺的組件。
實(shí)現(xiàn)-KVM
KVM是基于虛擬化擴(kuò)展(Intel VT 或者 AMD-V)的 X86 硬件的開源的 Linux 原生的全虛擬化解決方案。KVM 中,虛擬機(jī)被實(shí)現(xiàn)為常規(guī)的 Linux 進(jìn)程,由標(biāo)準(zhǔn) Linux 調(diào)度程序進(jìn)行調(diào)度;虛機(jī)的每個(gè)虛擬 CPU 被實(shí)現(xiàn)為一個(gè)常規(guī)的 Linux 進(jìn)程。這使得 KMV 能夠使用 Linux 內(nèi)核的已有功能。
但是,KVM 本身不執(zhí)行任何硬件模擬,需要客戶空間程序通過 /dev/kvm 接口設(shè)置一個(gè)客戶機(jī)虛擬服務(wù)器的地址空間,向它提供模擬的 I/O,并將它的視頻顯示映射回宿主的顯示屏。目前這個(gè)應(yīng)用程序是 QEMU。

- Guest:客戶機(jī)系統(tǒng),包括CPU(vCPU)、內(nèi)存、驅(qū)動(dòng)(Console、網(wǎng)卡、I/O 設(shè)備驅(qū)動(dòng)等),被 KVM 置于一種受限制的 CPU 模式下運(yùn)行。
- KVM:運(yùn)行在內(nèi)核空間,提供CPU 和內(nèi)存的虛級(jí)化,以及客戶機(jī)的 I/O 攔截。Guest 的 I/O 被 KVM 攔截后,交給 QEMU 處理。
- QEMU:修改過的為 KVM 虛機(jī)使用的 QEMU 代碼,運(yùn)行在用戶空間,提供硬件 I/O 虛擬化,通過 IOCTL /dev/kvm 設(shè)備和 KVM 交互。
KVM依賴的Intel/AMD 處理器的各種虛擬化擴(kuò)展:
處理器 | CPU 虛擬化 | 內(nèi)存虛擬化 | PCI Pass-through |
Intel | VT-x | VPID,EPT | VT-d |
AMD | AMD-V | ASID,NPT | IOMMU |
內(nèi)存虛擬化

除了CPU虛擬化,另一個(gè)關(guān)鍵是內(nèi)存虛擬化,通過內(nèi)存虛擬化共享物理系統(tǒng)內(nèi)存,動(dòng)態(tài)分配給虛擬機(jī)。虛擬機(jī)的內(nèi)存虛擬化很象現(xiàn)在的操作系統(tǒng)支持的虛擬內(nèi)存方式,應(yīng)用程序看到鄰近的內(nèi)存地址空間,這個(gè)地址空間無需和下面的物理機(jī)器內(nèi)存直接對(duì)應(yīng),操作系統(tǒng)保持著虛擬頁到物理頁的映射。
實(shí)現(xiàn)
現(xiàn)在所有的 x86 CPU 都包括了一個(gè)稱為內(nèi)存管理的模塊MMU(Memory Management Unit)和 TLB(Translation Lookaside Buffer),通過MMU和TLB來優(yōu)化虛擬內(nèi)存的性能。
KVM中,虛機(jī)的物理內(nèi)存即為 qemu-kvm 進(jìn)程所占用的內(nèi)存空間。KVM 使用 CPU 輔助的內(nèi)存虛擬化方式。在 Intel 和 AMD 平臺(tái),其內(nèi)存虛擬化的實(shí)現(xiàn)方式分別為:
- AMD 平臺(tái)上的 NPT (Nested Page Tables) 技術(shù)
- Intel 平臺(tái)上的 EPT (Extended Page Tables)技術(shù)
EPT 和 NPT采用類似的原理,都是作為 CPU 中新的一層,用來將客戶機(jī)的物理地址翻譯為主機(jī)的物理地址。關(guān)于 EPT, Intel 官方文檔中的技術(shù)如下:

EPT的好處是,它的兩階段記憶體轉(zhuǎn)換,特點(diǎn)就是將 Guest Physical Address → System Physical Address,VMM不用再保留一份 SPT (Shadow Page Table),以及以往還得經(jīng)過 SPT 這個(gè)轉(zhuǎn)換過程。除了降低各部虛擬機(jī)器在切換時(shí)所造成的效能損耗外,硬體指令集也比虛擬化軟體處理來得可靠與穩(wěn)定。
I/O虛擬化
I/O虛擬化(Input/output virtualization,簡稱IOV)是虛擬化的一種新形式,是來自物理連接或物理運(yùn)輸上層協(xié)議的抽象,讓物理服務(wù)器和虛擬機(jī)可以共享I/O資源。
I/O虛擬化實(shí)現(xiàn)


I/O 虛擬化方案的選擇:
- I/O設(shè)備盡量使用準(zhǔn)虛擬化(virtio 和 vhost_net)
- 如果需要實(shí)時(shí)遷移,不能使用 SR-IOV
- 對(duì)更高I/O要求又不需要實(shí)時(shí)遷移的,可以使用 SR-IOV
-
每種方案都有優(yōu)勢(shì)和不足,在特定環(huán)境下其性能有可能反而下降,因此在生產(chǎn)環(huán)境中使用各種虛擬化方式前需要經(jīng)過完整測試
網(wǎng)絡(luò)虛擬化

網(wǎng)絡(luò)虛擬化 (NV) 是指將傳統(tǒng)上在硬件中交付的網(wǎng)絡(luò)資源抽象化到軟件中。NV 可以將多個(gè)物理網(wǎng)絡(luò)整合為一個(gè)基于軟件的虛擬網(wǎng)絡(luò),或者可以將一個(gè)物理網(wǎng)絡(luò)劃分為多個(gè)隔離和獨(dú)立的虛擬網(wǎng)絡(luò)。

傳統(tǒng)網(wǎng)絡(luò)
- 在傳統(tǒng)網(wǎng)絡(luò)環(huán)境中,一臺(tái)物理主機(jī)包含一個(gè)或多個(gè)網(wǎng)卡(NIC),要實(shí)現(xiàn)與其他物理主機(jī)之間的通信,需要通過自身的 NIC 連接到外部的網(wǎng)絡(luò)設(shè)施,如交換機(jī)上。
-
這種架構(gòu)下,為了對(duì)應(yīng)用進(jìn)行隔離,往往是將一個(gè)應(yīng)用部署在一臺(tái)物理設(shè)備上,這樣會(huì)存在兩個(gè)問題,
1)是某些應(yīng)用大部分情況可能處于空閑狀態(tài),
2)是當(dāng)應(yīng)用增多的時(shí)候,只能通過增加物理設(shè)備來解決擴(kuò)展性問題。不管怎么樣,這種架構(gòu)都會(huì)對(duì)物理資源造成極大的浪費(fèi)。

其中虛擬機(jī)與虛擬機(jī)之間的通信,由虛擬交換機(jī)完成,虛擬網(wǎng)卡和虛擬交換機(jī)之間的鏈路也是虛擬的鏈路,整個(gè)主機(jī)內(nèi)部構(gòu)成了一個(gè)虛擬的網(wǎng)絡(luò),如果虛擬機(jī)之間涉及到三層的網(wǎng)絡(luò)包轉(zhuǎn)發(fā),則又由另外一個(gè)角色——虛擬路由器來完成。
虛擬化網(wǎng)絡(luò)實(shí)現(xiàn)
虛擬交換機(jī)-OVS
Open vSwitch 是在開源 Apache 2 許可下獲得許可的多層軟件交換機(jī)。我們的目標(biāo)是實(shí)現(xiàn)一個(gè)生產(chǎn)質(zhì)量交換平臺(tái),該平臺(tái)支持標(biāo)準(zhǔn)管理接口,并將轉(zhuǎn)發(fā)功能開放給程序化擴(kuò)展和控制。非常適合用作 VM 環(huán)境中的虛擬交換機(jī)。除了向虛擬網(wǎng)絡(luò)層公開標(biāo)準(zhǔn)控制和可見性接口外,它還旨在支持跨多個(gè)物理服務(wù)器的分布。支持多種基于 Linux 的虛擬化技術(shù),包括 Xen/XenServer、KVM 和 VirtualBox.

- datapath是負(fù)責(zé)數(shù)據(jù)交換的內(nèi)核模塊,其從網(wǎng)口讀取數(shù)據(jù),并快速匹配Flowtable中的流表項(xiàng),成功的直接轉(zhuǎn)發(fā),失敗的上交vswitchd處理。它在初始化和port binding的時(shí)候注冊(cè)鉤子函數(shù),把端口的報(bào)文處理接管到內(nèi)核模塊。
- vswitchd是一個(gè)守護(hù)進(jìn)程,是ovs的管理和控制服務(wù),通過unix socket將配置信息保存到ovsdb,并通過netlink和內(nèi)核模塊交互。
- ovsdb則是ovs的數(shù)據(jù)庫,保存了ovs配置信息。
虛擬網(wǎng)絡(luò)實(shí)現(xiàn)技術(shù)-Overlay
當(dāng)前主流overlay技術(shù)是 GRE 和 VXLAN技術(shù). 通過增加擴(kuò)展報(bào)文頭來實(shí)現(xiàn)虛擬網(wǎng)絡(luò)在物理網(wǎng)絡(luò)之上傳輸報(bào)文。
GRE

網(wǎng)絡(luò)虛擬化使用通用路由封裝 (NVGRE) 作為虛擬化 IP 地址的機(jī)制。在 NVGRE 中,虛擬機(jī)的數(shù)據(jù)包封裝在另一個(gè)數(shù)據(jù)包中。此新 NVGRE 格式數(shù)據(jù)包的標(biāo)頭具有相應(yīng)的源和目標(biāo)提供程序區(qū)域 (PA) IP 地址。此外,它還具有 VSID (24 位虛擬子網(wǎng) ID) ,該 ID 存儲(chǔ)在新數(shù)據(jù)包的 GRE 標(biāo)頭中。
VXLAN

Virtual eXtensible Local Area Network (VXLAN) 是一種將2層報(bào)文封裝到UDP包(Mac in UDP)中進(jìn)行傳輸?shù)囊环N封裝協(xié)議。VXLAN主要是由Cisco推出的,VXLAN的包頭有一個(gè)24bit的ID段,即意味著1600萬個(gè)獨(dú)一無二的虛擬網(wǎng)段,這個(gè)ID通常是對(duì)UDP端口采取偽隨機(jī)算法而生成的(UDP端口是由該幀中的原始MAC Hash生成的)。這樣做的好處是可以保證基于5元組的負(fù)載均衡,保存VM之間數(shù)據(jù)包的順序。
容器網(wǎng)絡(luò)實(shí)現(xiàn)

CNI(Container Network Interface) 是 google 和 CoreOS 主導(dǎo)制定的容器網(wǎng)絡(luò)標(biāo)準(zhǔn),它 是在 RKT 網(wǎng)絡(luò)提議 的基礎(chǔ)上發(fā)展起來的,綜合考慮了靈活性、擴(kuò)展性、IP分配、多網(wǎng)卡等因素。CNI旨在為容器平臺(tái)提供網(wǎng)絡(luò)的標(biāo)準(zhǔn)化。不同的容器平臺(tái)(比如目前的 Kubernetes、Mesos 和 RKT)能夠通過相同的接口調(diào)用不同的網(wǎng)絡(luò)組件。這個(gè)協(xié)議連接了兩個(gè)組件:容器管理系統(tǒng)和網(wǎng)絡(luò)插件,具體的事情都是插件來實(shí)現(xiàn)的,包括:創(chuàng)建容器網(wǎng)絡(luò)空間(network namespace)、把網(wǎng)絡(luò)接口(interface)放到對(duì)應(yīng)的網(wǎng)絡(luò)空間、給網(wǎng)絡(luò)接口分配 IP 等。
Kubernetes本身并不負(fù)責(zé)網(wǎng)絡(luò)通信,Kubernetes提供了容器網(wǎng)絡(luò)接口CNI(Container Network Interface),具體的網(wǎng)絡(luò)通信交給CNI插件來負(fù)責(zé),開源的CNI插件非常多,像Flannel、Calico等

存儲(chǔ)虛擬化
存儲(chǔ)虛擬化(Storage Virtualization)最通俗的理解就是對(duì)存儲(chǔ)硬件資源進(jìn)行抽象化表現(xiàn)。構(gòu)建具有統(tǒng)一邏輯視圖的存儲(chǔ)資源池供用戶按需使用。存儲(chǔ)虛擬化將各個(gè)分散的存儲(chǔ)系統(tǒng) 進(jìn)行整合和統(tǒng)一管理,并提供了方便用戶調(diào)用資源的接口。另外,存儲(chǔ)虛擬化能夠?yàn)楹罄m(xù)的系統(tǒng)擴(kuò)容提供便 利,使資源規(guī)模動(dòng)態(tài)擴(kuò)大時(shí)無需考慮新增的物理存儲(chǔ)資源(如不同型號(hào)的存儲(chǔ)設(shè)備)之間可能存在的差異。

實(shí)現(xiàn)

存儲(chǔ)虛擬化的實(shí)現(xiàn)方式:
(1) 裸金屬+邏輯卷
(2) 存儲(chǔ)設(shè)備虛擬化
(3) 主機(jī)存儲(chǔ)虛擬化+文件系統(tǒng)
存儲(chǔ)虛擬化分類
文件、塊和對(duì)象是三種以不同的方式來保存、整理和呈現(xiàn)數(shù)據(jù)的存儲(chǔ)格式。這些格式各有各的功能和限制。
- 文件存儲(chǔ)會(huì)以文件和文件夾的層次結(jié)構(gòu)來整理和呈現(xiàn)數(shù)據(jù);
- 塊存儲(chǔ)會(huì)將數(shù)據(jù)拆分到任意劃分且大小相同的卷中;
- 對(duì)象存儲(chǔ)會(huì)管理數(shù)據(jù)并將其鏈接至關(guān)聯(lián)的元數(shù)據(jù)。

- 塊存儲(chǔ):即提供裸的塊設(shè)備服務(wù),裸設(shè)備什么都沒有,需要用戶自己創(chuàng)建分區(qū)、創(chuàng)建文件系統(tǒng)、掛載到操作系統(tǒng)才能用,掛一個(gè)塊存儲(chǔ)設(shè)備到操作系統(tǒng),相當(dāng)于插一個(gè)新U盤。只實(shí)現(xiàn)了read、write、ioctl等接口。SAN、LVM、Ceph RBD、OpenStack Cinder等都屬于塊存儲(chǔ)服務(wù)。
- 文件存儲(chǔ):可以簡單理解為分布式文件系統(tǒng),通常實(shí)現(xiàn)了POSIX接口,不需要安裝文件系統(tǒng),直接像NFS一樣掛載到操作系統(tǒng)就能用。典型的文件存儲(chǔ)如NAS、HDFS、CephFS、GlusterFS、OpenStack Manila等。
- 對(duì)象存儲(chǔ):提供Web存儲(chǔ)服務(wù),通過HTTP協(xié)議訪問,只需要Web瀏覽器即可使用,不需要掛載到本地操作系統(tǒng),實(shí)現(xiàn)的接口如GET、POST、DELETE等,典型的對(duì)象存儲(chǔ)如百度網(wǎng)盤、S3、OpenStack Swift、Ceph RGW等。
虛擬化管理工具
虛擬化管理工具是指與虛擬化環(huán)境及背后的實(shí)體硬件對(duì)接的軟件,它的作用是簡化資源管理、分析數(shù)據(jù)并簡化運(yùn)維。每個(gè)虛擬化管理系統(tǒng)都各不相同,但大多數(shù)系統(tǒng)都會(huì)提供簡單的用戶界面,還能簡化虛擬機(jī)(VM)創(chuàng)建流程、監(jiān)控虛擬環(huán)境、分配資源、編譯報(bào)告,以及自動(dòng)執(zhí)行規(guī)則。

libvirt是一套用于管理硬件虛擬化的開源API、守護(hù)進(jìn)程與管理工具。此套組可用于管理KVM、Xen、VMware ESXi、QEMU及其他虛擬化技術(shù)。libvirt內(nèi)置的API廣泛用于云解決方案開發(fā)中的虛擬機(jī)監(jiān)視器編排層(Orchestration Layer)。
文章來源:@請(qǐng)叫我大師兄,如涉及到版權(quán)問題,請(qǐng)聯(lián)系網(wǎng)站管理員刪除!
- 上一篇:國內(nèi)十大AI開放平臺(tái) 2023/1/1
- 下一篇:什么是超融合?超融合基礎(chǔ)架構(gòu)的本質(zhì)是什么? 2023/1/1