1 虛擬化
虛擬化是為一些組件(例如虛擬應用、服務器、存儲和網絡)創建基于軟件的(或虛擬)表現形式的過程。它是降低所有規模企業的 IT 開銷,同時提高其效率和敏捷性的最有效方式。
1.1 虛擬化用于程序跨平臺兼容
要實現程序跨平臺兼容的方法其實很簡單,只要操作系統或者物理硬件所提供的接口調用方式一致,程序便不需要兼容不同硬件平臺的接口,而只需要針對這一套統一的接口開發即可。
虛擬化技術正是通過其本身適配不同平臺的硬件,而加以抽象成統一的接口,來實現程序跨平臺運行這一目的的。
1.2 虛擬化用于資源管理
通過虛擬化技術來管理計算機資源的方式,不但讓我們對計算機資源的控制變得更加靈活,也大幅提高了計算機資源的使用率。
虛擬化技術能夠提高計算機資源的使用率,是指利用虛擬化,我們可以將原來程序用不到的一些資源拿出來,分享給另外一些程序,讓計算機資源不被浪費。
雖然我們能夠在操作系統里同時運行多個程序,但前提得是這些程序本身不存在沖突。這里的沖突體現在很多的方面,例如不同的程序同時使用了同一個端口;不同程序依賴于同一個工具庫的不同版本;程序本身限制了同時開啟的進程數等。虛擬化技術通過資源隔離的方式,無形地也可以把這些程序隔離在不同的虛擬環境中,既然虛擬環境不同,自然運行在不同環境中的程序就不會互相干擾或爭搶資源了。
1.3 虛擬化的分類
-
硬件虛擬化
所謂硬件虛擬化,指的是物理硬件本身就提供虛擬化的支持。舉個例子來說,某個平臺的 CPU,能夠將另外一個平臺的指令集轉換為自身的指令集執行,并給程序完全運行在那個平臺上的感覺。例如Intel VT、AMD-V -
軟件虛擬化
而軟件虛擬化則指的是通過軟件的方式來實現虛擬化中關鍵的指令轉換部分。依然用 CPU 的例子來說話,在軟件虛擬化實現中,通過一層夾雜在應用程序和硬件平臺上的虛擬化實現軟件來進行指令的轉換。
1.4 平臺虛擬化分類:
- 完全虛擬化:原來運行在物理硬件上的操作系統和軟件,完全不用修改就可以直接運行在虛擬機中。
全虛擬化(FullVirtualization)也稱為原始虛擬化技術,該模型使用虛擬機協調Guest操作系統和原始硬件,VMM在Guest操作系統和裸硬件之間用于工作協調,一些受保護指令必須由Hypervisor(虛擬機管理程序)來捕獲處理。
- 半虛擬化:是一種修改Guest OS部分訪問特權狀態的代碼以便直接與VMM交互的技術。
在虛擬客戶操作系統中加入特定的虛擬化指令,通過這些指令可以直接通過Hypervisor層調用硬件資源,免除有hypervisor層轉換指令的性能開銷。
半虛擬化需要Guest操作系統做一些修改,使Guest操作系統意識到自己是處于虛擬化環境的,但是半虛擬化提供了與原操作系統相近的性能。
- 操作系統虛擬化:是一種輕量級的虛擬化技術,讓內核通過創建多個虛擬的操作系統實例來隔離不同的進程,不同實例中的進程完全不了解對方的存在。這些實例也被稱之為容器。
1.5 虛擬機
一種叫虛擬機監控程序的軟件會把資源與物理機分隔開,以便進行分區并專門用于虛擬機。通常來說就是通過一個虛擬機監視器 ( Virtual Machine Monitor ) 的設施來隔離操作系統與硬件或者應用程序和操作系統,以此達到虛擬化的目的。這個夾在其中的虛擬機監視器,常常被稱為 Hypervisor。
當用戶發出需要從物理環境中獲取更多資源的虛擬機指令時,虛擬機監控程序就會將該請求轉發到物理系統并將更改放到緩存中。
從作用上來看,虛擬機就像物理服務器,它會成倍放大應用依賴項和大量 OS 占用空間(而運行單個應用或微服務往往并不需要這么大的占用空間)造成的弊端。
2. 容器
所謂容器技術,指的是操作系統自身支持一些接口,能夠讓應用程序間可以互不干擾的獨立運行,并且能夠對其在運行中所使用的資源進行干預。由于應用程序的運行被隔離在了一個獨立的運行環境之中,這個獨立的運行環境就好似一個容器,包裹住了應用程序,這就是容器技術名字的由來。
容器中包含了微服務或應用及運行所需的一切要素。容器中的所有內容都保存在鏡像(一個基于代碼且包含所有庫和依賴項的文件)上。我們可以將這些文件視為 Linux 發行版的一個安裝實例,因為鏡像中包含 RPM 軟件包和配置文件。由于容器是如此之小,因此通常會有數百個容器松散地耦合在一起,所以要使用容器編排平臺(例如紅帽 OpenShift 和 Kubernetes)來置備和管理它們。
3. 虛擬機 VS 容器
由于沒有了虛擬操作系統和虛擬機監視器這兩個層次,大幅減少了應用程序運行帶來的額外消耗。
更準確的來說,所有在容器中的應用程序其實完全運行在了宿主操作系統中,與其他真實運行在其中的應用程序在指令運行層面是完全沒有任何區別的。
相比虛擬機,容器最適合用于:
- 構建云原生應用
- 封裝微服務
- 拓展 DevOps 或 CI/CD 實踐
- 在共享同一操作系統的多樣化 IT 環境中移動可擴展的 IT 項目
與單個容器相比,虛擬機能夠運行更多的操作,因而它們一直是(現在也是)封裝單體式工作負載的慣用方式。但是,由于對操作系統、應用和庫的依賴性,這種擴展功能也令虛擬機的可移植性大大降低。相比容器,虛擬機最適合用于:
- 存放傳統的單體式工作負載
- 隔離存在風險的開發周期
- 置備基礎架構資源(如網絡、服務器和數據)
- 在另一個操作系統內運行不同的操作系統(例如在 Linux 上運行 Unix)
參考資料
《開發者必備的 Docker 實踐指南》