前面我們講了,資料中心里面堆著一大片一大片的機器,用網路連接起來,機器數目一旦非常多,人們就發現,維護這么一大片機器還挺麻煩的,有好多不靈活的地方,
- 采購不靈活:如果客戶需要一臺電腦,那就需要自己采購、上架、插網線、安裝作業系統,周期非常長,一旦采購了,一用就 N 年,不能退貨,哪怕業務不做了,機器還在資料中心里留著,
- 運維不靈活:一旦需要擴容 CPU、記憶體、硬碟,都需要去機房手動弄,非常麻煩,
- 規格不靈活:采購的機器往往動不動幾百 G 的記憶體,而每個應用往往可能只需要 4 核 8G,所以很多應用混合部署在上面,埠各種沖突,容易相互影響,
- 復用不靈活:一臺機器,一旦一個用戶不用了,給另外一個用戶,那就需要重裝作業系統,因為原來的作業系統可能遺留很多資料,非常麻煩,
從物理機到虛擬機
為了解決這些問題,人們發明了一種叫虛擬機的東西,并基于它產生了云計算技術,
其實在你的個人電腦上,就可以使用虛擬機,如果你對虛擬機沒有什么概念,你可以下載一個桌面虛擬化的軟體,自己動手嘗試一下,它可以讓你靈活地指定 CPU 的數目、記憶體的大小、硬碟的大小,可以有多個網卡,然后在一臺筆記本電腦里面創建一臺或者多臺虛擬電腦,不用的時候,一點洗掉就沒有了,
在資料中心里面,也有一種類似的開源技術 qemu-kvm,能讓你在一臺巨大的物理機里面,掏出一臺臺小的機器,這套軟體就能解決上面的問題:一點就能創建,一點就能銷毀,你想要多大就有多大,每次創建的系統還都是新的,
我們常把物理機比喻為自己拿地蓋房子,而虛擬機則相當于購買公寓,更加靈活方面,隨時可買可賣, 那這個軟體為什么能做到這些事兒呢?
它用的是軟體模擬硬體的方式,剛才說了,資料中心里面用的 qemu-kvm,從名字上來講,emu 就是 Emulator(模擬器)的意思,主要會模擬 CPU、記憶體、網路、硬碟,使得虛擬機感覺自己在使用獨立的設備,但是真正使用的時候,當然還是使用物理的設備,
例如,多個虛擬機輪流使用物理 CPU,記憶體也是使用虛擬記憶體映射的方式,最終映射到物理記憶體上,硬碟在一塊大的檔案系統上創建一個 N 個 G 的檔案,作為虛擬機的硬碟,
簡單比喻,虛擬化軟體就像一個“騙子”,向上“騙”虛擬機里面的應用,讓它們感覺獨享資源,其實自己啥都沒有,全部向下從物理機里面弄,
虛擬網卡的原理
那網路是如何“騙”應用的呢?如何將虛擬機的網路和物理機的網路連接起來?

