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

Flannel 使用的是 UDP 模式 ,分析发往 10.244.2.5 的数据包会从哪个网卡发出。


路由表

以下是提供的路由表:

复制代码
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         192.168.1.1     0.0.0.0         UG    100    0        0 enp0s3
10.244.0.0      0.0.0.0         255.255.255.0   U     0      0        0 cni0
10.244.0.0      0.0.0.0         255.255.0.0     U     0      0        0 flannel0
10.244.1.0      10.244.1.0      255.255.255.0   UG    0      0        0 flannel.1
10.244.2.0      10.244.2.0      255.255.255.0   UG    0      0        0 flannel.1
192.168.1.0     0.0.0.0         255.255.255.0   U     100    0        0 enp0s3
192.168.1.1     0.0.0.0         255.255.255.255 UH    100    0        0 enp0s3

目标是判断发往 10.244.2.5 的数据包会从哪个网卡发出,并结合 Flannel 的 UDP 模式详细讲解路由匹配规则和数据包转发过程。


Kubernetes 和 Flannel UDP 模式背景

在 Kubernetes 环境中,Flannel 是一个常用的 CNI(Container Network Interface)插件,负责为 Pod 分配 IP 地址并处理节点间通信。Flannel 支持多种后端模式,包括 VXLAN、UDP 和 host-gw。在本例中,明确使用 UDP 模式,以下是关键背景信息:

  1. Pod 网络

    • 每个 Kubernetes 节点被分配一个子网,用于其上的 Pod。例如:
      • 10.244.0.0/24:当前节点的 Pod 子网。
      • 10.244.1.0/2410.244.2.0/24:其他节点的 Pod 子网。
    • 目标 IP 10.244.2.5 属于 10.244.2.0/24 子网,表示它是一个运行在另一个节点上的 Pod。
  2. 网络接口

    • cni0 :一个桥接接口,连接当前节点的 Pod 和主机网络。本地 Pod(10.244.0.0/24)的数据包通过 cni0 进入主机网络。
    • flannel.1 :Flannel 创建的虚拟接口,用于节点间通信。在 UDP 模式下,flannel.1 是一个 TUN 设备,负责封装和解封装数据包。
    • flannel0:可能是一个旧的或次要接口(视 Flannel 配置而定),在本例中可能不直接用于 UDP 模式的通信。
    • enp0s3:节点的物理网络接口,用于节点间实际的物理网络通信。
  3. Flannel UDP 模式

    • 在 UDP 模式下,Flannel 使用用户态的 UDP 封装(而不是内核态的 VXLAN)来传输数据包。
    • 数据包通过 flannel.1(TUN 设备)发出,被 Flannel 的用户态进程(flanneld)封装为 UDP 数据包,然后通过节点的物理接口(如 enp0s3)发送到目标节点。
    • Flannel 通过 etcd 或 Kubernetes API 维护子网到节点 IP 的映射。例如,10.244.2.0/24 映射到某个节点的物理 IP(如 192.168.x.x)。
  4. 路由表的作用

    • Flannel 配置路由表,确保 Pod 的流量可以路由到正确的接口(本地 Pod 通过 cni0,跨节点 Pod 通过 flannel.1)。
    • 网关地址(如 10.244.2.0)在 UDP 模式下是子网的网络地址,Flannel 的用户态进程会根据子网映射将其转换为目标节点的物理 IP。

路由匹配规则(结合 Kubernetes 和 UDP 模式)

Linux 内核根据以下规则选择路由:

  1. 最长前缀匹配(Longest Prefix Match)

    • 系统将目标 IP 地址与路由表中的 DestinationGenmask 比较,选择子网掩码最长的匹配项。
    • 例如,255.255.255.0/24)比 255.255.0.0/16)更具体,优先级更高。
  2. 网关(Gateway)

    • 如果 Gateway0.0.0.0,表示目标网络直接连接到指定接口(Iface),数据包直接通过该接口发送。
    • 如果 Gateway 是一个 IP 地址(如 10.244.2.0),数据包通过指定接口发送到网关。在 Flannel UDP 模式下,网关地址通常是子网的网络地址,由 flanneld 进程处理。
  3. 标志(Flags)

    • U:路由有效(Up)。
    • G:需要通过网关转发。
    • H:目标是一个主机(而非网络)。
  4. 度量值(Metric)

    • 如果多条路由匹配,系统选择 Metric 值最低的路由。
  5. 接口(Iface)

    • 指定数据包通过哪个网络接口发出。在 UDP 模式下,flannel.1 是 TUN 设备,负责将数据包交给 Flannel 的用户态进程。

