在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。
- 在每个节点上创建一个虚拟的 VXLAN 设备(默认名称为
-
特点:
- 优势:不依赖底层网络(支持跨二层、三层网络),部署简单,适合大多数场景(如跨交换机、跨机房的集群)。
- 劣势:因“封装/解封装”过程,会增加约 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 模式:无需额外虚拟设备,直接操作主机路由表。
- 对 vxlan 模式:创建
- 设置转发规则:
- 根据 ETCD 中的节点-子网映射,在本机路由表中添加“目标子网 → 目标节点”的路由(vxlan 模式路由到
flannel.1
设备,host-gw 模式直接路由到目标节点 IP)。
- 根据 ETCD 中的节点-子网映射,在本机路由表中添加“目标子网 → 目标节点”的路由(vxlan 模式路由到
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):
- Pod A 发送数据包(源 IP:10.244.1.2,目标 IP:10.244.2.3)。
- 数据包通过 Pod 内的虚拟网卡(如
eth0
)发送到节点 A 的根网络命名空间。 - 节点 A 内核根据路由表,将数据包转发到
flannel.1
设备。 flannel.1
设备通过 VXLAN 协议封装数据包:外层为 UDP 包(源 IP:192.168.1.10,目标 IP:192.168.1.11,端口 8472),内层为原始 Pod 数据包。- 封装后的数据包通过节点 A 的物理网卡发送到节点 B。
- 节点 B 的物理网卡收到数据包后,转发到
flannel.1
设备解封装,还原出原始 Pod 数据包。 - 节点 B 内核根据路由表,将数据包转发到 Pod B 的
eth0
网卡。
总结
Flannel 的核心是通过“子网分配 + 跨节点转发”实现 Pod 通信,不同工作模式的差异在于转发方式:
- vxlan:通过隧道封装,兼容性强但性能有损耗;
- host-gw:通过静态路由,性能优但依赖二层网络;
- udp:已过时,不推荐使用。
实际使用中,vxlan 模式因兼容性好成为默认选择,而 host-gw 适合对性能敏感且网络环境允许的场景。