当前位置: 首页 > news >正文

Flannel后端为UDP模式下,分析数据包的发送方式(二)

发往 10.244.2.5 的数据包最终会经过物理网卡 enp0s3,尽管路由表直接指定通过 flannel.1 发出。以下以 Markdown 格式详细解释为什么会经过 enp0s3,结合 Kubernetes 和 Flannel UDP 模式的背景。


问题分析

在 Kubernetes 环境中,使用 Flannel 的 UDP 模式,数据包的目标 IP 10.244.2.5 根据路由表匹配到以下路由:

Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
10.244.2.0      10.244.2.0      255.255.255.0   UG    0      0        0 flannel.1

这表明数据包通过 flannel.1 网卡发出,网关为 10.244.2.0。但问题是,数据包是否最终会经过物理网卡 enp0s3?答案是肯定的,我们从 Flannel UDP 模式的工作机制来详细分析。


Flannel UDP 模式的数据包转发过程

在 Flannel 的 UDP 模式下,flannel.1 是一个 TUN 设备,工作在用户态,负责将数据包交给 Flannel 的用户态进程(flanneld)进行封装。以下是数据包从发出到最终传输的步骤:

  1. 路由匹配

    • 目标 IP 10.244.2.5 匹配路由 10.244.2.0/24,指定通过 flannel.1 接口,网关为 10.244.2.0
    • 数据包被发送到 flannel.1,这是一个虚拟 TUN 设备,数据包会从内核态传递到用户态的 flanneld 进程。
  2. Flanneld 的 UDP 封装

    • flanneld 进程接收到数据包后,查询 etcd 或 Kubernetes API 中的子网映射,确定 10.244.2.0/24 对应的目标节点。例如,目标节点的物理 IP 可能是 192.168.1.x(假设在 192.168.1.0/24 网络中)。
    • flanneld 将原始数据包(目标 IP 10.244.2.5)封装为 UDP 数据包,默认使用端口 8472。
    • 封装后的 UDP 数据包的目标 IP 是目标节点的物理 IP(例如 192.168.1.x),源 IP 是当前节点的物理 IP(例如 192.168.1.y)。
  3. 通过物理网卡发送

    • 封装后的 UDP 数据包需要通过节点的物理网络接口发送到目标节点。
    • 根据路由表,物理 IP 192.168.1.x 属于 192.168.1.0/24,匹配以下路由:
      Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
      192.168.1.0     0.0.0.0         255.255.255.0   U     100    0        0 enp0s3
      
    • 因此,UDP 数据包通过 enp0s3 网卡发送到目标节点的物理 IP。
  4. 目标节点处理

    • 目标节点上的 flanneld 进程监听 UDP 端口 8472,接收到 UDP 数据包。
    • flanneld 解封装数据包,提取原始数据包(目标 IP 10.244.2.5)。
    • 数据包通过目标节点的 cni0 接口转发到本地 Pod 子网(10.244.2.0/24),最终到达目标 Pod。

为什么会经过 enp0s3?

  • flannel.1 的角色flannel.1 是 TUN 设备,负责将数据包从内核态传递到用户态的 flanneld 进程。它不直接与物理网络交互,而是依赖 flanneld 进行 UDP 封装。
  • UDP 封装后的传输:封装后的 UDP 数据包需要通过物理网络发送到目标节点。当前节点的物理网络接口是 enp0s3,它负责处理 192.168.1.0/24 网络的通信(包括目标节点的物理 IP)。
  • 路由表的作用:路由表中的 192.168.1.0/24 条目明确指定通过 enp0s3 发送物理网络的流量。因此,flanneld 生成的 UDP 数据包会通过 enp0s3 发出。

数据包路径总结

  1. 数据包(目标 IP 10.244.2.5)根据路由表通过 flannel.1 发出。
  2. flannel.1 将数据包交给 flanneldflanneld 封装为 UDP 数据包(目标 IP 为目标节点的物理 IP,例如 192.168.1.x)。
  3. UDP 数据包根据路由表(192.168.1.0/24)通过 enp0s3 发出。
  4. 目标节点接收 UDP 数据包,解封装后转发到目标 Pod。

最终答案

是的,发往 10.244.2.5 的数据包最终会经过物理网卡 enp0s3,因为 Flannel UDP 模式将数据包封装为 UDP 格式后,通过物理网络接口 enp0s3 发送到目标节点。

 - UDP 模式下,数据包在 `enp0s3` 上是 UDP 封装的,源和目标 IP 分别是发送和接收节点的物理 IP,端口为 8472。
  • 验证方法
    • 使用更广的过滤条件抓包,例如:
      tcpdump -i enp0s3 udp port 8472
      
      这会抓取 Flannel UDP 模式的所有流量(默认端口 8472)。
    • 检查是否有 UDP 数据包,源和目标 IP 是否为节点间的物理 IP(例如 192.168.1.y -> 192.168.1.x)。
    • 如果需要确认数据包内容,可以使用 -X 查看数据包的原始内容,检查是否包含内部的 Pod IP 10.244.2.5

http://www.xdnf.cn/news/562429.html

相关文章:

  • IDEA推送到gitlab,jenkins识别,然后自动发布到需要的主机(流水线)
  • STM32之串口通信蓝牙(BLE)
  • 量子计算与云计算的融合:技术前沿与应用前景
  • 什么是国密、密评、商密
  • Token类型与用途详解:数字身份的安全载体图谱
  • 量子计算模拟:从理论到实践
  • OpenCv高阶(十五)——EigenFace人脸识别
  • 【C语言】复习~数组和指针
  • JS手写代码篇---手写Promise
  • 【软件设计师】知识点简单整理
  • 数学建模,机器决策人建模
  • HTTPS和HTTP区别
  • 693SJBH基于.NET的题库管理系统
  • 用Recommenders,实现个性化推荐
  • 基于OpenCV的物体跟踪:CSRT算法
  • 自托管互联网广播电台Airstation
  • Docker网关冲突导致容器启动网络异常解决方案
  • Linux `cat` 命令深度解析与高阶应用指南
  • C++ - 仿 RabbitMQ 实现消息队列(3)(详解使用muduo库)
  • 物流项目第六期(短信微服务——对接阿里云第三方短信服务JAVA代码实现、策略模式 + 工厂模式的应用)
  • bitbar环境搭建(ruby 2.4 + rails 5.0.2)
  • 【寻找Linux的奥秘】第七章:虚拟地址空间
  • 第16天-使用Python Pillow库常见图像处理场景
  • javaweb-html
  • mapbox进阶,手写放大镜功能
  • C语言之预处理和宏
  • SAP-ABAP:ABAP异常处理与SAP现代技术融合—— 面向云原生、微服务与低代码场景的创新实践
  • 云原生攻防4(Kubernetes基础补充)
  • word通配符表
  • Linux上conda环境安装完全手札