posted

0 Comments

作者: Colin Jao 饒康立 – VMware資深技術顧問,主要負責VMware NSX產品線,目前致力於網路虛擬化暨分散式安全防護技術方案的介紹與推廣。 

 

接下來討論一個問題:在實體交換器內,是利用Mac-Address-Table來進行Ethernet封包的轉發。但在邏輯交換器內,兩個VM互相溝通時,底層的vSphere Host必須要知道目的VM是位在哪一台Host上,然後透過VXLAN封裝把原始的Ethernet Frame送過去。問題來了:Host如何知道目的地VM位在哪個Host上?

我們用下圖來進行說明。考慮環境內有三台vSphere Host A/B/C,VTEP分別為 10.20.10.10/2410.20.20.11/2410.20.30.12/24。我們建立了一個邏輯交換器VXLAN 5001,並且接取了兩個虛擬機器VM1 / VM2在此邏輯交換器上。邏輯網段是192.168.10.0/24,兩個VM的IP分別是101 / 102,分別位於Host A與Host B上。

 

當VM1要與VM2進行交通傳輸,Host A怎麼知道VM2在哪一台Host上?

 

圖說:示範圖例

 

首先我們要知道的,在NSX Controller上針對每個邏輯交換器,會維持三張表:VTEP Table / MAC Table / ARP Table。以下分別對這三張表進行說明。

 

VTEP Table 

 

建立邏輯交換器時,我們會把VM”插入”到這個邏輯交換器上。簡而言之,每一個vSphere Host一定知道他身上有哪些VM,以及這個VM是位在哪個邏輯交換器。當各個VM所位於的邏輯交換器有異動時,vSphere Host會立即通知NSX Controller這個Host身上有接取哪個邏輯交換器。

 

也就是說,在上圖的環境內,Host A與Host B會分別回報Controller他們身上有VXLAN 5001這個邏輯交換器。但Host C因為目前沒有任何VM位於VXLAN 5001,就不會發出這個訊息。因此,於NSX Controller上,對應VXLAN 5001 (VNI 5001)這個邏輯交換器,就會有下面這張VTEP Table

 

 

Host C上沒有任何VM在VXLAN 5001上,因此於Controller內的VTEP Table內就不會有VTEP 10.20.30.12的資訊。但考慮兩個狀況:

 

  • 在Host C上新建了一個VM 3並加入了VXLAN 5001。此時Host C會告知Controller他身上也有VXLAN 5001,Controller上的VNI 5001 VTEP Table就會新增一筆10.20.30.12
  • 或是如果VM 2由Host B vMotion到Host C,此時Host C會與Controller回報身上有VXLAN 5001,而Host B因為已經沒有任何VM位於此邏輯交換器,也會與Controller回報沒有VXLAN 5001了。Controller會據此進行VTEP Table的更新

 

VTEP Table在建立與更新時,Controller都會立即通知各個相關的vSphere Hosts,因此不僅是Controller本身,每個vSphere Host也都有一份最新的VTEP Table,知道在身上有的邏輯交換器,除了自己之外,還有哪些Hosts也有這個邏輯交換器。以上圖來說,Host A/B自己都會知道在VXLAN 5001上有的主機包括了Host A (10.20.10.10)以及Host B (10.20.20.11)

 

MAC Table 

 

同樣的,每一個vSphere Host也一定知道他身上VM的MAC Address是多少。因此Host也會對NSX Controller發出告知,自己身上的哪個邏輯交換器內有哪些VM (MAC Address)。在上圖內,Host A會告知NSX Controller在自己身上的VXLAN 5001內有一個VM硬體位置為MAC 1,而Host B也會告知Controller有一個MAC 2。因此,NSX Controller匯集了這些資訊,針對邏輯交換器5001就可以建立起下面的MAC Table

 

 

當然如果VM有異動或是有vMotion等動作,影響到的Host也會通知NSX Controller進行相關的更新。這張表僅維護於NSX Controller內,不會發送給各台主機。

 

ARP Table 

 

即使沒有安裝VMTools,vSphere Host仍然可能有方法知道各個VM的IP Address,包括

 

  • 如果這個VM發出了DHCP Request,由reply packet就可知道IP為多少
  • 只要這個VM發出了ARP Request,由Request的來源IP就會知道此VM的地址

 

接下來,Host也會對NSX Controller發出告知,自己身上VM的MAC Address與IP Address的對應。因此同樣的,NSX Controller也會學習到每個邏輯交換器內有哪些IP Address,以及對應的MAC,如下表

 

 

由上面的討論,我們會發現到NSX Controller事實上集中了各個邏輯交換器內的拓璞資訊,包括每個交換器有建立在哪些Hosts上、這個交換器內有哪些VM (MAC Address),以及他們對應的IP Address。所以回到最前面的問題:當VM1要與VM2進行交通傳輸,Host A怎麼知道VM2在哪一台Host上?

 

首先:VM1不知道VM2MAC Address,所以發出一個ARP Request

 

此時,vSphere Host接收到這個ARP Request,在Host上的Cache內也不知道VM2的MAC Address,此時Host A會對NSX Controller發出一個ARP詢問。Controller上查詢ARP Table後,回應Host A說VM2 (192.168.10.102)的MAC是MAC 2。Host A再發ARP Reply給VM1。

 

(另外有一個可能是Controller上的ARP Table也還沒有學到VM2的IP資訊。此時Host 就直接利用本機的VTEP Table,把這個ARP Request送給所有VNI 5001 VTEP Table內的伺服器們)

 

接著,VM1發出了往VM2傳送的Ethernet封包 

 

這個封包應該是長這樣的

 

 

Host A收到這個封包時,會去詢問Controller,查詢VXLAN 5001的MAC Table,並且得到MAC2對應的VTEP是10.20.20.11。啊哈,目的地的Host查到了。這時Host A就會在原有的Ethernet Frame前加上VXLAN的表頭,長成這樣

 

 

經過底層硬體網路正常的Hop-By-Hop封包轉送到Host B後,解VXLAN封裝並看到VXLAN是5001,於5001邏輯交換器內透過正常傳送機制將原始的Ethernet Frame 送給VM2 (via Destination MAC Address)

 

後續VM1VM2Ethernet封包呢? 

 

因為在ARP Request與第一個封包傳送時,Host A就已經具備了相關的知識並放進Cache,後續同樣網路流的封包傳送就不需要詢問NSX Controller,直接進行VXLAN封裝並傳送。

 

解釋得好累~希望上面的步驟能讓各位理解在NSX內,同一個邏輯交換器內的封包是如何透過底層硬體網路送到目的地的。各位會發現的是NSX Controller在這邊擔任的是一個集中收集網路拓璞的角色,當各台Host接收到VM的封包,不知道往哪送時,就去問NSX Controller。這也解釋了為什麼在NSX環境內,通常在ping時,第一個封包的Latency都會比較大,如下圖

 

圖說:通常在NSX環境內VM第一次互相溝通時,Latency可能會較大

 

理由是Host要去處理第一個封包時有較多的步驟,包括回應ARP Request,與Controller詢問相關的資訊等。但第二個封包之後,Host的Cache就已經儲存相關的資訊,此時後續的網路傳輸就很快速了。

 

下篇我們要和大家討論一個常被問到的問題:在建置NSX並且底層要跑VXLAN這些機制達成網路虛擬化,在硬體網路設備的選擇上,有哪些需要考慮的條件?