VMware/KVM/OpenStack虛擬化之網路模式總結

散盡浮華發表於2017-09-19

 

一、VMware虛擬機器網路模式

Vmware虛擬機器有三種網路模式:Bridged (橋接模式)NAT (網路地址轉換模式)Host-Only (僅主機模式)下面分別總結下這三種網路模式:

1. Bridged (橋接模式)
將虛擬機器的虛擬網路介面卡與主機的物理網路介面卡進行交接,虛擬機器中的虛擬網路介面卡可通過主機中的物理網路介面卡直接訪問到外部網路。這就好像在區域網中新增了一臺新的、獨立的伺服器一樣。因此,虛擬機器也會佔用區域網中的一個IP地址,並且可以和其他終端進行相互訪問。橋接模式網路連線支援有線和無線主機網路介面卡。如果想把虛擬機器當做一臺完全獨立的伺服器,並且允許它和其他終端一樣的進行網路通訊,那麼橋接模式通常是虛擬機器訪問網路的最簡單途徑。

橋接模式就是將主機網路卡與虛擬的網路卡利用虛擬網橋進行通訊。類似於把物理主機虛擬為一個交換機,所有橋接設定的虛擬機器連線到這個交換機的一個介面上,物理主機也同樣插在這個交換機當中,所以所有橋接下的網路卡與網路卡都是交換模式的,相互可以訪問而不干擾。在橋接模式下,虛擬機器IP地址需要與主機在同一網段,如果需要聯網,則閘道器與DNS需要與主機網路卡一致。

 

2. NAT (網路地址轉換模式)
使用NAT模式網路連線時,VMware會在主機上建立單獨的專用網路,用以在主機和虛擬機器之間相互通訊。虛擬機器向外部網路傳送的請求資料”包裹”,都會交由NAT網路介面卡加上”特殊標記”並以主機的名義轉發出去,外部網路返回的響應資料”包裹”,也是先由主機接收,然後交由NAT網路介面卡根據”特殊標記”進行識別並轉發給對應的虛擬機器。因此,虛擬機器在外部網路中不必具有自己的IP地址。從外部網路來看,虛擬機器和主機在共享一個IP地址,預設情況下,外部網路終端也無法訪問到虛擬機器。此外,在一臺主機上只允許有一個NAT模式的虛擬網路。因此,同一臺主機上的多個採用NAT模式網路連線的虛擬機器也是可以相互訪問的。如果網路IP資源緊張,此時使用NAT模式是最好的選擇。NAT模式藉助虛擬NAT裝置和虛擬DHCP伺服器,使得虛擬機器可以聯網。 

在NAT模式中,主機網路卡直接與虛擬機器裝置相連,然後虛擬NAT裝置與虛擬DHCP伺服器一起連線在虛擬交換機VMnet8上,這樣就實現了虛擬機器聯網。那麼為什麼需要虛擬網路卡VMware Network Adapter VMnet8呢?VMware Network Adapter VMnet8虛擬網路卡主要是為了實現主機與虛擬機器之間的通訊。

3. Host-Only (僅主機模式)
僅主機模式,是一種比NAT模式更加封閉的的網路連線模式,它將建立完全包含在主機中的專用網路。僅主機模式的虛擬網路介面卡僅對主機可見,並在虛擬機器和主機系統之間提供網路連線。相對於NAT模式而言,僅主機模式不具備NAT功能,因此在預設情況下,使用僅主機模式網路連線的虛擬機器無法連線到Internet(在主機上安裝合適的路由或代理軟體,或者在Windows系統的主機上使用Internet連線共享功能,仍然可以讓虛擬機器連線到Internet或其他網路)。在同一臺主機上可以建立多個僅主機模式的虛擬網路,如果多個虛擬機器處於同一個僅主機模式網路中,那麼它們之間是可以相互通訊的;如果它們處於不同的僅主機模式網路,則預設情況下無法進行相互通訊(可通過在它們之間設定路由器來實現相互通訊)。

Host-Only模式其實就是NAT模式去除了虛擬NAT裝置,然後使用VMware Network Adapter VMnet1虛擬網路卡連線VMnet1虛擬交換機來與虛擬機器通訊。 Host-Only模式將虛擬機器與外網隔開,使得虛擬機器成為一個獨立的系統,只與主機相互通訊。

二、 KVM虛擬機器網路模式 

Libvirt虛擬網路是使用虛擬網路交換機的概念。虛擬網路交換機是在主機物理機器伺服器上執行的軟體結構,虛擬機器(客戶機)通過它連線到該物理主機伺服器。客戶機的網路流量通過這個交換機被引導:

Linux主機物理機伺服器將虛擬網路交換機表示為網路介面。當libvirtd守護程式(libvirtd)首次安裝並啟動時,表示虛擬網路交換機的預設網路介面是virbr0。 