首先,虛擬機要有一張網卡,對于 qemu-kvm 來說,這是通過 Linux 上的一種 TUN/TAP 技術來實作的,
虛擬機是物理機上跑著的一個軟體,這個軟體可以像其他應用打開檔案一樣,打開一個稱為 TUN/TAP 的 Char Dev(字符設備檔案),打開了這個字符設備檔案之后,在物理機上就能看到一張虛擬 TAP 網卡,
虛擬化軟體作為“騙子”,會將打開的這個檔案,在虛擬機里面虛擬出一張網卡,讓虛擬機里面的應用覺得它們真有一張網卡,于是,所有的網路包都往這里發,
當然,網路包會到虛擬化軟體這里,它會將網路包轉換成為檔案流,寫入字符設備,就像寫一個檔案一樣,內核中 TUN/TAP 字符設備驅動會收到這個寫入的檔案流,交給 TUN/TAP 的虛擬網卡驅動,這個驅動將檔案流再次轉成網路包,交給 TCP/IP 協議堆疊,最終從虛擬 TAP 網卡發出來,成為標準的網路包,
就這樣,幾經轉手,資料終于從虛擬機里面,發到了虛擬機外面,
虛擬網卡連接到云中
我們就這樣有了虛擬 TAP 網卡,接下來就要看,這個卡怎么接入龐大的資料中心網路中,
在接入之前,我們先來看,云計算中的網路都需要注意哪些點,
- 共享:盡管每個虛擬機都會有一個或者多個虛擬網卡,但是物理機上可能只有有限的網卡,那這么多虛擬網卡如何共享同一個出口?
- 隔離:分兩個方面,一個是安全隔離,兩個虛擬機可能屬于兩個用戶,那怎么保證一個用戶的資料不被另一個用戶竊聽?一個是流量隔離,兩個虛擬機,如果有一個瘋狂下片,會不會導致另外一個上不了網?
- 互通:分兩個方面,一個是如果同一臺機器上的兩個虛擬機,屬于同一個用戶的話,這兩個如何相互通信?另一個是如果不同物理機上的兩個虛擬機,屬于同一個用戶的話,這兩個如何相互通信?
- 靈活:虛擬機和物理不同,會經常創建、洗掉,從一個機器漂移到另一臺機器,有的互通、有的不通等等,靈活性比物理網路要好得多,需要能夠靈活配置,
共享與互通問題
這些問題,我們一個個來解決,
首先,一臺物理機上有多個虛擬機,有多個虛擬網卡,這些虛擬網卡如何連在一起,進行相互訪問,并且可以訪問外網呢?
還記得我們在大學宿舍里做的事情嗎?你可以想象你的物理機就是你們宿舍,虛擬機就是你的個人電腦,這些電腦應該怎么連接起來呢?當然應該買一個交換機,
在物理機上,應該有一個虛擬的交換機,在 Linux 上有一個命令叫作 brctl,可以創建虛擬的網橋 brctl addbr br0,創建出來以后,將兩個虛擬機的虛擬網卡,都連接到虛擬網橋 brctl addif br0 tap0 上,這樣將兩個虛擬機配置相同的子網網段,兩臺虛擬機就能夠相互通信了,

那這些虛擬機如何連接外網呢?在桌面虛擬化軟體上面,我們能看到以下選項,

這里面,host-only 的網路對應的,其實就是上面兩個虛擬機連到一個 br0 虛擬網橋上,而且不考慮訪問外部的場景,只要虛擬機之間能夠相互訪問就可以了,
如果要訪問外部,往往有兩種方式,
一種方式稱為橋接,如果在桌面虛擬化軟體上選擇橋接網路,則在你的筆記本電腦上,就會形成下面的結構,

每個虛擬機都會有虛擬網卡,在你的筆記本電腦上,會發現多了幾個網卡,其實是虛擬交換機,這個虛擬交換機將虛擬機連接在一起,在橋接模式下,物理網卡也連接到這個虛擬交換機上,物理網卡在桌面虛擬化軟體上,在“界面名稱”那里選定,
如果使用橋接網路,當你登錄虛擬機里看 IP 地址的時候會發現,你的虛擬機的地址和你的筆記本電腦的,以及你旁邊的同事的電腦的網段是一個網段,這是為什么呢?這其實相當于將物理機和虛擬機放在同一個網橋上,相當于這個網橋上有三臺機器,是一個網段的,全部打平了,我將圖畫成下面的樣子你就好理解了,

在資料中心里面,采取的也是類似的技術,只不過都是 Linux,在每臺機器上都創建網橋 br0,虛擬機的網卡都連到 br0 上,物理網卡也連到 br0 上,所有的 br0 都通過物理網卡出來連接到物理交換機上,

同樣我們換一個角度看待這個拓撲圖,同樣是將網路打平,虛擬機會和你的物理網路具有相同的網段,

在這種方式下,不但解決了同一臺機器的互通問題,也解決了跨物理機的互通問題,因為都在一個二層網路里面,彼此用相同的網段訪問就可以了,但是當規模很大的時候,會存在問題,
你還記得嗎?在一個二層網路里面,最大的問題是廣播,一個資料中心的物理機已經很多了,廣播已經非常嚴重,需要通過 VLAN 進行劃分,如果使用了虛擬機,假設一臺物理機里面創建 10 臺虛擬機,全部在一個二層網路里面,那廣播就會很嚴重,所以除非是你的桌面虛擬機或者資料中心規模非常小,才可以使用這種相對簡單的方式,
另外一種方式稱為 NAT,如果在桌面虛擬化軟體中使用 NAT 模式,在你的筆記本電腦上會出現如下的網路結構,

