從服務(wù)器集群到單臺服務(wù)器(host),從主機(jī)到虛擬機(jī)(vm),從虛擬機(jī)到容器組(pod),從 容器組到單個容器(Docker),從容器到多進(jìn)程,從進(jìn)程到多線程,資源(主要指計算、存儲和網(wǎng)絡(luò))的劃分粒度越來越細(xì),這使得資源能做到相互隔離,資源的配置也更加靈活。然而,也隨之帶來了一系列的技術(shù)問題:比如,同宿主上的 vm 是如何通信的?跨 host 間的 vm 是如何通信的?vm 和 host 是如何通信的?進(jìn)程間、線程間又是如何通信、協(xié)作的?等等。今天,我們就來探究一下 linux 系統(tǒng)中虛擬機(jī)的網(wǎng)絡(luò)通信原理。
一般的技術(shù)文章或者書上將 vm 的網(wǎng)絡(luò)連接方式分為三種:橋接(bridged)、NAT模式和 host-only 模式。然而,這種分類方法并不友好。首先,單從名稱看,你還是不知道具體的網(wǎng)絡(luò)連接方式。其次,NAT 模式和 host-only 模式有區(qū)別也有聯(lián)系,容易混淆。所以,這里我們將 linux 系統(tǒng)中 vm 的網(wǎng)絡(luò)連接方式分成兩大類,分別是物理網(wǎng)卡模式和虛擬網(wǎng)卡模式。
物理網(wǎng)卡模式
物理網(wǎng)卡模式又分為非 NAT 方式和 NAT 方式。
- 非 NAT 方式
上圖中,主機(jī)通過 VMware 虛擬出了 3 臺虛擬機(jī),3 臺虛擬機(jī)直接和虛擬交換機(jī)相連,而虛擬交換機(jī)則與主機(jī)的物理網(wǎng)卡相連。想要理解這種方式則需要明確以下三點:
- 虛擬機(jī)1、2、3 通過虛擬交換機(jī)之間與主機(jī)網(wǎng)卡相連,也就是說不需要主機(jī)內(nèi)核參與,只是借用了主機(jī)的物理網(wǎng)卡;
- “虛擬交換機(jī)”是屬于 VMware 的虛擬設(shè)備,不屬于虛擬機(jī)1,也不屬于虛擬機(jī)2和虛擬機(jī)3;
- 每臺虛擬機(jī)也有自己的虛擬網(wǎng)卡,才能與虛擬機(jī)交換機(jī)通信,圖中并沒有標(biāo)出來。
- NAT 方式
我們知道,NAT(network adress treanslate,網(wǎng)絡(luò)地址轉(zhuǎn)換)能解決私有網(wǎng)絡(luò)地址不足的問題,在 VM 的通信網(wǎng)絡(luò)中同樣可以利用這一技術(shù)。DHCP(Dynamic Host Configuration Protocol,動態(tài)主機(jī)配置協(xié)議)能夠給不同的 VM 分配 IP 地址。上圖中,vmnet0、NAT、DHCP 都是屬于 VMware 的虛擬設(shè)備。
虛擬網(wǎng)卡模式
這里,我們介紹另一種 VM 的網(wǎng)絡(luò)通信方式 - 虛擬網(wǎng)卡模式。VMware 在創(chuàng)建 VM 的時候,同時創(chuàng)建了一個叫“虛擬網(wǎng)卡”的虛擬設(shè)備。VMware 管轄下的所有 VM 通過和虛擬交換機(jī)相連,虛擬交換機(jī)和虛擬網(wǎng)卡連接。理解這種通信方式,需要明確以下一點:
- 這種網(wǎng)絡(luò)對虛擬機(jī)來說很封閉,因為 VM 只能連接主機(jī),如果想要和外界通信,需要主機(jī)具備路由/交換功能,只能通過在主機(jī)上安裝路由或代理軟件實現(xiàn);
上文中我們介紹了 Linux 系統(tǒng)中 VM 的兩種通信模式:“物理網(wǎng)卡模式”和“虛擬網(wǎng)卡模式”。其實,這兩種通信模式還可以對應(yīng)另外兩個別名,分別是“硬直通”和“軟交換”,大家喜歡前者還是后者呢?