這個virbr0介面可以通過ip命令 (ip addr show virbr0),像其他任何介面一樣用命令檢視。

KVM中的四種簡單網路模型,分別如下:
橋接模型:在宿主機中建立一張虛擬網路卡作為宿主機的網路卡,而物理網路卡則作為交換機。
NAT模型:在路由模式中,會出現虛擬機器可以訪問其他主機,但是其他主機的報文無法到達虛擬機器,而NAT模式則將源地址轉換為路由器(物理網路卡)地址,這樣其他主機也知道報文來自那個主機,在docker環境中經常被使用。
路由模型:相當於虛擬機器連線到一臺路由器上,由路由器(物理網路卡),統一轉發,但是不會改變源地址。
隔離模型:虛擬機器之間組建網路,該模式無法與宿主機通訊,無法與其他網路通訊,相當於虛擬機器只是連線到一臺交換機上。

1. 橋接模式
在使用橋接模式時,所有虛擬機器都好像與主機物理機器在同一個子網內。同一物理網路中的所有其他物理機器都知道這些虛擬機器,並可以訪問這些虛擬機器。橋接操作在OSI網路模型的第2層。 在中介軟體 (如hypervisor) 中可以使用多個物理介面,通過繫結把他們連線在一起,然後把它新增的網橋,同時虛擬機器也被新增到這個網橋,繫結操作有多種模式,只有少數這些模式可以與虛擬客機正在使用的橋接器配合使用。

2. NAT模式
預設情況下,KVM虛擬網路交換機以NAT模式執行。也就是說NAT方式是KVM安裝後的預設方式, 它支援主機與虛擬機器的互訪,同時也支援虛擬機器訪問網際網路,但不支援外界訪問虛擬機器。它們使用IP偽裝而不是SNAT(Source-NAT)或DNAT(Destination-NAT)。IP偽裝使得連線的guest虛擬機器可以使用主機物理機器IP地址與任何外部網路進行通訊。(可以使用命令 "virsh net-list --all" 列出linux宿主機當前KVM的所有網路模式, 命令結果中的default網路(virbr0上)是宿主機安裝kvm虛擬機器自動安裝的) 預設情況下,虛擬網路交換機在NAT模式下執行時,放置在主機物理機外部的計算機無法與其中的guest虛擬機器進行通訊,如下圖所示:

DNS和DHCP 
IP地址可以通過DHCP分配給客戶機。為此,可以將地址池分配給虛擬網路交換機。Libvirt使用這個dnsmasq程式。dnsmasq的一個例項是由libvirt為每個需要它的虛擬網路交換機自動配置和啟動的。 

KVM預設網路配置是NAT方式, libvirtd守護程式(libvirtd)第一次被安裝時,它將包含配置在NAT模式下的初始虛擬網路交換機。使用此配置,以便安裝的guest虛擬機器可以通過主機物理機與外部網路進行通訊。下圖顯示了這個預設配置libvirtd:

3. 路由模式
當使用路由模式時,虛擬交換機連線到連線到主機物理機器的物理LAN,在不使用NAT的情況下來回傳輸流量。虛擬交換機可以檢查所有流量,並使用網路資料包中包含的資訊來做出路由決策。使用此模式時,所有虛擬機器都位於其自己的子網中,通過虛擬交換機進行路由。這種情況並不總是理想的,因為物理網路上的其他主機物理機器不通過手工配置的路由資訊是沒法發現這些虛擬機器,並且不能訪問虛擬機器。路由模式在OSI網路模型的第三層執行。

4. 隔離模式
使用隔離模式時,連線到虛擬交換機的虛擬機器可以相互通訊,也可以與主機物理機通訊,但其通訊不會傳到主機物理機外,也不能從主機物理機外部接收通訊。在這種模式下使用dnsmasq對於諸如DHCP的基本功能是必需的。但是,即使該網路與任何物理網路隔離,DNS名稱仍然被解析的。因此,DNS名稱能解析但ICMP迴應請求(ping)命令失敗這種情況可能會出現。

三、OpenStack虛擬機器網路模式

網路是OpenStack虛擬化部署中最容易出問題的,也是其結構中難以理清的部分。下面根據自己的理解,談一談OpenStack的虛擬網路、網路拓撲和網路流,以供參考,如有誤述,敬請指出。

1. OpenStack中nova-network外掛的作用

OpenStack 虛擬化平臺中有兩種型別的物理節點: 控制節點和計算節點。控制節點包括網路控制、排程管理、api服務、儲存卷管理、資料庫管理、身份管理和映象管理等計算節點主要提供nova-compute服務。控制節點的服務可以分開部署在多個節點上,而提供nova-network服務的節點稱為網路控制器。

