上一次介紹了如何簡易地產出一個邏輯交換器,並且說明了邏輯交換器底層的VXLAN封裝機制,這次將深入講解網路虛擬化怎樣在底層運作,並說明其控制的原理。
繼前期「VMware NSX的邏輯交換器運作機制(一)」文章的介紹之後,本次要進一步與大家討論一個核心的問題:「在實體交換器內,是利用Mac-Address-Table來進行Ethernet封包的轉發。但是NSX軟體定義網路的機制內,在邏輯交換器內兩個VM互相溝通時,底層的vSphere Host必須要知道目的地VM是位在哪一台Host上,然後透過VXLAN封裝把原始的Ethernet Frame送過去」。
但是,問題來了:「vSphere Host如何知道目的地VM位在哪個Host上?」
這裡用圖1進行說明。考慮環境內有三台vSphere Host A、B及C,VTEP分別為10.20.10.10/24、10.20.20.11/24以及10.20.30.12/24。我們建立了一個邏輯交換器VXLAN 5001,並且接取了兩個虛擬機器VM1、VM2在此邏輯交換器上。邏輯網段是192.168.10.0/24,兩個VM的IP分別是101與102,各自位於Host A與Host B上。
|
▲圖1 示範圖例。 |
當VM1要與VM2進行交通傳輸,Host A怎麼知道VM2在哪一台Host上?
VTEP、MAC以及ARP Table
首先要知道的是,在NSX Controller上針對每個邏輯交換器會維持三張表:VTEP Table、MAC Table以及ARP Table,以下針對這三張表進行說明。
VTEP Table
建立邏輯交換器時,一般會把VM「插入」到這個邏輯交換器上。簡而言之,每一個vSphere Host一定知道它身上有哪些VM,以及這個VM需要位在哪個邏輯交換器。當各個VM所處的邏輯交換器有異動時,vSphere Host會立即通知NSX Controller這個Host身上有接取哪個邏輯交換器。
也就是說,在圖1的環境內,Host A與Host B會分別回報Controller它們身上需要有VXLAN 5001這個邏輯交換器(因為VM1/VM2位於這個邏輯交換器上)。
但Host C因為目前沒有任何VM位於VXLAN 5001,就不會發出這個訊息。因此,於NSX Controller上對應VXLAN 5001(VNI 5001)這個邏輯交換器,就會有如表1所示的VTEP Table。
表1 VTEP Table內容
Host C上沒有任何VM在VXLAN 5001上,因此在Controller內的VTEP Table中就不會有VTEP 10.20.30.12的資訊,但須考慮以下兩種狀況:
1. 在Host C上新建了一個VM 3並加入了VXLAN
5001。此時Host C會告知Controller它身上也有VXLAN 5001,Controller上的VNI 5001 VTEP Table就會新增一筆10.20.30.12。
2. 或是如果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也有這個邏輯交換器。以圖1來說,Host A和Host 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)。
在圖1內,Host A會告知NSX Controller在自己身上的VXLAN 5001內有一個VM硬體位置為MAC 1,而Host B也會告知Controller有一個MAC 2。因此,NSX Controller匯集了這些資訊,針對邏輯交換器5001就可以建立起如表2所示的MAC Table。
當然如果VM有異動或是有vMotion等動作,影響到的Host也會通知NSX Controller進行相關的更新。這張表僅維護於NSX Controller內,不會發送給各台主機。
表2 MAC Table設定內容