前面我們學習了 VXLAN,今天討論跟 VXLAN 緊密相關的 L2 Population。
L2 Population 是用來提高 VXLAN 網絡 Scalability 的。
通常我們說某個系統的 Scalability 好,其意思是: 當系統的規模變大時,仍然能夠高效地工作。
L2 Population 到底解決了怎樣的 Scalability 問題? 請看下圖:
這是一個包含 5 個節點的 VXLAN 網絡,每個節點上運行了若干 VM。
現在假設 Host 1 上的 VM A 想與 Host 4 上的 VM G 通信。
VM A 要做的第一步是獲知 VM G 的 MAC 地址。 於是 VM A 需要在整個 VXLAN 網絡中廣播 APR 報文:“VM G 的 MAC 地址是多少?”
如果 VXLAN 網絡的節點很多,廣播的成本會很大,這樣 Scalability 就成問題了。 幸好 L2 Population 出現了。
L2 Population 的作用是在 VTEP 上提供 Porxy ARP 功能,使得 VTEP 能夠預先獲知 VXLAN 網絡中如下信息: 1. VM IP -- MAC 對應關系 2. VM -- VTEP 的對應關系
當 VM A 需要與 VM G 通信時: 1. Host 1 上的 VTEP 直接響應 VM A 的 APR 請求,告之 VM G 的 MAC 地址。 2. 因為 Host 1 上的 VTEP 知道 VM G 位於 Host 4,會將封裝好的 VXLAN 數據包直接發送給 Host 4 的 VTEP。
這樣就解決了 MAC 地址學習和 APR 廣播的問題,從而保證了 VXLAN 的 Scalability。
那么下一個關鍵問題是:
VTEP 是如何提前獲知 IP -- MAC -- VTEP 相關信息的呢?
答案是:
-
Neutron 知道每一個 port 的狀態和信息; port 保存了 IP,MAC 相關數據。
-
instance 啟動時,其 port 狀態變化過程為:down -> build -> active。
-
每當 port 狀態發生變化時,Neutron 都會通過 RPC 消息通知各節點上的 Neutron agent,使得 VTEP 能夠更新 VM 和 port 的相關信息。
-
VTEP 可以根據這些信息判斷出其他 Host 上都有哪些 VM,以及它們的 MAC 地址,這樣就能直接與之通信,從而避免了不必要的隧道連接和廣播。
理解了工作原理,下節我們學習如何在 Neutorn 中配置 L2 Population。