在這種方式下,你登錄到虛擬機里面查看 IP 地址,會發現虛擬機的網路是虛擬機的,物理機的網路是物理機的,兩個不相同,虛擬機要想訪問物理機的時候,需要將地址 NAT 成為物理機的地址,
除此之外,它還會在你的筆記本電腦里內置一個 DHCP 服務器,為筆記本電腦上的虛擬機動態分配 IP 地址,因為虛擬機的網路自成體系,需要進行 IP 管理,為什么橋接方式不需要呢?因為橋接將網路打平了,虛擬機的 IP 地址應該由物理網路的 DHCP 服務器分配,
在資料中心里面,也是使用類似的方式,這種方式更像是真的將你宿舍里面的情況,搬到一臺物理機上來,

虛擬機是你的電腦,路由器和 DHCP Server 相當于家用路由器或者寢室長的電腦,物理網卡相當于你們宿舍的外網網口,用于訪問互聯網,所有電腦都通過內網網口連接到一個網橋 br0 上,虛擬機要想訪問互聯網,需要通過 br0 連到路由器上,然后通過路由器將請求 NAT 成為物理網路的地址,轉發到物理網路,
如果是你自己登錄到物理機上做個簡單配置,你可以簡化一下,例如將虛擬機所在網路的網關的地址直接配置到 br0 上,不用 DHCP Server,手動配置每臺虛擬機的 IP 地址,通過命令 iptables -t nat -A POSTROUTING -o ethX -j MASQUERADE,直接在物理網卡 ethX 上進行 NAT,所有從這個網卡出去的包都 NAT 成這個網卡的地址,通過設定 net.ipv4.ip_forward = 1,開啟物理機的轉發功能,直接做路由器,而不用單獨的路由器,這樣虛擬機就能直接上網了,

隔離問題
解決了互通的問題,接下來就是隔離的問題,
如果一臺機器上的兩個虛擬機不屬于同一個用戶,怎么辦呢?好在 brctl 創建的網橋也是支持 VLAN 功能的,可以設定兩個虛擬機的 tag,這樣在這個虛擬網橋上,兩個虛擬機是不互通的,
但是如何跨物理機互通,并且實作 VLAN 的隔離呢?由于 brctl 創建的網橋上面的 tag 是沒辦法在網橋之外的范圍內起作用的,因此我們需要尋找其他的方式,
有一個命令 vconfig,可以基于物理網卡 eth0 創建帶 VLAN 的虛擬網卡,所有從這個虛擬網卡出去的包,都帶這個 VLAN,如果這樣,跨物理機的互通和隔離就可以通過這個網卡來實作,

首先為每個用戶分配不同的 VLAN,例如有一個用戶 VLAN 10,一個用戶 VLAN 20,在一臺物理機上,基于物理網卡,為每個用戶用 vconfig 創建一個帶 VLAN 的網卡,不同的用戶使用不同的虛擬網橋,帶 VLAN 的虛擬網卡也連接到虛擬網橋上,
這樣是否能保證兩個用戶的隔離性呢?不同的用戶由于網橋不通,不能相互通信,一旦出了網橋,由于 VLAN 不同,也不會將包轉發到另一個網橋上,另外,出了物理機,也是帶著 VLAN ID 的,只要物理交換機也是支持 VLAN 的,到達另一臺物理機的時候,VLAN ID 依然在,它只會將包轉發給相同 VLAN 的網卡和網橋,所以跨物理機,不同的 VLAN 也不會相互通信,
使用 brctl 創建出來的網橋功能是簡單的,基于 VLAN 的虛擬網卡也能實作簡單的隔離,但是這都不是大規模云平臺能夠滿足的,一個是 VLAN 的隔離,數目太少,前面我們學過,VLAN ID 只有 4096 個,明顯不夠用,另外一點是這個配置不夠靈活,誰和誰通,誰和誰不通,流量的隔離也沒有實作,還有大量改進的空間,
小結
- 云計算的關鍵技術是虛擬化,這里我們重點關注的是,虛擬網卡通過打開 TUN/TAP 字符設備的方式,將虛擬機內外連接起來;
- 云中的網路重點關注四個方面,共享、隔離、互通、靈活,其中共享和互通有兩種常用的方式,分別是橋接和 NAT,隔離可以通過 VLAN 的方式,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/195993.html
標籤:其他