OpenStack的網路由nova-network(網路控制器)管理,它會建立虛擬網路,使主機之間以及與外部網路互相訪問。OpenStack的API伺服器通過訊息佇列分發nova-network提供的命令,這些命令之後會被nova-network處理,主要的操作有:分配ip地址、配置虛擬網路和通訊。

這裡要注意區分以下兩個概念:控制節點和網路控制器
-> 在最簡單情況下,所有服務都部署在一個主機,這就是all-in-one;
-> 稍微複雜點,除了nova-compute外所有服務都部署在一個主機,這個主機進行各種控制管理,因此也就是控制節點;
-> 多數情況下 (比如為了高可用性),需要把各種管理服務分別部署在不同主機(比如分別提供資料庫叢集服務、訊息佇列、映象管理、網路控制等),這個時候網路控制器(執行nova-network)只是控制節點群中的一部分。

2. OpenStack中network的2種ip、3種管理模式

Nova有固定IP浮動IP的概念。固定IP被分發到建立的例項不再改變,浮動IP是一些可以和例項動態繫結和釋放的IP地址。
Nova支援3種型別的網路,對應3種"網路管理"型別:Flat管理模式FlatDHCP管理模式VLAN管理模式OpenStack虛擬機器預設使用VLAN摸式。這3種型別的網路管理模式,可以在一個ОpenStack部署裡面共存,可以在不同節點不一樣,可以進行多種配置實現高可用性。
Flat (扁平): 所有例項橋接到同一個虛擬網路,需要手動設定網橋。
FlatDHCP: 與Flat (扁平)管理模式類似,這種網路所有例項橋接到同一個虛擬網路,扁平拓撲。不同的是,正如名字的區別,例項的ip提供dhcp獲取 (nova-network節點提供dhcp服務),而且可以自動幫助建立網橋。
VLAN: 為每個專案提供受保護的網段 (虛擬LAN)。

3. OpenStack虛擬機器3種網路模式的工作機制

1) Flat模式
-> 指定一個子網,規定虛擬機器能使用的ip範圍,也就是一個ip池 (分配ip不會超過這個範圍,也就是配置裡面的fixed_range,比如10.0.0.1/27,那麼可用ip就有32個;這個網路是可以改變的,比如配置好節點nova.conf和interfaces後,nova-manage network delete 10.0.0.1/27 1 32;nova-manage network create192.168.1.0/24 1 255);
-> 建立例項時,從有效ip地址池接取一個IP,為虛擬機器例項分配,然後在虛擬機器啟動時候注入虛擬機器映象 (檔案系統);
-> 必須手動配置好網橋 (br100),所有的系統例項都是和同一個網橋連線;網 橋與連到網橋的例項組成一個虛擬網路,nova-network所在的節點作為預設閘道器。比如flat_interface=eth1;eth1的ip為 10.0.0.1,其它網路ip在10.0.0.1/27內。flat interface-->br100-->flat network;
-> 此後,網路控制器 (nova-network節點) 對虛擬機器例項進行NAT轉換,實現與外部的通訊。網路配置儲存在/etc/network/interfaces檔案。

2) Flat DHCP模式
與Flat模式一樣,從ip池取出ip分配給虛擬機器例項,所有的例項都在計算節點中和一個網橋相關。不過,在這個模式裡,控制節點做了更多一些的配置,嘗試和乙太網裝置(預設為eth0)建立網橋,通過dhcp自動為例項分配flat網路的固定ip,可以回收釋放ip。
-> 網路控制器(執行nova-network服務的節點)執行dusmasq作為DHCP伺服器監聽這個網橋;
-> 例項做一次dhcp discover操作,傳送請求;
-> 網路控制器把從一個指定的子網中獲得的IP地址響應給虛擬機器例項;
-> 例項通過網路控制器與外部實現互相訪問。

3) VLAN網路模式
OpenStack的預設網路管理模式,沒有設定--network_manager=nova.network.manager。FlatDHCPManager或者FlatManager的時候預設為vlan。為了實現多臺機器的安裝,VLAN網路模式需要一個支援VLAN標籤(IEEE 802.1Q)的交換機 (switch)。在這個模式裡,為每個專案建立了VLAN和網橋。所有屬於某個專案的例項都會連線到同一個VLAN,必要的時候會建立Linux網橋和VLAN。每個專案獲得一些只能從VLAN內部訪問的私有IP地址,即私網網段。每個專案擁有它自己的VLAN,Linux網橋還有子網。被網路管理員所指定的子網都會在需要的時候動態地分配給一個專案。
-> 網路控制器上的DHCP伺服器為所有的VLAN所啟動,從被分配到專案的子網中獲取IP地址並傳輸到虛擬機器例項;
-> 為了實現使用者獲得專案的例項,訪問私網網段,需要建立一個特殊的VPN例項 (程式碼名為cloudpipe,用了建立整數、key和vpn訪問例項);
-> 計算節點為使用者生成了證明書和key,使得使用者可以訪問VPN,同時計算節點自動啟動VPN;
-> vpn訪問。

