當前位置:
首頁 > 最新 > 容器 Flannel vxlan 基本原理和驗證

容器 Flannel vxlan 基本原理和驗證

摘要

SDN(軟體定義網路)改變了傳統的網路世界規則,它的靈活性和開放性帶來了成本的優勢,如 fastly 使用 SDN 技術構建了一個可伸縮的低成本路由器。而在容器生態中,Flannel 為容器集群構建 Overlay 網路。網上大多數文章還是介紹的 Flannel 第一個版本 vxlan overlay 實現原理,本文介紹 Flannel vxlan overlay 第一版和最新版兩種方式的基本原理。

Flannel vxlan 核心設計和歷史

關於 vxlan 的知識網上很多,簡單來講是在 Underlay 網路之上使用隧道技術依託 UDP 協議層構建的 Overlay 的邏輯網路,並能靈活穿透三層 Underlay 網路,使邏輯網路與物理網路解耦,實現靈活的組網需求,不僅僅能適配 VM 虛擬機環境,還能用於 Container 容器環境。

這裡網路數據包轉發的核心是 RIB 路由表、FDB 轉發表、ARP 路由表,即 vxlan 要解決二層 Guest MAC 地址定址、跨三層 Guest IP 地址定址的問題,並實現全網高效路由分發和同步,這裡討論容器生態中 Flannel 的實現方案。

在最新的 Flannel vxlan 代碼vxlan.go官方有一段注釋說明如下:

大致意思:

Flannel 的第一個版本,l3miss 學習,通過查找 ARP 表 MAC 完成的。 l2miss 學習,通過獲取 VTEP 上的 public ip 完成的。

Flannel 的第二個版本,移除了 l3miss 學習的需求,當遠端主機上線,只是直接添加對應的 ARP 表項即可,不用查找學習了。

Flannel的最新版本,移除了 l2miss 學習的需求,不再監聽 netlink 消息。

它的工作模式:

創建 vxlan 設備,不再監聽任何 l2miss 和 l3miss 事件消息

為遠端的子網創建路由

為遠端主機創建靜態 ARP 表項

創建 FDB 轉發表項,包含 VTEP MAC 和遠端 Flannel 的 public IP

l2miss 和 l3miss vxlan 實現方案

理論基礎

l2miss 和 l3miss vxlan 方案的基礎依賴 Kernel 內核的 vxlan DOVE 機制,當數據包無法在 FDB 轉發表中找到對應的 MAC 地址轉發目的地時 kernel 發出 l2miss 通知事件,當在 ARP 表中找不到對應 IP-MAC 記錄時 kernel 發出 l3miss 通知事件。 DOVE 的kernel patch如下:

add DOVE extensions for vxlan

This patch provides extensions to vxlan for supporting Distributed Overlay Virtual Ethernet (DOVE) networks. The patch includes:

可以看到內核在查詢 vxlan_find_mac FDB 轉發時未命中則發送 l2miss netlink 通知,在查詢 neigh_lookup ARP 表時未命中則發送 l3miss netlink 通知,以便有機會讓用戶態學習路由,這就是第一代 Flannel vxlan 的實現基礎。

模擬組網:

圖中 10.20.1.4 與 10.20.1.3 通信流程:

當 Guest0 第一次發送一個目的地址 10.20.1.3 數據包的時候,進行二層轉發,查詢本地 Guest ARP 表,無記錄則發送 ARP 廣播 who is 10.20.1.3;

vxlan 開啟了的本地 ARP 代答 proxy、l2miss、l3miss 功能,數據包經過 vtep0 邏輯設備時,當 Host ARP 表無記錄時,vxlan 觸發 l2miss 事件,ARP 表是用於三層 IP 進行二層 MAC 轉發的映射表,存儲著 IP-MAC-NIC 記錄,在二層轉發過程中往往需要根據 IP 地址查詢對應的 MAC 地址從而通過數據鏈路轉發到目的介面中;

l2miss 事件被 Flannel 的 Daemon 進程捕捉到,Daemon 查詢 Etcd 存儲的路由資料庫並返回 10.20.1.3 的 MAC 地址 e6:4b:f9:ce:d7:7b 並存儲 Host ARP 表;

vtep0 命中 ARP 記錄後回復 ARP Reply;

Guest0 收到 ARP Reply 後存 Guest ARP 表,開始發送數據,攜帶目的 e6:4b:f9:ce:d7:7b 地址;

數據包經過 bridge 時查詢 FDB(Forwarding Database entry) 轉發表,詢問 where e6:4b:f9:ce:d7:7b send to? 如未命中記錄,發生 l3miss 事件,FDB 表為 2 層交換機的轉發表,FDB 存儲這 MAC-PORT 的映射關係,用於 MAC數據包從哪個介面出;

Flannel Daemon 捕捉 l3miss 事件,並向 FDB 表中加入目的 e6:4b:f9:ce:d7:7b 的數據包發送給對端 Host 192.168.100.3 ;

