Flannel后端为UDP模式下,分析数据包的发送方式——tun设备(三)

在分析 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)。其工作流程如下:

  1. 接收数据包

    • 当内核根据路由表决定将数据包发送到 TUN 设备(如 flannel.1)时,数据包从内核态传递到用户态。
    • 用户态程序(如 flanneld)通过文件描述符读取 TUN 设备上的数据包(通常是 IP 数据包)。
  2. 处理数据包

    • 用户态程序可以对数据包进行处理,例如封装(添加 UDP 头部)、加密或转发。
    • 在 Flannel UDP 模式中,flanneld 将原始 IP 数据包(例如目标 IP 为 10.244.2.5)封装为 UDP 数据包。
  3. 发送数据包

    • 用户态程序处理后的数据包(例如 UDP 封装后的数据包)通过 TUN 设备写回内核,或直接通过其他接口(如 enp0s3)发送。
    • 在接收方向,外部数据包到达 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 设备的工作流程

  1. 数据包到达 flannel.1

    • 当源 Pod(例如 10.244.0.x)发送 ICMP 数据包(ping 10.244.2.5),数据包通过 cni0 进入主机网络命名空间。
    • 主机路由表将数据包路由到 flannel.1,因为目标 IP 10.244.2.5 匹配 10.244.2.0/24
  2. flanneld 读取数据包

    • flannel.1 是一个 TUN 设备,数据包从内核态传递到用户态的 flanneld 进程。
    • 数据包是原始 IP 数据包(源 IP 10.244.0.x,目标 IP 10.244.2.5,大小为 84 字节:20 字节 IP 头部 + 64 字节 ICMP)。
  3. 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)发送。
  4. 接收方向

    • 目标节点接收到 UDP 数据包(通过其物理接口),flanneld 通过目标节点的 TUN 设备(类似 flannel.1)读取数据。
    • flanneld 解封装,提取原始 IP 数据包,写回内核,通过 cni0 转发到目标 Pod(10.244.2.5)。

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 处理。

相关推荐
早日退休!!!12 小时前
ARM Cortex-M核 【保存上下文&恢复上下文】
arm开发·单片机·嵌入式硬件
早日退休!!!19 小时前
ARM A核、ARM M核、X86与RISC-V架构:寄存器作用及上下文处理差异报告
arm开发·架构·risc-v
A-花开堪折1 天前
Qemu-NUC980(十一):SPI Controller
linux·arm开发·驱动开发·嵌入式硬件
Q_21932764552 天前
基于ARM的嵌入式温度控制系统的设计
arm开发
想你依然心痛2 天前
从x86到ARM的HPC之旅:鲲鹏开发工具链(编译器+数学库+MPI)上手与实战
java·开发语言·arm开发·鲲鹏·昇腾
MUTA️2 天前
x86 架构下运行 ARM-ROS2 Docker 镜像操作指南
arm开发·docker·架构
比奇堡派星星3 天前
Linux 杂项设备驱动框架详解
linux·arm开发·驱动开发
xingzhemengyou13 天前
LINUX 通过/proc/interrupts了解系统硬件中断的使用情况
linux·arm开发
rfidunion3 天前
ubuntu下使用qemu模拟ARM(一)-------安装samba服务器
服务器·arm开发·ubuntu
三佛科技-134163842123 天前
FT32F072xx、FT32F072xB、FT32F072x6/x8基于ARM Cortex-M0内核32位单片机分析
arm开发·单片机·嵌入式硬件·智能家居·pcb工艺