Flat與vLAN的比較
-> 在兩種Flat模式裡,網路控制器扮演預設閘道器的角色,例項都被分配了公共的IP地址 (扁平式結構,都在一個橋接網路裡)。
-> vLAN模式功能豐富,很適合提供給企業內部部署使用。但是,需要支援vLAN的switches來連線,而且相對比較複雜,在小範圍實驗中常採用FlatDHCP模式。

4. 簡單總結下FlatDHCP模式 (注意Flat模式與之類似,只是少了dhcp的部分而已,就略過了)
可以有多種部署方式,比如為了實現高可用,可以使用多網路卡、外部閘道器、multi_host 等方法。這裡介紹基本部署方式 (一個控制節點,或一個網路控制器)。

1) 網路卡與節點
由於網路卡和節點數的不同,可以簡單分為:單節點 (all-in-one) 單網路卡、單節點多網路卡、多節點單網路卡、多節點多網路卡。

單節點的情況下,網路控制器 (執行nova-network) 與計算 (執行nova-compute,或者更確切的說,執行虛擬機器例項) 部署在一個主機。這樣就不需要控制節點與計算節點之間的通訊,也就少了很多網路概念,這也是入門者常用的方式。

多節點時,網路控制器與計算節點分別在不同主機,普通部署方式下 (不是multi_host),只有nova-network控制網路,而它僅僅在控制節點執行。因此,所有計算節點的例項都需要通過控制節點來與外網通訊。

單網路卡時,網路卡需要作為public網路的介面使用,也需要作為flat網路的介面,因此需要處於混雜模式。不過建立的網路與雙網路卡類似,都分為flat網路和public網路。使用單網路卡,需要在nova.conf中使public_interface和flat_interface都為eth0。

2) 網路流
如上面分析,在普通部署方式下,只有一個控制節點(或網路控制器),dhcp和外網訪問都需要經過它。

dhcp時
-> 網路控制器(執行nova-network服務的節點)一直執行dusmasq作為DHCP伺服器監聽網橋(br100);
-> 例項做一次dhcp discover操作,傳送請求;
-> 網路控制器把從一個指定的子網中獲得的IP地址響應給虛擬機器例項。

例項訪問外網時:
-> 例項經過所在主機的flat_interface(這是一個flat網路),連線到nova-network所在的主機(控制節點);
-> 網路控制器對外出網路流進行轉發。

外網訪問例項時
-> 網路控制器對floating ip進行nat;
-> 通過flat網路將流入資料路由給對應的例項。

下圖1、圖2可以比較單網路卡和雙網路卡的網路流(traffic)情況,圖2、圖3可以比較單節點和多節點的網路流。

圖1:雙網路卡多節點OpenStack網路流

圖2:單網路卡多節點OpenStack網路流

圖3:單網路卡單節點OpenStack網路流

3) 多節點時控制節點和計算節點的工作原理

控制節點
-> 在主機上建立一個網橋(br100),把閘道器ip賦給這個橋;如果已經有ip,會自動把這個ip賦給網橋作為閘道器,並修復閘道器;
-> 建立dhcp server,監聽這個網橋;並在資料庫記錄ip的分配和釋放,從而判定虛擬機器釋放正常關閉dhcp;
-> 監聽到ip請求時,從ip池取出ip,響應這個ip給例項;
-> 建立iptables規則,限制和開放與外網的通訊或與其它服務的訪問。

計算節點
-> 在主機上建立一個對應控制節點的網橋(br100),把其上例項(虛擬機器)橋接到一個網路(br100所在的網路);
-> 此後,這個橋、控制節點的橋和例項的虛擬網路卡都在同一虛擬網路,通過控制節點對外訪問。

可見,這種多節點方式有以下特點:
-> 所有例項與外網通訊都經過網路控制器,這也就是SPoF(單故障點);
-> 控制節點提供dhcp服務、nat、建立子網,作為虛擬網路的閘道器;
-> 計算節點可以沒有外網ip,同其上的例項一樣,可以把控制節點作為閘道器對外訪問;
-> 例項與外網通訊太多,會造成控制節點網路的堵塞或者高負載。

5. VLAN模式的特點
VLAN模式的目的是為每個專案提供受保護的網段,具有以下特點:
-> NAT實現public ip;
-> 除了public NAT外沒有其它途徑進入每個lan;
-> 受限的流出網路,project-admin可以控制;
-> 受限的專案之間的訪問,同樣project-admin可以控制;
-> 所以例項和api的連線通過vpn;

下面是vLAN模式下OpenStack網路結構 (這裡借用OpenStack官方文件裡的圖做一瞭解)

相關文章