匹配过程(针对 10.244.2.5)

我们逐条检查路由表,找出与目标 IP 10.244.2.5 匹配的路由:

  1. 0.0.0.0/0.0.0.0(默认路由)

    • 目标网络:0.0.0.0,子网掩码:0.0.0.0(匹配所有地址)。
    • 网关:192.168.1.1,接口:enp0s3,标志:UG
    • 这是一个默认路由,用于外部网络(如互联网)。10.244.2.5 是 Kubernetes 内部 Pod 地址,不会使用此路由。
  2. 10.244.0.0/255.255.255.0

    • 目标网络:10.244.0.0,子网掩码:255.255.255.0(匹配 10.244.0.0-10.244.0.255)。
    • 网关:0.0.0.0,接口:cni0,标志:U
    • 检查:10.244.2.5 不属于 10.244.0.0/24,因此不匹配。
    • 说明:cni0 用于本地 Pod 子网(10.244.0.0/24),即当前节点的 Pod。
  3. 10.244.0.0/255.255.0.0

    • 目标网络:10.244.0.0,子网掩码:255.255.0.0(匹配 10.244.0.0-10.244.255.255)。
    • 网关:0.0.0.0,接口:flannel0,标志:U
    • 检查:10.244.2.5 属于 10.244.0.0/16,因此匹配。
    • 说明:这是一个广义路由,可能用于 Flannel 的默认配置,但在更具体路由存在时会被忽略。flannel0 在 UDP 模式下可能不直接使用。
  4. 10.244.1.0/255.255.255.0

    • 目标网络:10.244.1.0,子网掩码:255.255.255.0(匹配 10.244.1.0-10.244.1.255)。
    • 网关:10.244.1.0,接口:flannel.1,标志:UG
    • 检查:10.244.2.5 不属于 10.244.1.0/24,因此不匹配。
  5. 10.244.2.0/255.255.255.0

    • 目标网络:10.244.2.0,子网掩码:255.255.255.0(匹配 10.244.2.0-10.244.2.255)。
    • 网关:10.244.2.0,接口:flannel.1,标志:UG
    • 检查:10.244.2.5 属于 10.244.2.0/24,因此匹配。
    • 说明:这是 Flannel 配置的跨节点路由,10.244.2.0/24 是另一个节点的 Pod 子网。
  6. 192.168.1.0/255.255.255.0

    • 目标网络:192.168.1.0,子网掩码:255.255.255.0
    • 网关:0.0.0.0,接口:enp0s3,标志:U
    • 检查:10.244.2.5 不属于 192.168.1.0/24,因此不匹配。
  7. 192.168.1.1/255.255.255.255

    • 目标网络:192.168.1.1,子网掩码:255.255.255.255(仅匹配主机 192.168.1.1)。
    • 网关:0.0.0.0,接口:enp0s3,标志:UH
    • 检查:10.244.2.5 不匹配,因此不适用。

选择最优路由

匹配的路由有:

  • 10.244.0.0/255.255.0.0/16,接口:flannel0
  • 10.244.2.0/255.255.255.0/24,接口:flannel.1

根据 最长前缀匹配 规则:

  • /24255.255.255.0)比 /16255.255.0.0)更具体,因此优先选择 10.244.2.0/255.255.255.0

该路由的细节:

  • 目标网络:10.244.2.0
  • 子网掩码:255.255.255.0
  • 网关:10.244.2.0
  • 接口:flannel.1
  • 标志:UG(需要通过网关转发)

因此,数据包将通过 flannel.1 网卡发出,网关为 10.244.2.0


Flannel UDP 模式下的数据包转发

