深入理解虚拟化
什么是虛擬化
虛擬化技術是云計算的根基,在計算機技術中,虛擬化(技術)或虛擬技術(英語:Virtualization)是一種資源管理技術,是將計算機的各種實體資源(CPU、內存、磁盤空間、網絡適配器等),予以抽象、轉換后呈現出來并可供分割、組合為一個或多個電腦配置環境。由此,打破實體結構間的不可切割的障礙,使用戶可以比原本的配置更好的方式來應用這些電腦硬件資源。這些資源的新虛擬部分是不受現有資源的架設方式,地域或物理配置所限制。一般所指的虛擬化資源包括計算(CPU+內存),網絡,存儲。
虛擬化的本質
虛擬化本質是指資源的抽象化,要想資源充分利用,必須把資源最小單位化(池化),這樣上層才能按需使用資源,虛擬化不但解放了操作系統,也解放了物理硬件,大大提高了資源的利用率。
虛擬化管理程序Hypervisor(VMM),位于虛擬機與底層硬件設備之間的虛擬層,直接運行于硬件設備之上,負責對硬件資源進行抽象,為上層虛擬機提供運行環境所需資源,并使每個虛擬機都能夠互不干擾、相互獨立地運行于同一個系統中。
虛擬化主要分為幾大類:
計算虛擬化,針對CPU和內存資源虛擬化技術。
網絡虛擬化,針對網絡鏈路資源虛擬化技術。
IO虛擬化,針對IO資源虛擬化技術。
存儲虛擬化,針對磁盤存儲資源虛擬化技術。
計算虛擬化
計算虛擬化通過虛擬化管理程序(Hypervisor或VMM)將物理服務器的硬件資源與上層應用進行解耦,形成統一的計算資源池,然后可彈性分配給邏輯上隔離的虛擬機共享使用。如圖2、基于VMM所在位置與虛擬化范圍可以分三種類型。
全虛擬化 | 硬件輔助虛擬化 | 操作系統協助/半虛擬化 | |
| 實現技術 | 二進制翻譯,BT?和直接執行 | 遇到特權指令轉到root模式執行 | Hyper call |
| 客戶操作系統修改/兼容性 | 無需修改客戶操作系統,最佳兼容性 | 無需修改客戶操作系統,最佳兼容性 | 客戶操作系統需要修改來支持hypercall,因此它不能運行在物理硬件本身或其他的hypervisor上,兼容性差,不支持Windows |
| 性能 | 差 | 全虛擬化下,CPU需要在兩種模式之間切換,帶來性能開銷;但是,其性能在逐漸逼近半虛擬化。 | 好。半虛擬化下CPU性能開銷幾乎為0,虛機的性能接近于物理機。 |
| 應用廠商 | VMware Workstation/QEMU/Virtual PC | VMware ESXi/Microsoft Hyper-V/Xen 3.0/KVM | Xen |
容器(應用級):容器是一種更加輕量的應用級虛擬化技術,將應用的可執行文件及其所需的運行時環境與依賴庫打包,實現一次構建,到處運行的目標。相比虛擬化,容器技術多了容器引擎層(如Docker),但上層應用無需與Guest OS綁定,可以實現秒級部署、跨平臺遷移,靈活的資源分配,彈性調度管理等優勢。容器、微服務與DevOps為云原生的三大要素,是推動企業技術中臺建設與微服務化轉型不可或缺的組件。
實現-KVM
KVM是基于虛擬化擴展(Intel VT 或者 AMD-V)的 X86 硬件的開源的 Linux 原生的全虛擬化解決方案。KVM 中,虛擬機被實現為常規的 Linux 進程,由標準 Linux 調度程序進行調度;虛機的每個虛擬 CPU 被實現為一個常規的 Linux 進程。這使得 KMV 能夠使用 Linux 內核的已有功能。
但是,KVM 本身不執行任何硬件模擬,需要客戶空間程序通過?/dev/kvm 接口設置一個客戶機虛擬服務器的地址空間,向它提供模擬的 I/O,并將它的視頻顯示映射回宿主的顯示屏。目前這個應用程序是 QEMU。
Guest:客戶機系統,包括CPU(vCPU)、內存、驅動(Console、網卡、I/O 設備驅動等),被 KVM 置于一種受限制的 CPU 模式下運行。
KVM:運行在內核空間,提供CPU 和內存的虛級化,以及客戶機的 I/O 攔截。Guest 的 I/O 被 KVM 攔截后,交給 QEMU 處理。
QEMU:修改過的為 KVM 虛機使用的 QEMU 代碼,運行在用戶空間,提供硬件 I/O 虛擬化,通過 IOCTL /dev/kvm 設備和 KVM 交互。
KVM依賴的Intel/AMD 處理器的各種虛擬化擴展:
| 處理器 | CPU 虛擬化 | 內存虛擬化 | PCI Pass-through |
| Intel | VT-x | VPID,EPT | VT-d |
| AMD | AMD-V | ASID,NPT | IOMMU |
內存虛擬化
除了CPU虛擬化,另一個關鍵是內存虛擬化,通過內存虛擬化共享物理系統內存,動態分配給虛擬機。虛擬機的內存虛擬化很象現在的操作系統支持的虛擬內存方式,應用程序看到鄰近的內存地址空間,這個地址空間無需和下面的物理機器內存直接對應,操作系統保持著虛擬頁到物理頁的映射。
實現
現在所有的 x86 CPU 都包括了一個稱為內存管理的模塊MMU(Memory Management Unit)和 TLB(Translation Lookaside Buffer),通過MMU和TLB來優化虛擬內存的性能。
KVM中,虛機的物理內存即為 qemu-kvm 進程所占用的內存空間。KVM 使用 CPU 輔助的內存虛擬化方式。在 Intel 和 AMD 平臺,其內存虛擬化的實現方式分別為:
AMD 平臺上的 NPT (Nested Page Tables) 技術
Intel 平臺上的 EPT (Extended Page Tables)技術
EPT 和 NPT采用類似的原理,都是作為 CPU 中新的一層,用來將客戶機的物理地址翻譯為主機的物理地址。關于 EPT, Intel 官方文檔中的技術如下:
EPT的好處是,它的兩階段記憶體轉換,特點就是將 Guest Physical Address → System Physical Address,VMM不用再保留一份 SPT (Shadow Page Table),以及以往還得經過 SPT 這個轉換過程。除了降低各部虛擬機器在切換時所造成的效能損耗外,硬體指令集也比虛擬化軟體處理來得可靠與穩定。
I/O虛擬化
I/O虛擬化(Input/output virtualization,簡稱IOV)是虛擬化的一種新形式,是來自物理連接或物理運輸上層協議的抽象,讓物理服務器和虛擬機可以共享I/O資源。
I/O虛擬化實現
I/O 虛擬化方案的選擇:
I/O設備盡量使用準虛擬化(virtio 和 vhost_net)
如果需要實時遷移,不能使用 SR-IOV
對更高I/O要求又不需要實時遷移的,可以使用 SR-IOV
每種方案都有優勢和不足,在特定環境下其性能有可能反而下降,因此在生產環境中使用各種虛擬化方式前需要經過完整測試
????網絡虛擬化????
網絡虛擬化 (NV) 是指將傳統上在硬件中交付的網絡資源抽象化到軟件中。NV 可以將多個物理網絡整合為一個基于軟件的虛擬網絡,或者可以將一個物理網絡劃分為多個隔離和獨立的虛擬網絡。
傳統網絡
在傳統網絡環境中,一臺物理主機包含一個或多個網卡(NIC),要實現與其他物理主機之間的通信,需要通過自身的 NIC 連接到外部的網絡設施,如交換機上。
這種架構下,為了對應用進行隔離,往往是將一個應用部署在一臺物理設備上,這樣會存在兩個問題,
1)是某些應用大部分情況可能處于空閑狀態,
2)是當應用增多的時候,只能通過增加物理設備來解決擴展性問題。不管怎么樣,這種架構都會對物理資源造成極大的浪費。
虛擬化網絡
其中虛擬機與虛擬機之間的通信,由虛擬交換機完成,虛擬網卡和虛擬交換機之間的鏈路也是虛擬的鏈路,整個主機內部構成了一個虛擬的網絡,如果虛擬機之間涉及到三層的網絡包轉發,則又由另外一個角色——虛擬路由器來完成。
虛擬化網絡實現
虛擬交換機-OVS
Open vSwitch 是在開源 Apache 2 許可下獲得許可的多層軟件交換機。我們的目標是實現一個生產質量交換平臺,該平臺支持標準管理接口,并將轉發功能開放給程序化擴展和控制。非常適合用作 VM 環境中的虛擬交換機。除了向虛擬網絡層公開標準控制和可見性接口外,它還旨在支持跨多個物理服務器的分布。支持多種基于 Linux 的虛擬化技術,包括 Xen/XenServer、KVM 和 VirtualBox.
datapath是負責數據交換的內核模塊,其從網口讀取數據,并快速匹配Flowtable中的流表項,成功的直接轉發,失敗的上交vswitchd處理。它在初始化和port binding的時候注冊鉤子函數,把端口的報文處理接管到內核模塊。
vswitchd是一個守護進程,是ovs的管理和控制服務,通過unix socket將配置信息保存到ovsdb,并通過netlink和內核模塊交互。
ovsdb則是ovs的數據庫,保存了ovs配置信息。
虛擬網絡實現技術-Overlay
當前主流overlay技術是 GRE 和 VXLAN技術. 通過增加擴展報文頭來實現虛擬網絡在物理網絡之上傳輸報文。
GRE
網絡虛擬化使用通用路由封裝 (NVGRE) 作為虛擬化 IP 地址的機制。在 NVGRE 中,虛擬機的數據包封裝在另一個數據包中。此新 NVGRE 格式數據包的標頭具有相應的源和目標提供程序區域 (PA) IP 地址。此外,它還具有 VSID (24 位虛擬子網 ID) ,該 ID 存儲在新數據包的 GRE 標頭中。
VXLAN????????????????????????????????
Virtual eXtensible Local Area Network (VXLAN) 是一種將2層報文封裝到UDP包(Mac in UDP)中進行傳輸的一種封裝協議。VXLAN主要是由Cisco推出的,VXLAN的包頭有一個24bit的ID段,即意味著1600萬個獨一無二的虛擬網段,這個ID通常是對UDP端口采取偽隨機算法而生成的(UDP端口是由該幀中的原始MAC Hash生成的)。這樣做的好處是可以保證基于5元組的負載均衡,保存VM之間數據包的順序。
容器網絡實現
CNI(Container Network Interface) 是 google 和 CoreOS 主導制定的容器網絡標準,它 是在 RKT 網絡提議 的基礎上發展起來的,綜合考慮了靈活性、擴展性、IP分配、多網卡等因素。CNI旨在為容器平臺提供網絡的標準化。不同的容器平臺(比如目前的 Kubernetes、Mesos 和 RKT)能夠通過相同的接口調用不同的網絡組件。這個協議連接了兩個組件:容器管理系統和網絡插件,具體的事情都是插件來實現的,包括:創建容器網絡空間(network namespace)、把網絡接口(interface)放到對應的網絡空間、給網絡接口分配 IP 等。
Kubernetes本身并不負責網絡通信,Kubernetes提供了容器網絡接口CNI(Container Network Interface),具體的網絡通信交給CNI插件來負責,開源的CNI插件非常多,像Flannel、Calico等
容器網絡實現
存儲虛擬化
存儲虛擬化(Storage Virtualization)最通俗的理解就是對存儲硬件資源進行抽象化表現。構建具有統一邏輯視圖的存儲資源池供用戶按需使用。存儲虛擬化將各個分散的存儲系統 進行整合和統一管理,并提供了方便用戶調用資源的接口。另外,存儲虛擬化能夠為后續的系統擴容提供便 利,使資源規模動態擴大時無需考慮新增的物理存儲資源(如不同型號的存儲設備)之間可能存在的差異。
實現
存儲虛擬化的實現方式:
(1) 裸金屬+邏輯卷
(2) 存儲設備虛擬化
(3) 主機存儲虛擬化+文件系統
存儲虛擬化分類
文件、塊和對象是三種以不同的方式來保存、整理和呈現數據的存儲格式。這些格式各有各的功能和限制。
文件存儲會以文件和文件夾的層次結構來整理和呈現數據;
塊存儲會將數據拆分到任意劃分且大小相同的卷中;
對象存儲會管理數據并將其鏈接至關聯的元數據。
塊存儲:即提供裸的塊設備服務,裸設備什么都沒有,需要用戶自己創建分區、創建文件系統、掛載到操作系統才能用,掛一個塊存儲設備到操作系統,相當于插一個新U盤。只實現了read、write、ioctl等接口。SAN、LVM、Ceph RBD、OpenStack Cinder等都屬于塊存儲服務。
文件存儲:可以簡單理解為分布式文件系統,通常實現了POSIX接口,不需要安裝文件系統,直接像NFS一樣掛載到操作系統就能用。典型的文件存儲如NAS、HDFS、CephFS、GlusterFS、OpenStack Manila等。
對象存儲:提供Web存儲服務,通過HTTP協議訪問,只需要Web瀏覽器即可使用,不需要掛載到本地操作系統,實現的接口如GET、POST、DELETE等,典型的對象存儲如百度網盤、S3、OpenStack Swift、Ceph RGW等。
虛擬化管理工具
虛擬化管理工具是指與虛擬化環境及背后的實體硬件對接的軟件,它的作用是簡化資源管理、分析數據并簡化運維。每個虛擬化管理系統都各不相同,但大多數系統都會提供簡單的用戶界面,還能簡化虛擬機(VM)創建流程、監控虛擬環境、分配資源、編譯報告,以及自動執行規則。
libvirt是一套用于管理硬件虛擬化的開源API、守護進程與管理工具。此套組可用于管理KVM、Xen、VMware ESXi、QEMU及其他虛擬化技術。libvirt內置的API廣泛用于云解決方案開發中的虛擬機監視器編排層(Orchestration Layer)。
參考
https://kkutysllb.cn/2019/05/11
https://www.sdnlab.com/23191.html
https://blog.csdn.net/sdulibh/article/details/52703687
https://cloud.51cto.com/art/202011/632813.htm
https://www.zhihu.com/question/2583484
- END -
看完一鍵三連在看,轉發,點贊
是對文章最大的贊賞,極客重生感謝你
推薦閱讀
直播精彩分享!
深入理解高并發服務器性能優化
深入理解 Linux的 I/O 系統
總結
- 上一篇: 深入理解Golang 编程思维和工程实战
- 下一篇: 深入理解分布式消息队列