在分析 Kubernetes 環境中 Flannel UDP 模式的數據包轉發時,我們提到 flannel.1
是一個 TUN 設備,它在數據包處理中起到了關鍵作用。
什么是 TUN 設備?
TUN 設備(Tunnel 設備)是 Linux 系統中一種虛擬網絡接口,工作在 網絡層(Layer 3),用于在用戶態和內核態之間傳遞 IP 數據包。TUN 設備是 虛擬化網絡 的核心組件,常用于 VPN、隧道技術(如 Flannel、OpenVPN)和網絡虛擬化場景。
關鍵特性
- 工作層次:TUN 設備處理 IP 數據包(網絡層),而不處理鏈路層幀(如以太網幀)。相比之下,TAP 設備 工作在鏈路層(Layer 2),處理以太網幀。
- 用戶態與內核態橋接:TUN 設備充當用戶態程序(如
flanneld
)和內核網絡協議棧之間的橋梁,允許用戶態程序讀寫 IP 數據包。 - 虛擬接口:TUN 設備是虛擬的,沒有物理硬件支持,通過軟件模擬網絡接口的功能。
- 用途:常用于網絡隧道、虛擬化網絡、VPN 和容器網絡(如 Kubernetes 的 Flannel)。
TUN 設備的工作原理
TUN 設備可以看作一個“管道”,一端連接內核的網絡協議棧,另一端連接用戶態程序(如 flanneld
)。其工作流程如下:
-
接收數據包:
- 當內核根據路由表決定將數據包發送到 TUN 設備(如
flannel.1
)時,數據包從內核態傳遞到用戶態。 - 用戶態程序(如
flanneld
)通過文件描述符讀取 TUN 設備上的數據包(通常是 IP 數據包)。
- 當內核根據路由表決定將數據包發送到 TUN 設備(如
-
處理數據包:
- 用戶態程序可以對數據包進行處理,例如封裝(添加 UDP 頭部)、加密或轉發。
- 在 Flannel UDP 模式中,
flanneld
將原始 IP 數據包(例如目標 IP 為10.244.2.5
)封裝為 UDP 數據包。
-
發送數據包:
- 用戶態程序處理后的數據包(例如 UDP 封裝后的數據包)通過 TUN 設備寫回內核,或直接通過其他接口(如
enp0s3
)發送。 - 在接收方向,外部數據包到達 TUN 設備后,同樣由用戶態程序解封裝,然后寫回內核,交給協議棧處理。
- 用戶態程序處理后的數據包(例如 UDP 封裝后的數據包)通過 TUN 設備寫回內核,或直接通過其他接口(如
TUN 設備在 Flannel UDP 模式中的作用
在 Kubernetes 環境中,Flannel 使用 UDP 模式時,flannel.1
是一個 TUN 設備,用于跨節點 Pod 通信。結合你的路由表和問題背景(ping 10.244.2.5
),我們分析 TUN 設備(flannel.1
)的具體作用:
路由表相關條目
10.244.2.0 10.244.2.0 255.255.255.0 UG 0 0 0 flannel.1
- 數據包(目標 IP
10.244.2.5
)匹配此路由,通過flannel.1
發出,網關為10.244.2.0
。
TUN 設備的工作流程
-
數據包到達 flannel.1:
- 當源 Pod(例如
10.244.0.x
)發送 ICMP 數據包(ping 10.244.2.5
),數據包通過cni0
進入主機網絡命名空間。 - 主機路由表將數據包路由到
flannel.1
,因為目標 IP10.244.2.5
匹配10.244.2.0/24
。
- 當源 Pod(例如
-
flanneld 讀取數據包:
flannel.1
是一個 TUN 設備,數據包從內核態傳遞到用戶態的flanneld
進程。- 數據包是原始 IP 數據包(源 IP
10.244.0.x
,目標 IP10.244.2.5
,大小為 84 字節:20 字節 IP 頭部 + 64 字節 ICMP)。
-
UDP 封裝:
flanneld
查詢 etcd 或 Kubernetes API,確定10.244.2.0/24
對應的目標節點物理 IP(例如192.168.1.x
)。flanneld
將原始數據包封裝為 UDP 數據包:- 外部 IP 頭部:20 字節(源 IP 為當前節點物理 IP,目標 IP 為目標節點物理 IP)。
- UDP 頭部:8 字節(默認端口 8472)。
- 原始數據包:84 字節。
- 總大小:
20 + 8 + 84 = 112 字節
。
- 封裝后的 UDP 數據包通過主機的物理接口(如
enp0s3
)發送。
-
接收方向:
- 目標節點接收到 UDP 數據包(通過其物理接口),
flanneld
通過目標節點的 TUN 設備(類似flannel.1
)讀取數據。 flanneld
解封裝,提取原始 IP 數據包,寫回內核,通過cni0
轉發到目標 Pod(10.244.2.5
)。
- 目標節點接收到 UDP 數據包(通過其物理接口),
TUN 設備的角色
- 橋接用戶態和內核態:
flannel.1
允許flanneld
進程處理跨節點通信,封裝和解封裝數據包。 - 透明性:Pod 認為自己直接與目標 IP 通信,TUN 設備和
flanneld
隱藏了 UDP 封裝的復雜性。 - 靈活性:TUN 設備支持用戶態程序(如
flanneld
)自定義數據包處理,適合 Flannel UDP 模式的輕量實現。
TUN 設備與 UDP 模式的關聯
在 Flannel UDP 模式中,TUN 設備(flannel.1
)是關鍵組件:
- 數據包封裝:TUN 設備允許
flanneld
在用戶態封裝 IP 數據包為 UDP 數據包,適合不支持內核態 VXLAN 的環境。 - 性能特點:UDP 模式通過用戶態處理,性能低于 VXLAN(內核態),但更簡單,適合小型集群或特殊環境。
- 路由表依賴:路由表中的
10.244.2.0/24
條目將數據包導向flannel.1
,確保跨節點通信由flanneld
處理。