openstack預備知識---虛擬化
1、什麽是虛擬化?
虛擬化使得在一臺物理的服務器上可以跑多臺虛擬機,虛擬機共享物理機的 CPU、內存、IO 硬件資源,但邏輯上虛擬機之間是相互隔離的。
物理機我們一般稱為宿主機(Host),宿主機上面的虛擬機稱為客戶機(Guest)。
那麽 Host 是如何將自己的硬件資源虛擬化,並提供給 Guest 使用的呢?
這個主要是通過一個叫做 Hypervisor 的程序實現的。
2、虛擬化的分類
根據 Hypervisor 的實現方式和所處的位置,虛擬化又分為兩種:
1)1型虛擬化
Hypervisor 直接安裝在物理機上,多個虛擬機在 Hypervisor 上運行。Hypervisor 實現方式一般是一個特殊定制的 Linux 系統。Xen 和 VMWare 的 ESXi 都屬於這個類型。
2)2型虛擬化
物理機上首先安裝常規的操作系統,比如 Redhat、Ubuntu 和 Windows。Hypervisor 作為 OS 上的一個程序模塊運行,並對管理虛擬機進行管理。KVM、VirtualBox 和 VMWare Workstation 都屬於這個類型。
兩種類型的對比:
1型虛擬化一般對硬件虛擬化功能進行了特別優化,性能上比2型要高;
2型虛擬化因為基於普通的操作系統,會比較靈活,比如支持虛擬機嵌套。嵌套意味著可以在KVM虛擬機中再運行KVM。
3、KVM
1)基本概念
KVM 全稱是 Kernel-Based Virtual Machine。也就是說 KVM 是基於 Linux 內核實現的。
KVM有一個內核模塊叫 kvm.ko,只用於管理虛擬 CPU 和內存。
那 IO 的虛擬化,比如存儲和網絡設備由誰實現呢?
這個就交給 Linux 內核和Qemu來實現。
說白了,作為一個 Hypervisor,KVM 本身只關註虛擬機調度和內存管理這兩個方面。IO 外設的任務交給 Linux 內核和 Qemu。
2)Libvirt
Libvirt 是啥? 簡單說就是 KVM 的管理工具。
其實,Libvirt 除了能管理 KVM 這種 Hypervisor,還能管理 Xen,VirtualBox 等。
OpenStack 底層也使用 Libvirt。
Libvirt 包含 3 個東西:後臺 daemon 程序 libvirtd、API 庫和命令行工具 virsh
libvirtd是服務程序,接收和處理 API 請求;
API 庫使得其他人可以開發基於 Libvirt 的高級工具,比如 virt-manager,這是個圖形化的 KVM 管理工具;
virsh 是我們經常要用的 KVM 命令行工具,後面會有使用的示例。
3)KVM實際操作
a、準備KVM實驗環境
b、啟動第一個虛機
c、遠程管理虛機
4)KVM虛擬化原理
a、CPU虛擬化
一個 KVM 虛機在宿主機中其實是一個 qemu-kvm 進程,與其他 Linux 進程一樣被調度。
圖
虛機中的每一個虛擬 vCPU 則對應 qemu-kvm 進程中的一個線程。
虛機的 vCPU 總數可以超過物理 CPU 數量,這個叫 CPU overcommit(超配)。
KVM 允許 overcommit,這個特性使得虛機能夠充分利用宿主機的 CPU 資源,但前提是在同一時刻,不是所有的虛機都滿負荷運行。
b、內存虛擬化
KVM 通過內存虛擬化共享物理系統內存,動態分配給虛擬機。
為了在一臺機器上運行多個虛擬機,KVM 需要實現 VA(虛擬內存) -> PA(物理內存) -> MA(機器內存)直接的地址轉換。
虛機 OS 控制虛擬地址到客戶內存物理地址的映射 (VA -> PA),但是虛機 OS 不能直接訪問實際機器內存,因此 KVM 需要負責映射客戶物理內存到實際機器內存 (PA -> MA)。
圖
c、存儲虛擬化
KVM 的存儲虛擬化是通過存儲池(Storage Pool)和卷(Volume)來管理的。
Storage Pool 是宿主機上可以看到的一片存儲空間,可以是多種類型。
Volume 是在 Storage Pool 中劃分出的一塊空間,宿主機將 Volume 分配給虛擬機,Volume 在虛擬機中看到的就是一塊硬盤。
a)目錄類型的 Storage Pool
b)LVM類型的 Storage Pool
c)其他類型的Storage Pool
d、網絡虛擬化
a)Linux Bridge
(a)基本概念
假設宿主機有 1 塊與外網連接的物理網卡 eth0,上面跑了 1 個虛機 VM1,現在有個問題是:
如何讓 VM1 能夠訪問外網?
至少有兩種方案
1)將物理網卡eth0直接分配給VM1,但隨之帶來的問題很多:
宿主機就沒有網卡,無法訪問了;
新的虛機,比如 VM2 也沒有網卡。
2)推薦的方案:給 VM1 分配一個虛擬網卡 vnet0,通過 Linux Bridge br0 將 eth0 和 vnet0 連接起來
圖
Linux Bridge 是 Linux 上用來做 TCP/IP 二層協議交換的設備,其功能大家可以簡單的理解為是一個二層交換機或者 Hub。
多個網絡設備可以連接到同一個 Linux Bridge,當某個設備收到數據包時,Linux Bridge 會將數據轉發給其他設備。
在上面這個例子中,當有數據到達 eth0 時,br0 會將數據轉發給 vnet0,這樣 VM1 就能接收到來自外網的數據;
反過來,VM1 發送數據給 vnet0,br0 也會將數據轉發到 eth0,從而實現了 VM1 與外網的通信。
(b)動手實踐虛機網絡
(c)理解virbr0
virbr0 是 KVM 默認創建的一個 Bridge,其作用是為連接其上的虛機網卡提供 NAT 訪問外網的功能。
b)VLAN
LAN 表示 Local Area Network,本地局域網,通常使用 Hub 和 Switch 來連接 LAN 中的計算機。
一般來說,兩臺計算機連入同一個 Hub 或者 Switch 時,它們就在同一個 LAN 中。
一個 LAN 表示一個廣播域。 其含義是:LAN 中的所有成員都會收到任意一個成員發出的廣播包。
VLAN 表示 Virtual LAN。
一個帶有 VLAN 功能的switch 能夠將自己的端口劃分出多個 LAN。
計算機發出的廣播包可以被同一個 LAN 中其他計算機收到,但位於其他 LAN 的計算機則無法收到。
簡單地說,VLAN 將一個交換機分成了多個交換機,限制了廣播的範圍,在二層將計算機隔離到不同的 VLAN 中。
舉個例子:有兩組機器,Group A 和 B。
我們想配置成 Group A 中的機器可以相互訪問,Group B 中的機器也可以相互訪問,但是 A 和 B 中的機器無法互相訪問。
方法一:使用兩個交換機,A 和 B 分別接到一個交換機。
方法二:使用一個帶 VLAN 功能的交換機,將 A 和 B 的機器分別放到不同的 VLAN 中。
請註意:
VLAN 的隔離是二層上的隔離,A 和 B 無法相互訪問指的是二層廣播包(比如 arp)無法跨越 VLAN 的邊界。
但在三層(比如IP)上是可以通過路由器讓 A 和 B 互通的。概念上一定要分清。
現在的交換機幾乎都是支持 VLAN 的。
通常交換機的端口有兩種配置模式: Access 和 Trunk。
Access 口
這些端口被打上了 VLAN 的標簽,表明該端口屬於哪個 VLAN。
不同 VLAN 用 VLAN ID 來區分,VLAN ID 的 範圍是 1-4096。
Access 口都是直接與計算機網卡相連的,這樣從該網卡出來的數據包流入 Access 口後就被打上了所在 VLAN 的標簽。
Access 口只能屬於一個 VLAN。
Trunk 口
假設有兩個交換機 A 和 B。
A 上有 VLAN1(紅)、VLAN2(黃)、VLAN3(藍);B 上也有 VLAN1、2、3
那如何讓 AB 上相同 VLAN 之間能夠通信呢?
辦法是將 A 和 B 連起來,而且連接 A 和 B 的端口要允許 VLAN1、2、3 三個 VLAN 的數據都能夠通過。這樣的端口就是Trunk口了。
VLAN1、2、3 的數據包在通過 Trunk 口到達對方交換機的過程中始終帶著自己的 VLAN 標簽。
現在看看 KVM 虛擬化環境下是如何實現 VLAN 的
圖
eth0 是宿主機上的物理網卡,有一個命名為 eth0.10 的子設備(軟件實現了一個交換機(當然是虛擬的))與之相連。
eth0.10 就是 VLAN 設備了,其 VLAN ID 就是 VLAN 10。
eth0.10 掛在命名為 brvlan10 的 Linux Bridge 上,虛機 VM1 的虛擬網卡 vent0 也掛在 brvlan10 上。
這樣的配置其效果就是:
宿主機用軟件實現了一個交換機(當然是虛擬的),上面定義了一個 VLAN10。
eth0.10,brvlan10 和 vnet0 都分別接到 VLAN10 的 Access口上。
而 eth0 就是一個 Trunk 口。
VM1 通過 vnet0 發出來的數據包會被打上 VLAN10 的標簽。
eth0.10 的作用是:定義了 VLAN10
brvlan10 的作用是:Bridge 上的其他網絡設備自動加入到 VLAN10 中
c)Linux Bridge + VLAN = 虛擬交換機
對 KVM 的網絡虛擬化做個總結。
1、物理交換機存在多個 VLAN,每個 VLAN 擁有多個端口。
同一 VLAN 端口之間可以交換轉發,不同 VLAN 端口之間隔離。
所以交換機其包含兩層功能:交換與隔離。
2、Linux 的 VLAN 設備實現的是隔離功能,但沒有交換功能。
一個 VLAN 母設備(比如 eth0)不能擁有兩個相同 ID 的 VLAN 子設備,因此也就不可能出現數據交換情況。
3、Linux Bridge 專門實現交換功能。
將同一 VLAN 的子設備都掛載到一個 Bridge 上,設備之間就可以交換數據了。
總結起來,Linux Bridge 加 VLAN 在功能層面完整模擬現實世界裏的二層交換機。
eth0 相當於虛擬交換機上的 trunk 口,允許 vlan10 和 vlan20 的數據通過;
eth0.10,vent0 和 brvlan10 都可以看著 vlan10 的 access 口
eth0.20,vent1 和 brvlan20 都可以看著 vlan20 的 access 口
二、雲計算
1、基本概念
計算(CPU/內存)、存儲和網絡是 IT 系統的三類資源。
通過雲計算平臺,這三類資源變成了三個池子。
當需要虛機的時候,只需要向平臺提供虛機的規格。
平臺會快速從三個資源池分配相應的資源,部署出這樣一個滿足規格的虛機。
虛機的使用者不再需要關心虛機運行在哪裏,存儲空間從哪裏來,IP是如何分配,這些雲平臺都搞定了。
雲平臺是一個面向服務的架構,按照提供服務的不同分為 IaaS、PaaS 和 SaaS。
(1)IaaS(Infrastructure as a Service)基礎設施即服務;提供的服務是虛擬機。
IaaS 負責管理虛機的生命周期,包括創建、修改、備份、啟停、銷毀等。
使用者從雲平臺得到的是一個已經安裝好鏡像(操作系統+其他預裝軟件)的虛擬機。
使用者需要關心虛機的類型(OS)和配置(CPU、內存、磁盤),並且自己負責部署上層的中間件和應用。
典型的 IaaS 例子有 AWS、Rackspace、阿裏雲等
(2)PaaS(Platform as a Service)平臺即服務;提供的服務是應用的運行環境和一系列中間件服務(比如數據庫、消息隊列等)。
使用者只需專註應用的開發,並將自己的應用和數據部署到PaaS環境中。
PaaS負責保證這些服務的可用性和性能。
典型的 PaaS 有 Google App Engine、IBM BlueMix 等
(3)SaaS(Software as a Service)軟件即服務;提供的是應用服務。
使用者只需要登錄並使用應用,無需關心應用使用什麽技術實現,也不需要關系應用部署在哪裏。
SaaS的使用者通常是應用的最終用戶。
典型的 SaaS 有 Google Gmail、Salesforce 等
2、雲計算和openstack
OpenStack is a cloud operating system that controls large pools of compute, storage, and networking resources throughout a datacenter, all managed through a dashboard that gives administrators control while empowering their users to provision resources through a web interface.
以上是官網對 OpenStack 的定義,OpenStack 對數據中心的計算、存儲和網絡資源進行統一管理。
由此可見,OpenStack 針對的是 IT 基礎設施,是 IaaS 這個層次的雲操作系統。
openstack預備知識---虛擬化