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

相关推荐
Joshua-a7 小时前
macOS下arm编译缺少stdint.h等问题
arm开发·macos
蚂蚁舞10 小时前
在arm架构的Debian系统手动安装和卸载Mysql8的操作
arm开发·debian·安装mysql·mysql8·卸载mysql
m0_5713728210 小时前
嵌入式学习——ARM 体系架构1
arm开发·学习
生涯にわたる学び15 小时前
自旋锁/互斥锁 设备树 iic驱动总线 day66 67 68
arm开发
李小白2020020220 小时前
windows 10系统安装arm虚拟机
arm开发
亿道电子Emdoor3 天前
【ARM】PACK包管理
arm开发
wypywyp3 天前
基于arm芯片的驱动开发——温湿度传感器dht11
arm开发·驱动开发
亿道电子Emdoor4 天前
【ARM】MDK如何实现使用Hex文件完成程序烧录
arm开发·stm32·单片机
彻骨寒风4 天前
在麒麟 ARM (aarch64)安装OpenJDK11和elasticsearchkibana
运维·arm开发·jenkins
2301_1472583694 天前
ARM - GPIO 标准库开发
arm开发