此時 e6:4b:f9:ce:d7:7b 數據包流向 vtep0 介面,vtep0 開始進行 UDP 封裝,填充 VNI 號為 1,並與對端 192.168.100.3 建立隧道,對端收到 vxlan 包進行拆分,根據 VNI 分發 vtep0 ,拆分後傳回 Bridge,Bridge 根據 dst mac 地址轉發到對應的 veth 介面上,此時就完成了整個數據包的轉發;

回程流程類似;

下面我們來模擬行 Flannel 的網路實現:

模擬驗證

環境:

2 台 Centos7.x 機器,2 張物理網卡

2 個 Bridge,2 張 vtep 網卡

2 個 Namespace,2 對 veth 介面

步驟:

創建 Namespace 網路隔離空間模擬 Guest 環境

創建 veth 介面、Bridge 虛擬交換機、vtep 介面

驗證 l2miss 和 l3miss 通知事件

配置路由

驗證連通性,Guest0 ping Guest1

準備環境

網口配置如下:

觀察 l2miss 和 l3miss 通知事件

當缺失 ARP 記錄時觸發[nsid 1]10.20.1.3 dev if45 FAILED,當缺失 FDB 轉發記錄時觸發[nsid current]miss dev vtep0 lladdr e6:4b:f9:ce:d7:7b STALE,與預期一樣,未配置路由前,網路不通。

配置 Guest 的路由

回程路由類似,不贅述

測試連通性

10.20.1.4 ping 10.20.1.3

配置好對端 Guest 路由後,網路連通成功。通過成功配置需要互通所有 Guest 路由轉發信息後,Overlay 的數據包能成功抵達最終目的 Host 的目的 Guest 介面上。這種方式存在明顯的缺陷:

l2miss 和 l3miss 方案缺陷

每一台 Host 需要配置所有需要互通 Guest 路由,路由記錄會膨脹,不適合大型組網

通過 netlink 通知學習路由的效率不高

Flannel Daemon 異常後無法持續維護 ARP 和 FDB 表,從而導致網路不通

三層路由 vxlan 實現方案

為了彌補 l2miss 和 l3miss 的缺陷,flannel 改用了三層路由的實現方案。

理論基礎

組網:

Flannel 在最新 vxlan 實現上完全去掉了 l2miss & l3miss 方式,Flannel deamon 不再監聽 netlink 通知,因此也不依賴 DOVE。而改成主動給目的子網添加遠端 Host 路由的新方式,同時為 vtep 和 bridge 各自分配三層 IP 地址,當數據包到達目的 Host 後,在內部進行三層轉發,這樣的好處就是 Host 不需要配置所有的 Guest 二層 MAC 地址,從一個二層定址轉換成三層定址,路由數目與 Host 機器數呈線性相關,官方聲稱做到了同一個 VNI 下每一台 Host 主機 1 route,1 arp entry and 1 FDB entry。

模擬驗證

環境:

2 台 Centos7.x 機器,2張網卡

2 個 Bridge,2 張 vtep 網卡

2 個 Namespace,2 對 veth 介面

步驟:

創建 Namespace 網路隔離空間模擬 Guest 環境

創建 veth 介面、Bridge 虛擬交換機、vtep 介面

配置路由

驗證連通性,Guest0 ping Guest1

準備環境

網口配置如下:

路由 Host 配置

回程路由類似。

測試連通性

10.20.1.4 ping 10.20.2.4

可以看到,通過增加一條三層路由 10.20.2.0/24 via 10.20.2.0 dev vtep0 onlink 使目標為 10.20.2.0/24 的目的 IP 包通過 vtep0 介面送往目的 Host1,目的 Host1 收到後,在本地 Host 做三層轉發,最終送往 veth0 介面。在 Host 多個 Guest 場景下也無需額外配置 Guest 路由,從而減少路由數量,方法變得高效。

總結

以上就是對 Flannel 第一個版本和最新版本 vxlan overlay 實現基本原理的解析和驗證,可以看到 SDN 的 Overlay 配置很靈活也很巧妙,Overlay 的數據包通過 vxlan 這種隧道技術穿透 Underlay 網路,路由配置很靈活,同時主機中迭代著兩層網路配置帶來了一定的複雜性,但最終無論方案如何變化都離不開二三層路由轉發的基本原則。

附錄

Linux 上實現 vxlan 網路

Kernel Map

Network Stack

Packet Flow

TCP/IP Network Stack

【投稿】

歡迎SDN、NFV、邊緣計算、SD-WAN、5G 網路切片等網路方向的觀點類、新聞類、技術類稿件。


喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 SDNLAB 的精彩文章:

谷歌面臨歐洲監管機構創紀錄罰款
華為開源DMM項目助力雲網路的傳輸協議棧加速

TAG:SDNLAB |