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
)。其工作流程如下:
-
接收数据包:
- 当内核根据路由表决定将数据包发送到 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
处理。
相关文章:
Flannel后端为UDP模式下,分析数据包的发送方式——tun设备(三)
在分析 Kubernetes 环境中 Flannel UDP 模式的数据包转发时,我们提到 flannel.1 是一个 TUN 设备,它在数据包处理中起到了关键作用。 什么是 TUN 设备? TUN 设备(Tunnel 设备)是 Linux 系统中一种虚拟网络接口&#x…...

6:OpenCV—图像滤波
过滤图像和视频 图像滤波是一种邻域运算,其中输出图像中任何给定像素的值是通过对相应输入像素附近的像素值应用某种算法来确定的。该技术通常用于平滑、锐化和检测图像和视频的边缘。 让我们了解在讨论图像过滤技术、内核和卷积时使用的一些术语的含义。 内核 内…...

pytorch语法学习
启动 python main.py --config llve.yml --path_y test -i output...

5:OpenCV—图像亮度、对比度变换
1.更改图像和视频的亮度 更改亮度 更改图像的亮度是常用的点操作。在此操作中,图像中每个像素的值应增加/减少一个常数。要更改视频的亮度,应对视频中的每一帧执行相同的操作。 如果要增加图像的亮度,则必须为图像中的每个像素添加一些正常…...

Oracle 的V$ACTIVE_SESSION_HISTORY 视图
Oracle 的V$ACTIVE_SESSION_HISTORY 视图 V$ACTIVE_SESSION_HISTORY显示数据库中的 Sampled Session 活动。 它包含每秒拍摄一次的活动数据库会话的快照。如果数据库会话位于 CPU 上或正在等待不属于等待类的事件,则认为该会话处于活动状态。请参阅 view 以了解有…...
redis数据持久化和配置-13(配置 AOF:Appendfsync 策略)
配置 AOF:Appendfsync 策略 在 Redis 中配置仅附加文件 (AOF) 持久性机制涉及选择正确的 appendfsync 策略。此策略指示 Redis 将数据写入磁盘上的 AOF 文件的频率。策略的选择会显著影响数据安全和性能。了解这些策略之间的权衡对于确保 Re…...

【Python 算法零基础 4.排序 ② 冒泡排序】
目录 一、引言 二、算法思想 三、时间复杂度和空间复杂度 1.时间复杂度 2.空间复杂度 四、冒泡排序的优缺点 1.算法的优点 2.算法的缺点 五、实战练习 88. 合并两个有序数组 算法与思路 ① 合并数组 ② 冒泡排序 2148. 元素计数 算法与思路 ① 排序 ② 初始化计数器 ③ 遍历数组…...

Python:操作Excel设置行高和列宽
Python 操作 Excel:轻松设置行高与列宽 📊✨ 在处理 Excel 表格时,除了正确展示数据本身,合理设置行高与列宽也是提升可读性和专业度的关键因素。本文将带你了解如何使用 Python 的 openpyxl 库,优雅地控制 Excel 表格的排版布局,实现行高、列宽的灵活设置与自动适配! …...

docker-volume-backup 备份 ragflow volumes
自定义项目名称 这里我自定义了 ragflow 项目的名称,修改 .env,添加环境配置 # 自定义项目名称 COMPOSE_PROJECT_NAMEragflow创建备份脚本配置文件 在 ragflow/docker 目录下创建文件 docker-compose-backup.yml version: 3services:backup:image: o…...

Axure设计数字乡村可视化大屏:从布局到交互的实战经验分享
乡村治理正从传统模式向“数据驱动”转型。数字乡村可视化大屏作为数据展示的核心载体,不仅能直观呈现乡村发展全貌,还能为决策提供科学依据。本文以Axure为工具,结合实际案例,分享如何从零设计一个功能完备、交互流畅的数字乡村大…...

算法第26天 | 贪心算法、455.分发饼干、376. 摆动序列、 53. 最大子序和
弹性算法理论基础 想清楚 局部最优 是什么,如果可以推导出全局最优,那就是正确的贪心算法 455. 分发饼干 题目 思路与解法 class Solution:def findContentChildren(self, g: List[int], s: List[int]) -> int:res 0i 0j 0g.sort()s.sort()whi…...

