在K8S中,flannel有几个工作模式及fannel的底层原理如何实现?

Flannel 是 Kubernetes 中常用的 CNI 插件,主要用于实现跨节点 Pod 之间的网络连通性。它通过为集群中的每个节点分配独立的 Pod 子网,并基于不同的“后端模式”实现子网间的数据包转发,核心目标是解决容器网络的“跨节点通信”问题。

一、Flannel 的主要工作模式(后端类型)

Flannel 支持多种数据转发模式(后端),不同模式的核心区别在于“跨节点 Pod 通信时数据包的处理方式”,常用的有以下 3 种:

1. vxlan 模式(默认模式)

这是 Flannel 最常用的模式,通过 VXLAN(虚拟扩展局域网) 协议实现跨节点通信,无需依赖底层网络的特殊配置,兼容性最强。

  • 核心原理

    • 在每个节点上创建一个虚拟的 VXLAN 设备(默认名称为 flannel.1),作为 Pod 网络与主机网络之间的“网关”。
    • 当 Pod 发送跨节点数据包时,Flannel 会将 Pod 的 IP 包(源 Pod IP + 目标 Pod IP)封装到 主机的 UDP 包 中(外层为源节点 IP + 目标节点 IP),通过主机网络传输。
    • 目标节点收到 UDP 包后,由 flannel.1 设备解封装,还原出原始 Pod IP 包,再转发到目标 Pod。
  • 特点

    • 优势:不依赖底层网络(支持跨二层、三层网络),部署简单,适合大多数场景(如跨交换机、跨机房的集群)。
    • 劣势:因“封装/解封装”过程,会增加约 10-30% 的网络延迟,性能略低。

2. host-gw 模式(主机网关模式)

该模式通过 静态路由 实现跨节点通信,性能优于 vxlan,但对底层网络有严格限制。

  • 核心原理

    • Flannel 为每个节点分配子网后,会在每个节点的 路由表 中添加一条规则:“目标 Pod 子网 → 下一跳为对应节点的主机 IP”。
    • 例如:节点 A(IP:192.168.1.10)的 Pod 子网为 10.244.1.0/24,节点 B(IP:192.168.1.11)的子网为 10.244.2.0/24,则节点 A 的路由表会添加“10.244.2.0/24 → 192.168.1.11”。
    • 跨节点通信时,数据包直接通过底层网络(如物理交换机)转发到目标节点,无需封装,由目标节点的内核直接转发到对应 Pod。
  • 特点

    • 优势:性能接近原生网络(无封装开销),延迟低。
    • 劣势:要求集群所有节点必须在 同一二层网络(即节点之间可通过 MAC 地址直接通信,如同一交换机或同一 VLAN 内),否则路由无法生效。

3. udp 模式(已过时,不推荐)

这是 Flannel 早期的模式,通过用户态的 UDP 隧道实现通信,因性能极差(比 vxlan 慢 50% 以上),现在已基本被弃用,仅作为兼容旧版本的选项。

  • 原理:类似 vxlan,但封装逻辑在用户态(由 flanneld 进程处理)而非内核态,导致性能损耗极大。

二、Flannel 的底层核心原理(通用流程)

无论哪种工作模式,Flannel 的整体运行逻辑一致,主要包括以下步骤:

1. 网络初始化与子网分配

  • 集群部署时,管理员需为 Flannel 配置一个“全局 Pod 网络网段”(如 10.244.0.0/16),用于分配给各节点。
  • Flannel 通过 ETCD(或 Kubernetes API,新版本支持)存储集群网络元数据,包括:全局网段、每个节点的主机 IP、节点分配的 Pod 子网(如 10.244.1.0/24)等。
  • 每个节点上的 flanneld 进程(以 DaemonSet 形式运行)启动时,会向 ETCD 申请一个未被分配的子网(默认 /24 掩码),并将“节点 IP + 子网”的映射关系写入 ETCD。

2. 节点网络配置

flanneld 进程获取本节点的子网后,会完成以下配置(确保 Pod 能正常通信):

  • 配置 CNI 插件:生成 CNI 配置文件(如 /etc/cni/net.d/10-flannel.conflist),告知 kubelet 如何为新创建的 Pod 分配 IP(从本节点子网中选取)。
  • 创建虚拟网络设备
    • 对 vxlan 模式:创建 flannel.1 虚拟网卡,作为 VXLAN 隧道的端点。
    • 对 host-gw 模式:无需额外虚拟设备,直接操作主机路由表。
  • 设置转发规则
    • 根据 ETCD 中的节点-子网映射,在本机路由表中添加“目标子网 → 目标节点”的路由(vxlan 模式路由到 flannel.1 设备,host-gw 模式直接路由到目标节点 IP)。

3. 跨节点 Pod 通信流程

以 vxlan 模式为例,假设 Pod A(10.244.1.2,节点 A:192.168.1.10)要访问 Pod B(10.244.2.3,节点 B:192.168.1.11):

  1. Pod A 发送数据包(源 IP:10.244.1.2,目标 IP:10.244.2.3)。
  2. 数据包通过 Pod 内的虚拟网卡(如 eth0)发送到节点 A 的根网络命名空间。
  3. 节点 A 内核根据路由表,将数据包转发到 flannel.1 设备。
  4. flannel.1 设备通过 VXLAN 协议封装数据包:外层为 UDP 包(源 IP:192.168.1.10,目标 IP:192.168.1.11,端口 8472),内层为原始 Pod 数据包。
  5. 封装后的数据包通过节点 A 的物理网卡发送到节点 B。
  6. 节点 B 的物理网卡收到数据包后,转发到 flannel.1 设备解封装,还原出原始 Pod 数据包。
  7. 节点 B 内核根据路由表,将数据包转发到 Pod B 的 eth0 网卡。

总结

Flannel 的核心是通过“子网分配 + 跨节点转发”实现 Pod 通信,不同工作模式的差异在于转发方式:

  • vxlan:通过隧道封装,兼容性强但性能有损耗;
  • host-gw:通过静态路由,性能优但依赖二层网络;
  • udp:已过时,不推荐使用。

实际使用中,vxlan 模式因兼容性好成为默认选择,而 host-gw 适合对性能敏感且网络环境允许的场景。

posted @ 2025-08-08 09:43  天道酬勤zjh  阅读(44)  评论(0)    收藏  举报