在 Flannel 的 UDP 模式下,数据包的转发过程如下:

  1. 路由决定

    • 数据包的目标 IP 10.244.2.5 匹配路由 10.244.2.0/24,通过 flannel.1 接口发出。
    • 网关地址 10.244.2.0 是目标子网的网络地址。在 UDP 模式下,flannel.1 是一个 TUN 设备,数据包会被送入用户态的 flanneld 进程。
  2. UDP 封装

    • flanneld 进程接收到数据包后,查询 etcd 或 Kubernetes API 中的子网映射,确定 10.244.2.0/24 对应的目标节点(例如,物理 IP 为 192.168.1.x)。
    • 数据包被封装为 UDP 数据包,默认使用端口 8472(Flannel UDP 模式的默认端口)。
    • 封装后的 UDP 数据包通过节点的物理接口(如 enp0s3)发送到目标节点的物理 IP。
  3. 目标节点处理

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

    • 路由表中的网关 10.244.2.0 是一个网络地址,不是实际的主机 IP。在 UDP 模式下,flanneld 负责将 10.244.2.0/24 映射到目标节点的物理 IP。
    • 这种设计允许 Flannel 动态管理节点间的通信,而无需在路由表中直接指定目标节点的物理 IP。

为什么选择 flannel.1?

  • cni0 :用于本地 Pod 子网 10.244.0.0/2410.244.2.5 不在此子网,因此不会通过 cni0
  • flannel0 :匹配 10.244.0.0/16,但子网掩码较短(/16),优先级低于 10.244.2.0/24/24)。此外,在 UDP 模式下,flannel.1 是主要的 TUN 设备,flannel0 可能是一个旧接口或次要配置。
  • enp0s3 :用于物理网络通信(如外部网络或默认路由)。Pod 间通信由 Flannel 处理,不会直接使用 enp0s3

因此,flannel.1 是正确的接口,专门用于跨节点 Pod 通信。


最终答案

发往 10.244.2.5 的数据包将通过 flannel.1 网卡发出。


总结路由匹配和 Flannel UDP 转发过程

  1. 路由匹配

    • 目标 IP 10.244.2.5 匹配 10.244.2.0/24/24/16 更具体)。
    • 路由指定通过 flannel.1 接口,网关为 10.244.2.0
  2. Flannel UDP 处理

    • 数据包通过 flannel.1(TUN 设备)进入用户态的 flanneld 进程。
    • flanneld 根据子网映射将数据包封装为 UDP 数据包,通过物理接口(如 enp0s3)发送到目标节点。
    • 目标节点解封装数据包并转发到目标 Pod(10.244.2.5)。
  3. Kubernetes 和 UDP 模式特性

    • UDP 模式通过用户态进程(flanneld)处理数据包封装,性能比 VXLAN 稍低,但适用于不支持 VXLAN 的环境。
    • flannel.1 作为 TUN 设备,负责将数据包交给 flanneld 进行 UDP 封装。
相关推荐
belldeep15 分钟前
WSL 安装 Debian 12 后,如何安装图形界面 X11 ?
linux·debian·tk·x11·startx
wuzhenwei041915 分钟前
centos系统redis-dump安装
linux·redis·centos
平生不喜凡桃李1 小时前
Linux 文件(3)
linux·运维·服务器
TDengine (老段)1 小时前
TDengine 运维—容量规划
大数据·运维·数据库·时序数据库·tdengine·涛思数据·iotdb
todoitbo1 小时前
开源一个记账软件,支持docker一键部署
运维·docker·容器·开源·springboot·记账软件·容器部署
安顾里2 小时前
什么是endpoints?
运维·容器·kubernetes
子非衣2 小时前
Ubuntu部署私有Gitlab
linux·ubuntu·gitlab
风屿.2 小时前
IDEA推送到gitlab,jenkins识别,然后自动发布到需要的主机
运维·gitlab·jenkins
云祺vinchin2 小时前
云祺容灾备份系统公有云备份与恢复实操-华为云
运维·服务器
XMYX-02 小时前
SkyWalking 报错:sw_profile_task 索引缺失问题分析与解决
运维·jenkins·skywalking