PDF处理控件Aspose.PDF教程:以编程方式将 PDF 导出为 JPG
在本节中,我们将探讨如何使用 Aspose.PDF 库将 PDF 文档转换为 JPG 图像。Aspose.PDF 是一个功能强大且用途广泛的库,专为需要以编程方式处理 PDF 文件的开发人员而设计。它提供了丰富的功能,可用于跨多个平台创建、编辑和转换 PDF 文档。其主…...
Vue3+ElementPlus 开箱即用后台管理系统,支持白天黑夜主题切换,通用管理组件,
Vue3ElementPlus后台管理系统,支持白天黑夜主题切换,专为教育管理场景设计。主要功能包括用户管理(管理员、教师、学生)、课件资源管理(课件列表、下载中心)和数据统计(使用情况、教学效率等&am…...

AI大模型应用之评测篇
在看到公司对于AI 工程师 的岗位要求 :“能够熟练使用各种自动化评测工具与方法,对AI 模型的输出进行有效评估” 时,其实比较疑惑,这个是对大模型能力例如像Deepseek ,GPT-4 ,千问,LLAMA这些模型的能力评测,…...

力扣小题, 力扣113.路径总和II力扣.111二叉树的最小深度 力扣.221最大正方形力扣5.最长回文子串更加优秀的算法:中心扩展算法
目录 力扣113.路径总和II 力扣.111二叉树的最小深度 力扣.221最大正方形 力扣5.最长回文子串 更加优秀的算法:中心扩展算法 力扣113.路径总和II 这道题,让我明白回溯了到底啥意思 之前我找的时候,我一直在想,如果可以,请你对比…...

el-form elform 对齐方式调整
如下页面表单,展示后就很丑。 页面表单,有时候我们想着最左侧的应该合理整齐的左对齐,右侧的表单都是右对齐,这样页面看起来会整洁很多。 <el-form class"w-100 a_form" style"padding: 0 15px 0px 15px"…...

JESD204 ip核使用与例程分析(二)
JESD204 ip核使用与例程分析(二) JESD204时钟方案专用差分时钟对例程分析jesd204_0_transport_layer_demapperjesd204_0_sig_chkjesd204_0_clockingjesd204_0 ip核port寄存器AXI-LITE寄存器配置jesd204_phy ip核JESD204时钟方案 图3-1所示为最通用、灵活的时钟解决方案。在图…...
Linux shell 正则表达式高效使用
Linux正则表达式高效使用教程 正则表达式是Linux命令行中强大的文本处理工具,能够极大提高搜索和匹配效率。下面为新手提供一个简单教程,介绍如何在grep和find命令中使用正则表达式。 使用建议:使用grep时要加-E选项使其支持扩展正则表达式&…...

50天50个小项目 (Vue3 + Tailwindcss V4) ✨ | Blurry Loading (毛玻璃加载)
📅 我们继续 50 个小项目挑战!—— Blurry Loading 组件 仓库地址:https://github.com/SunACong/50-vue-projects 项目预览地址:https://50-vue-projects.vercel.app/ ✨ 组件目标 实现一个加载进度条,随着加载进度的…...
C#中的ThreadStart委托
ThreadStart 委托: ThreadStart 是 .NET 中的一个内置委托类型,表示无参数且无返回值的方法。其定义如下: public delegate void ThreadStart(); 通常用于定义线程的入口方法。 List<ThreadStart>: 这是一个泛型集合&…...
GPU加速Kubernetes集群助力音视频转码与AI工作负载扩展
容器编排与GPU计算的结合,为追求性能优化的企业开辟了战略转型的新路径 基于GPU的托管Kubernetes集群不仅是技术选择,更是彻底改变企业处理高负载任务的战略部署方式。 随着人工智能和机器学习项目激增、实时数据处理需求的剧增,以及高性能媒…...
LeetCode[222]完全二叉树的节点个数
思路: 这个节点个数可以使用递归左儿子个数递归右儿子个数1,这个1是根节点,最后结果为节点个数,但我们没有练习到完全二叉树的性质. 完全二叉树的性质是:我简单说一下,大概就是其他节点都满了,就…...
DPDK 技术详解:榨干网络性能的“瑞士军刀”
你是否曾感觉,即使拥有顶级的服务器和万兆网卡,你的网络应用也总是“喂不饱”硬件,性能总差那么一口气?传统的网络处理方式,就像在高速公路上设置了太多的收费站和检查点,限制了数据包的“奔跑”速度。 今…...
anaconda的c++环境与ros2需要的系统变量c++环境冲突
在conda虚拟环境中运行有ros2的代码报错 ImportError: /home/user/anaconda3/envs/myenv/bin/../lib/libstdc.so.6: version GLIBCXX_3.4.30 not found(required by /opt/ros/humble/local/lib/python3.10/dist-packages/rclpy/_rclpy_pybind11.cpython-310-x86_64-linux-gnu.…...
Docker 疑难杂症解决指南大纲
一、Docker 基础问题排查 Docker 服务无法启动 错误提示:Cannot connect to the Docker daemon 可能原因:Docker 服务未运行、权限问题、端口冲突。 解决方案: 检查服务状态:systemctl status docker 重启服务:systemctl restart docker 用户权限:将用户加入 docker 组。…...
深入解析Spring Boot与Kafka集成:构建高效消息驱动微服务
深入解析Spring Boot与Kafka集成:构建高效消息驱动微服务 引言 在现代微服务架构中,消息队列是实现服务解耦和异步通信的重要组件。Apache Kafka作为分布式流处理平台,因其高吞吐量、低延迟和可扩展性,成为企业级应用的首选。本…...
Python 实现web请求与响应
目录 一、什么是web 请求与响应? 1、Web 请求 2、web 响应 3、HTTP协议概述 4、常见的HTTP状态码包括 二、Python 的requests库 1、安装requests库 2、发送GET请求 3、发送POST请求 4、处理响应头和状态码 5、发送带查询参数的GET请求 6、发送带表单数据…...

演示:【WPF-WinCC3D】 3D工业组态监控平台源代码
一、目的:分享一个应用WPF 3D开发的3D工业组态监控平台源代码 二、功能介绍 WPF-WinCC3D是基于 WPF 3D研发的工业组态软件,提供将近200个预置工业模型(机械手臂、科幻零部件、熔炼生产线、机加生产线、管道等),支持组态…...

【PostgreSQL数据分析实战:从数据清洗到可视化全流程】1.4 数据库与表的基本操作(DDL/DML语句)
👉 点击关注不迷路 👉 点击关注不迷路 👉 点击关注不迷路 文章大纲 1.4 数据库与表的基本操作(DDL/DML语句)1.4.1 数据库生命周期管理(DDL核心)1.4.1.1 创建数据库(CREATE DATABASE&…...
CUDA加速的线性代数求解器库cuSOLVER
cuSOLVER是NVIDIA提供的GPU加速线性代数库,专注于稠密和稀疏矩阵的高级线性代数运算。它建立在cuBLAS和cuSPARSE之上,提供了更高级的线性代数功能。 cuSOLVER主要功能 1. 稠密矩阵运算 矩阵分解: LU分解 (gesvd) QR分解 (geqrf) Cholesky分解 (potrf…...