為什么集群需要 Overlay 網(wǎng)絡(luò)
對計算機網(wǎng)絡(luò)或者 Kubernetes 網(wǎng)絡(luò)稍有了解的工程師都應(yīng)該聽說過延展網(wǎng)絡(luò)(Overlay Network),Overlay 網(wǎng)絡(luò)其實并不是一門新技術(shù),它是指構(gòu)建在另一個網(wǎng)絡(luò)上的計算機網(wǎng)絡(luò),這是一種網(wǎng)絡(luò)虛擬化技術(shù)的形式,近年來云計算虛擬化技術(shù)的演進(jìn)促進(jìn)了網(wǎng)絡(luò)虛擬化技術(shù)的應(yīng)用。
圖 1 - 延展網(wǎng)絡(luò)
因為 Overlay 網(wǎng)絡(luò)是建立在另一個計算機網(wǎng)絡(luò)之上的虛擬網(wǎng)絡(luò),所以它不能獨立出現(xiàn),Overlay 底層依賴的網(wǎng)絡(luò)就是 Underlay 網(wǎng)絡(luò),這兩個概念也經(jīng)常成對出現(xiàn)。
Underlay 網(wǎng)絡(luò)是專門用來承載用戶 IP 流量的基礎(chǔ)架構(gòu)層,它與 Overlay 網(wǎng)絡(luò)之間的關(guān)系有點類似物理機和虛擬機。Underlay 網(wǎng)絡(luò)和物理機都是真正存在的實體,它們分別對應(yīng)著真實存在的網(wǎng)絡(luò)設(shè)備和計算設(shè)備,而 Overlay 網(wǎng)絡(luò)和虛擬機都是依托在下層實體使用軟件虛擬出來的層級。
圖 2 - 網(wǎng)絡(luò)與計算
在分析 Overlay 網(wǎng)絡(luò)的作用之前,我們需要對它的常見實現(xiàn)有大概的了解,在實踐中我們一般會使用虛擬局域網(wǎng)擴展技術(shù)(Virtual Extensible LAN,VxLAN)組建 Overlay 網(wǎng)絡(luò)。在下圖中,兩個物理機可以通過三層的 IP 網(wǎng)絡(luò)互相訪問:
圖 3 - VxLAN 組成的 Overlay 網(wǎng)絡(luò)
VxLAN 使用虛擬隧道端點(Virtual Tunnel End Point、VTEP)設(shè)備對服務(wù)器發(fā)出和收到的數(shù)據(jù)包進(jìn)行二次封裝和解封。
上圖中兩個 VTEP 會相互連接并獲得網(wǎng)絡(luò)中的 MAC 地址、IP 地址等信息,例如,服務(wù)器 1 中的 VTEP 需要知道想要訪問綠色網(wǎng)絡(luò)中的 10.0.0.2 虛擬機需要先訪問 IP 地址為 204.79.197.200 的服務(wù)器 2。這些配置可以被網(wǎng)絡(luò)管理員手動配置、自動學(xué)習(xí)、也可以通過上層的管理器設(shè)置。當(dāng)綠色的 10.0.0.1 虛擬機想要向綠色的 10.0.0.2 發(fā)送數(shù)據(jù)時,會經(jīng)過以下幾個步驟:
圖 4 - Overlay 網(wǎng)絡(luò)中的數(shù)據(jù)包
(1) 綠色的 10.0.0.1 會將 IP 數(shù)據(jù)包發(fā)送給 VTEP;
(2) 服務(wù)器 1 的 VTEP 收到 10.0.0.1 發(fā)送的數(shù)據(jù)包后;
- 從收到的 IP 數(shù)據(jù)包中獲取目的虛擬機的 MAC 地址;
- 在本地的轉(zhuǎn)發(fā)表中查找該 MAC 地址所在服務(wù)器的 IP 地址,即 204.79.197.200;
- 將綠色虛擬機所在的虛擬網(wǎng)絡(luò)標(biāo)識符(VxLAN Network Identifier、VNI)以及原始的 IP 數(shù)據(jù)包作為負(fù)載,構(gòu)建新的 UDP 數(shù)據(jù)包;
- 將新的 UDP 數(shù)據(jù)包發(fā)送到網(wǎng)絡(luò)中;
(3) 服務(wù)器 2 的 VTEP 收到 UDP 數(shù)據(jù)包后;
- 去掉 UDP 數(shù)據(jù)包中的協(xié)議頭;
- 查看數(shù)據(jù)包中 VNI;
- 將 IP 數(shù)據(jù)包轉(zhuǎn)發(fā)給目標(biāo)的綠色服務(wù)器 10.0.0.2;
(4) 綠色的 10.0.0.2 會收到綠色服務(wù)器 10.0.0.1 發(fā)送的數(shù)據(jù)包;
在數(shù)據(jù)包的傳輸過程中,通信的雙方都不知道底層網(wǎng)絡(luò)做的這些轉(zhuǎn)換,它們認(rèn)為兩者可以通過二層的網(wǎng)絡(luò)互相訪問,但是實際上經(jīng)過了三層 IP 網(wǎng)絡(luò)的中轉(zhuǎn),通過 VTEP 之間建立的隧道實現(xiàn)了連通。除了 VxLAN 之外,Overlay 網(wǎng)絡(luò)還有很多實現(xiàn)方案,不過也都大同小異。Overlay 網(wǎng)絡(luò)雖然能夠利用底層網(wǎng)絡(luò)在多數(shù)據(jù)中心之間組成二層網(wǎng)絡(luò),但是它的封包和拆包過程也會帶來額外開銷,所以為什么我們的集群需要 Overlay 網(wǎng)絡(luò)呢,本文將介紹 Overlay 網(wǎng)絡(luò)解決的三個問題:
- 云計算中集群內(nèi)的、跨集群的或者數(shù)據(jù)中心間的虛擬機和實例的遷移比較常見;
- 單個集群中的虛擬機規(guī)模可能非常大,大量的 MAC 地址和 ARP 請求會為網(wǎng)絡(luò)設(shè)備帶來巨大的壓力;
- 傳統(tǒng)的網(wǎng)絡(luò)隔離技術(shù) VLAN 只能建立 4096 個虛擬網(wǎng)絡(luò),公有云以及大規(guī)模的虛擬化集群需要更多的虛擬網(wǎng)絡(luò)才能滿足網(wǎng)絡(luò)隔離的需求;
虛擬機遷移
Kuberentes 目前已經(jīng)是容器編排領(lǐng)域的事實標(biāo)準(zhǔn)了,雖然很多傳統(tǒng)行業(yè)仍然在使用物理機部署服務(wù),但是越來越多的計算任務(wù)在未來都會跑在虛擬機上。虛擬機遷移是將虛擬機從一個物理硬件設(shè)備移到另一個設(shè)備的過程,因為日常的更新維護(hù),集群中的大規(guī)模虛擬機遷移是比較常見的事情,上千臺物理機組成的大集群使得集群內(nèi)的資源調(diào)度變得更加容易,我們可以通過虛擬機遷移來提高資源的利用率、容忍虛擬機的錯誤并提高節(jié)點的可移植性。
當(dāng)虛擬機所在的宿主機因為維護(hù)或者其他原因宕機時,當(dāng)前實例就需要遷移到其他的宿主機上,為了保證業(yè)務(wù)不中斷,我們需要保證遷移過程中的 IP 地址不變,因為 Overlay 是在網(wǎng)絡(luò)層實現(xiàn)二層網(wǎng)絡(luò),所以多個物理機之間只要網(wǎng)絡(luò)層可達(dá)就能組建虛擬的局域網(wǎng),虛擬機或者容器遷移后仍然處于同一個二層網(wǎng)絡(luò),也就不需要改變 IP 地址。
圖 5 - 跨數(shù)據(jù)中心的虛擬機遷移
如上圖所示,遷移后的虛擬機與其他的虛擬機雖然位于不同的數(shù)據(jù)中心,但是由于上述兩個數(shù)據(jù)中心之間可以通過 IP 協(xié)議連通,所以遷移后的虛擬機仍然可以通過 Overlay 網(wǎng)絡(luò)與原集群的虛擬機組成二層網(wǎng)絡(luò),集群內(nèi)部的主機也完全不清楚、不關(guān)心底層的網(wǎng)絡(luò)架構(gòu),它們只知道不同虛擬機之間是可以連通的。
虛擬機規(guī)模
我們在 為什么 Mac 地址不需要全球唯一 曾經(jīng)介紹過二層網(wǎng)絡(luò)的通信需要依賴 MAC 地址,一個傳統(tǒng)的二層網(wǎng)絡(luò)需要網(wǎng)絡(luò)設(shè)備中存儲從 IP 地址到 MAC 地址的轉(zhuǎn)發(fā)表。
目前 Kuberentes 官方支持的最大集群為 5000 節(jié)點,如果這 5000 個節(jié)點中的每個節(jié)點都僅僅包含一個容器,這對于內(nèi)部的網(wǎng)絡(luò)設(shè)備其實沒有太大的壓力,但是在實際情況下 5000 節(jié)點的集群中都包含幾萬甚至幾十萬個容器,當(dāng)某個容器向集群中發(fā)送 ARP 請求,集群中的全部容器都會收到 ARP 請求,這時會帶來極高的網(wǎng)絡(luò)負(fù)載。
在使用 VxLAN 搭建的 Overlay 網(wǎng)絡(luò)中,網(wǎng)絡(luò)會將虛擬機發(fā)送的數(shù)據(jù)重新封裝成 IP 數(shù)據(jù)包,這樣網(wǎng)絡(luò)只需要知道不同 VTEP 的 MAC 地址,由此可以將 MAC 地址表項中的幾十萬條數(shù)據(jù)降低到幾千條,ARP 請求也只會在集群中的 VTEP 之間擴散,遠(yuǎn)端的 VTEP 將數(shù)據(jù)拆包后也僅會在本地廣播,不會影響其他的 VTEP,雖然這對于集群中的網(wǎng)絡(luò)設(shè)備仍然有較高的要求,但是已經(jīng)極大地降低了核心網(wǎng)絡(luò)設(shè)備的壓力。
圖 6 - Overlay 網(wǎng)絡(luò)中的 ARP 請求
Overlay 網(wǎng)絡(luò)其實與軟件定義網(wǎng)絡(luò)(Software-defined networking、SDN)[^4]密切相關(guān),而 SDN 引入了數(shù)據(jù)平面和控制平面,其中數(shù)據(jù)平面負(fù)責(zé)轉(zhuǎn)發(fā)數(shù)據(jù),而控制平面負(fù)責(zé)計算并分發(fā)轉(zhuǎn)發(fā)表。VxLAN 的 RFC7348 中只定義了數(shù)據(jù)平面的內(nèi)容,由該技術(shù)組成的網(wǎng)絡(luò)可以通過傳統(tǒng)的自學(xué)習(xí)模式學(xué)習(xí)網(wǎng)絡(luò)中的 MAC 與 ARP 表項[^5],但是在大規(guī)模的集群中,我們?nèi)匀恍枰肟刂破矫娣职l(fā)路由轉(zhuǎn)發(fā)表。
網(wǎng)絡(luò)隔離
大規(guī)模的數(shù)據(jù)中心往往都會對外提供云計算服務(wù),同一個物理集群可能會被拆分成多個小塊分配給不同的租戶(Tenant),因為二層網(wǎng)絡(luò)的數(shù)據(jù)幀可能會進(jìn)行廣播,所以出于安全的考慮這些不同的租戶之間需要進(jìn)行網(wǎng)絡(luò)隔離,避免租戶之間的流量互相影響甚至惡意攻擊。傳統(tǒng)的網(wǎng)絡(luò)隔離會使用虛擬局域網(wǎng)技術(shù)(Virtual LAN、VLAN),VLAN 會使用 12 比特表示虛擬網(wǎng)絡(luò) ID,虛擬網(wǎng)絡(luò)的上限是 4096 個。
圖 7 - VLAN 協(xié)議頭
4096 個虛擬網(wǎng)絡(luò)對于大規(guī)模的數(shù)據(jù)中心來說遠(yuǎn)遠(yuǎn)不夠,VxLAN 會使用 24 比特的 VNI 表示虛擬網(wǎng)絡(luò)個數(shù),總共可以表示 16,777,216 個虛擬網(wǎng)絡(luò),這也就能滿足數(shù)據(jù)中心多租戶網(wǎng)絡(luò)隔離的需求了。
圖 8 - VxLAN 協(xié)議頭
更多的虛擬網(wǎng)絡(luò)其實是 VxLAN 順手帶來的好處,它不應(yīng)該成為使用 VxLAN 的決定性因素。VLAN 協(xié)議的擴展協(xié)議 IEEE 802.1ad 允許我們在以太網(wǎng)幀中加入兩個 802.1Q 的協(xié)議頭,兩個 VLAN ID 組成的 24 比特也可以表示 16,777,216 個虛擬網(wǎng)絡(luò)[^6],所以想要解決網(wǎng)絡(luò)隔離不是使用 VxLAN 或者 Overlay 網(wǎng)絡(luò)的充分條件。
總結(jié)
今天的數(shù)據(jù)中心包含多個集群以及海量的物理機,Overlay 網(wǎng)絡(luò)是虛擬機和底層網(wǎng)絡(luò)設(shè)備之間的中間層,通過 Overlay 網(wǎng)絡(luò)這一個中間層,我們可以解決虛擬機的遷移問題、降低二層核心網(wǎng)絡(luò)設(shè)備的壓力并提供更大規(guī)模的虛擬網(wǎng)絡(luò)數(shù)量:
- 在使用 VxLAN 構(gòu)成二層網(wǎng)絡(luò)中,虛擬機在不同集群、不同可用區(qū)和不同數(shù)據(jù)中心遷移后,仍然可以保證二層網(wǎng)絡(luò)的可達(dá)性,這能夠幫助我們保證線上業(yè)務(wù)的可用性、提升集群的資源利用率、容忍虛擬機和節(jié)點的故障;
- 集群中虛擬機的規(guī)模可能是物理機是幾十倍,與物理機構(gòu)成的傳統(tǒng)集群相比,虛擬機構(gòu)成的集群包含的 MAC 地址數(shù)量可能多一兩個數(shù)量級,網(wǎng)絡(luò)設(shè)備很難承擔(dān)如此大規(guī)模的二層網(wǎng)絡(luò)請求,Overlay 網(wǎng)絡(luò)通過 IP 封包和控制平面可以減少集群中的 MAC 地址表項和 ARP 請求;
- VxLAN 的協(xié)議頭使用 24 位的 VNI 表示虛擬網(wǎng)絡(luò),總共可以表示 1600 萬的虛擬網(wǎng)絡(luò),我們可以為不同的虛擬網(wǎng)絡(luò)單獨分配網(wǎng)絡(luò)帶寬,滿足多租戶的網(wǎng)絡(luò)隔離需求;
需要注意的是,Overlay 網(wǎng)絡(luò)只是一種在物理網(wǎng)絡(luò)上的虛擬網(wǎng)絡(luò),使用該技術(shù)并不能直接解決集群中的規(guī)模性等問題,而 VxLAN 也不是組建 Overlay 網(wǎng)絡(luò)的唯一方法,在不同場景中我們可以考慮使用不同的技術(shù),例如:NVGRE、GRE 等。到最后,我們還是來看一些比較開放的相關(guān)問題,有興趣的讀者可以仔細(xì)思考一下下面的問題:
- VxLAN 將原始數(shù)據(jù)包封裝成 UDP 在網(wǎng)絡(luò)上分發(fā),那么 NVGRE 和 STT 分別使用哪些方法傳輸數(shù)據(jù)呢?
- 在 Kubernetes 中部署 Overlay 網(wǎng)絡(luò)應(yīng)該使用什么技術(shù)或者軟件?


































