在物理交換機(jī)中,Mac-Address-Table 被用于 Ethernet 數(shù)據(jù)包的轉(zhuǎn)發(fā)。然而,在邏輯交換機(jī)中,當(dāng)兩個(gè)虛擬機(jī)相互通信時(shí),底層 vSphere Host 必須知道目標(biāo) VM 位于哪個(gè) Host 上,然后通過 VXLAN 封裝發(fā)送原始 Ethernet Frame。問題來了:Host 如何知道目標(biāo) VM 位于哪臺(tái) Host 上?
考慮一個(gè)有三個(gè) vSphere 主機(jī) A/B/C 的環(huán)境,VTEP 為 10.20.10.10/24、10.20.20.11/24、10.20.30.12/24。我們創(chuàng)建了一個(gè)邏輯交換機(jī) VXLAN 5001,并在這個(gè)邏輯交換機(jī)上連接了兩個(gè)虛擬機(jī) VM1 / VM2。邏輯網(wǎng)段是 192.168.10.0/24,兩個(gè)虛擬機(jī)的 IP 是 101/102,分別位于主機(jī) A 和主機(jī) B 上。
當(dāng) VM1 想與 VM2 進(jìn)行流量傳輸時(shí),Host A 如何知道 VM2 在哪個(gè) Host 上?
首先我們需要知道的是,NSX 控制器為每個(gè)邏輯交換機(jī)維護(hù)三個(gè)表。VTEP 表/MAC 表/ARP 表,解釋如下。
VTEP Table
當(dāng)我們創(chuàng)建一個(gè)邏輯交換機(jī)時(shí),我們將 VM "插入 "到該邏輯交換機(jī)上。簡(jiǎn)而言之,每個(gè) vSphere Host 必須知道它有哪些 VM,以及 VM 位于哪個(gè)邏輯交換機(jī)上。當(dāng)每個(gè)虛擬機(jī)所在的邏輯交換機(jī)發(fā)生變化時(shí),vSphere Host 將立即通知 NSX Controller 哪個(gè)邏輯交換機(jī)連接到這個(gè) Host。
也就是說,Host A 和 Host B 將分別向控制器報(bào)告它們有 VXLAN 5001 作為邏輯交換機(jī)。然而,Host C 不會(huì)發(fā)送這個(gè)消息,因?yàn)樗鼪]有任何位于 VXLAN 5001 的虛擬機(jī)。
Host C 在 VXLAN 5001 上沒有任何 VM,所以在 Controller 的 VTEP 表中不會(huì)有 VTEP 10.20.30.12 信息。但要考慮兩個(gè)條件:
如果在 Host C 上創(chuàng)建了一個(gè)新的 VM3 并添加了 VXLAN 5001,Host C 將告訴 Controller 他也有 VXLAN 5001,并且 Controller 上的 VNI 5001 VTEP 表將添加一個(gè)新的 10.20.30.12。
如果 VM 2 從 Host B 被 vMotion 到 Host C,Host C 將向 Controller 報(bào)告它有 VXLAN 5001,而 Host B 將向控制器報(bào)告它沒有 VXLAN 5001,因?yàn)檫@個(gè) Controller 上沒有更多的虛擬機(jī)。
當(dāng) VTEP Table 被創(chuàng)建和更新時(shí),Controller 會(huì)立即通知每個(gè)相關(guān)的 vSphere Hosts,因此不僅 Controller 本身,而且每個(gè) vSphere Host 都有一份最新的 VTEP Table,以了解其上有哪些邏輯交換機(jī),以及除了自己以外還有哪些主機(jī)也有這個(gè)邏輯交換機(jī)。主機(jī) A/B 將知道 VXLAN 5001 上的主機(jī)包括主機(jī)A(10.20.10.10)和主機(jī)B(10.20.20.11)。
MAC Table
同樣地,每個(gè) vSphere Host 也必須知道它上面的 VM 的 MAC Address 是什么。因此,Host 也會(huì)通知 NSX Controller 哪些虛擬機(jī)(MAC Address)在它自己的哪個(gè)邏輯交換機(jī)中。Host A 會(huì)告訴 NSX Controller,它在 VXLAN 5001 中有一個(gè) VM 硬件位置 MAC 1,而 Host B 也會(huì)告訴 Controller,它有一個(gè) MAC 2。因此,NSX Controller 匯總了這些信息,可以為邏輯交換機(jī) 5001 創(chuàng)建 MAC 表。
當(dāng)然,如果有虛擬機(jī)變化或 vMotion 等操作,受影響的主機(jī)也會(huì)通知 NSX 控制器進(jìn)行相關(guān)更新。這個(gè)表只在 NSX 控制器中維護(hù),不會(huì)被發(fā)送到主機(jī)上。
ARP Table
即使沒有安裝 VMTools,vSphere Host 可能仍然有辦法知道每個(gè)虛擬機(jī)的 IP 地址,包括
如果這個(gè) VM 發(fā)送了 DHCP Request,就會(huì)從 reply packet 中知道 IP 地址。
只要這個(gè) VM 發(fā)送 ARP Request,請(qǐng)求的源 IP 將告訴這個(gè) VM 的地址。
接下來,主機(jī)也會(huì)向 NSX 控制器發(fā)送一個(gè)消息,告知自己虛擬機(jī)的 MAC 地址和 IP 地址映射。因此,類似地,NSX 控制器會(huì)了解每個(gè)邏輯交換機(jī)上有哪些 IP 地址,以及相應(yīng)的 MAC 地址。
從上面的討論中,我們會(huì)發(fā)現(xiàn) NSX 控制器實(shí)際上集中了每個(gè)邏輯交換機(jī)的拓?fù)湫畔ⅲ總€(gè)交換機(jī)建立在哪些主機(jī)上,這個(gè)交換機(jī)上有哪些虛擬機(jī)(MAC地址),以及它們對(duì)應(yīng)的 IP 地址。主機(jī) A 如何知道 VM2 在哪個(gè)主機(jī)上?
首先:VM1 不知道 VM2 的 MAC 地址,所以發(fā)出了一個(gè) ARP 請(qǐng)求
此時(shí),vSphere 主機(jī)收到這個(gè) ARP 請(qǐng)求,并且不知道主機(jī)上緩存中的 VM2 的 MAC 地址,那么主機(jī) A 將向 NSX 控制器發(fā)送一個(gè) ARP 請(qǐng)求。然后,主機(jī) A 向 VM1 發(fā)送一個(gè) ARP 回復(fù)。
(另一種可能是,控制器上的 ARP 表還沒有學(xué)到 VM2 的 IP 信息。這時(shí),主機(jī)將直接使用本地 VTEP 表向 VNI 5001 VTEP 表中的所有服務(wù)器發(fā)送該 ARP 請(qǐng)求)
接下來,VM1 向 VM2 發(fā)送一個(gè) Ethernet 數(shù)據(jù)包
當(dāng)主機(jī) A 收到這個(gè)數(shù)據(jù)包時(shí),它將要求控制器查詢 VXLAN 5001 的 MAC 表,得到 MAC2 對(duì)應(yīng)的 VTEP 是 10.20.20.11。啊哈,目的地主機(jī)已經(jīng)發(fā)現(xiàn)了。這一次,Host A 將在原以太網(wǎng)幀的前面加上 VXLAN 表頭。
從底層硬件網(wǎng)絡(luò)到主機(jī) B 的正常 Hop-By-Hop 數(shù)據(jù)包傳輸后,VXLAN 被解包,VXLAN 為 5001,原始以太網(wǎng)幀通過正常的傳輸機(jī)制被發(fā)送到 5001 邏輯交換機(jī)中的 VM2(通過目的 MAC 地址)。
那么從 VM1 到 VM2 的以太網(wǎng)數(shù)據(jù)包呢?
因?yàn)樵?ARP 請(qǐng)求和第一次數(shù)據(jù)包傳輸時(shí),主機(jī) A 已經(jīng)有了相關(guān)的知識(shí)并放入了 Cache,后續(xù)傳輸同一網(wǎng)絡(luò)流的數(shù)據(jù)包時(shí)不需要再詢問 NSX 控制器,直接進(jìn)行 VXLAN 封裝和傳輸。
我希望以上步驟可以幫助你理解 NSX 中同一邏輯交換機(jī)中的數(shù)據(jù)包是如何通過底層硬件網(wǎng)絡(luò)傳遞到目的地的。這也解釋了為什么在 NSX 環(huán)境中,通常在 ping 時(shí),第一個(gè)數(shù)據(jù)包的 Latency 會(huì)比較大。通常情況下,當(dāng) VM 在 NSX 環(huán)境中第一次相互通信時(shí),Latency 可能會(huì)比較大。
原因是 Host 處理第一個(gè)數(shù)據(jù)包有更多的步驟,包括響應(yīng) ARP Request,和向 Controller 詢問相關(guān)信息。但在第二個(gè)數(shù)據(jù)包之后,Host 的 Cache 已經(jīng)存儲(chǔ)了相關(guān)信息,那么隨后的網(wǎng)絡(luò)傳輸就非??炝?。