Kubernetes 网络插件 Flannel 与 Calico 三种工作模式详解
前言
一、Flannel 网络插件概述
二、Flannel 的三种工作模式
1️⃣ VXLAN 模式(默认模式)
🧩 原理
📈 通信流程示意
💡 特点
✅ 适用场景
2️⃣ host-gw 模式(直连路由,高性能)
🧩 原理
📈 通信流程示意
💡 特点
✅ 适用场景
3️⃣ UDP 模式(早期方案)
🧩 原理
💡 特点
✅ 适用场景
🔖 Flannel 模式总结
三、Calico 网络插件概述
四、Calico 的三种工作模式
1️⃣ BGP 模式(无封装直连)
🧩 原理
📈 通信流程示意
💡 特点
✅ 适用场景
2️⃣ IPIP 模式(三层 Overlay)
🧩 原理
📈 通信流程示意
💡 特点
✅ 适用场景
3️⃣ VXLAN 模式(现代 Overlay 模式)
🧩 原理
📈 通信流程示意
💡 特点
✅ 适用场景
🔖 Calico 模式总结
五、Flannel vs Calico 工作模式对比
六、推荐选型与应用场景
七、总结:一句话记住它们
八、Calico BGP 模式与跨网段通信总结
Calico BGP 模式的核心机制
关于 “BGP 只能同网段” 的误区
Calico 默认只自动发现同网段邻居的原因
跨网段时如何建立 BGP 邻居关系
✅ 条件
✅ 示例
跨网段集群的推荐架构:Route Reflector 模式(RR)
Flannel 与 Calico VXLAN 的对比
核心结论总结
🧠 写在最后
前言
在 Kubernetes 集群中,网络插件(CNI) 是每个节点之间能否互通的关键。 其中,Flannel 和 Calico 是最常用的两种网络方案。 它们都能让不同节点上的 Pod 实现通信,但工作原理和模式差异巨大。
本文将系统讲解:
-
Flannel 的三种工作模式
-
Calico 的三种工作模式
-
两者在设计、性能和适用场景上的区别
一、Flannel 网络插件概述
Flannel 是 CoreOS 开发的最早一批 Kubernetes 网络插件之一。 设计目标非常简单:
让不同节点上的 Pod 能够“互通”。
Flannel 不关注安全策略和复杂路由,只做一件事 —— 连通性。 它通过在宿主机上创建虚拟网络接口(如 flannel.1
),为每个节点分配一个独立的 Pod 子网。
Flannel 支持多种后端(Backend)模式,其中最常用的三种是:
-
VXLAN 模式(默认)
-
host-gw 模式
-
UDP 模式
二、Flannel 的三种工作模式
1️⃣ VXLAN 模式(默认模式)
🧩 原理
-
每个节点分配一个子网段(例如 10.244.1.0/24)
-
Flannel 在节点上创建虚拟接口
flannel.1
-
Pod 之间通信时,数据包通过
flannel.1
封装为 VXLAN(UDP 8472)传输 -
对端节点收到后解封装并交给目标 Pod
📈 通信流程示意
Pod -> cni0 -> flannel.1 -> eth0 -> 网络传输 -> flannel.1 -> cni0 -> Pod
💡 特点
优点 | 缺点 |
---|---|
支持跨子网通信 | 存在 VXLAN 封装开销 |
配置简单,兼容性强 | 节点多时广播效率下降 |
默认模式,开箱即用 | 不支持 NetworkPolicy |
✅ 适用场景
适用于小中型集群、测试环境或网络结构较简单的场景。
2️⃣ host-gw 模式(直连路由,高性能)
🧩 原理
-
每个节点分配固定子网
-
Flannel 不做封装,而是在宿主机的路由表中添加静态路由
-
数据包通过物理网络直接转发,无需隧道
📈 通信流程示意
Pod -> cni0 -> eth0 -> 物理网络 -> 目标节点 -> cni0 -> Pod
💡 特点
优点 | 缺点 |
---|---|
性能最高(无封装) | 仅适用于同一二层网络 |
延迟低、CPU 占用少 | 不支持跨子网通信 |
✅ 适用场景
适用于所有节点在同一 VLAN/子网的集群,追求性能优先。
3️⃣ UDP 模式(早期方案)
🧩 原理
-
最早版本的 Flannel 模式
-
在用户态使用 UDP 套接字转发封装数据包
-
因性能低下,已基本弃用
💡 特点
优点 | 缺点 |
---|---|
实现简单 | 性能差,延迟高 |
兼容性好 | 不推荐生产使用 |
✅ 适用场景
仅供了解,不建议在任何现代集群中使用。
🔖 Flannel 模式总结
模式 | 封装方式 | 是否跨子网 | 性能 | 适用场景 |
---|---|---|---|---|
VXLAN | 内核 VXLAN (UDP 8472) | ✅ | 中等 | 默认,通用 |
host-gw | 直连路由 | ❌ | 高 | 同网段 |
UDP | 用户态封装 | ✅ | 低 | 测试用 |
三、Calico 网络插件概述
Calico 是一个更强大的容器网络与安全方案。 除了基础通信,它还提供:
-
路由控制(BGP)
-
安全策略(NetworkPolicy)
-
NAT / eBPF / WireGuard 加密支持
-
高性能三层网络模型
Calico 有三种核心工作模式:
-
BGP 模式(无封装)
-
IPIP 模式(三层隧道)
-
VXLAN 模式(三层 Overlay)
四、Calico 的三种工作模式
1️⃣ BGP 模式(无封装直连)
🧩 原理
-
每个节点运行 BGP 守护进程(
bird
) -
节点之间通过 BGP 协议同步路由信息
-
Pod 流量直接通过宿主机路由表转发,无需隧道封装
📈 通信流程示意
Pod -> caliXXX -> eth0 -> 物理网络直连 -> 目标节点 -> caliXXX -> Pod
💡 特点
优点 | 缺点 |
---|---|
无隧道封装,性能最佳 | 节点需三层互通 |
动态路由,智能更新 | 网络必须支持 BGP |
延迟最低 | 配置相对复杂 |
✅ 适用场景
节点在同一 VPC 或同一三层网络中,追求极致性能的场景。
2️⃣ IPIP 模式(三层 Overlay)
🧩 原理
-
将 Pod 的数据包使用 IP-in-IP 封装
-
内层是 Pod IP,外层是宿主机 IP
-
远端节点解封装后再转发给 Pod
📈 通信流程示意
Pod -> caliXXX -> tunl0 -> eth0 -> 网络 -> tunl0 -> caliXXX -> Pod
💡 特点
优点 | 缺点 |
---|---|
可跨子网通信 | 封装带来一定性能损耗 |
兼容性好 | 数据包抓取困难 |
早期默认模式 | 不支持所有云网络环境 |
✅ 适用场景
节点跨不同子网或 VPC 时使用,兼容性较好。
3️⃣ VXLAN 模式(现代 Overlay 模式)
🧩 原理
-
与 Flannel VXLAN 类似,但控制方式完全不同
-
由 Calico Felix 进程维护 VXLAN FDB 表
-
节点间通过单播方式建立点对点隧道(非广播)
-
支持安全策略、加密、BGP 互通等高级特性
📈 通信流程示意
Pod -> caliXXX -> vxlan.calico -> eth0 -> 网络 -> vxlan.calico -> caliXXX -> Pod
💡 特点
优点 | 缺点 |
---|---|
支持跨子网通信 | 存在一定封装开销 |
支持 NetworkPolicy、加密 | 比 BGP 模式略复杂 |
控制平面智能化 | 适配广泛,云原生友好 |
✅ 适用场景
云环境、多子网、混合云等生产场景,是当前主流选择。
🔖 Calico 模式总结
模式 | 是否封装 | 是否跨子网 | 性能 | 特点 |
---|---|---|---|---|
BGP | ❌ | ❌ | ⭐⭐⭐⭐⭐ | 性能最高 |
IPIP | ✅ | ✅ | ⭐⭐⭐ | 兼容性好 |
VXLAN | ✅ | ✅ | ⭐⭐⭐⭐ | 通用性强,支持策略 |
五、Flannel vs Calico 工作模式对比
对比项 | Flannel | Calico |
---|---|---|
定位 | 提供基础连通性 | 提供连通 + 策略 + 路由 |
默认模式 | VXLAN | VXLAN(新版)或 IPIP(旧版) |
网络策略 | ❌ 不支持 | ✅ 支持 |
封装控制 | etcd 静态表 | Felix 动态控制 |
性能最高模式 | host-gw | BGP |
是否可跨子网 | VXLAN 可 | IPIP/VXLAN 可 |
可扩展性 | 一般 | 极高(支持云环境) |
六、推荐选型与应用场景
场景 | 推荐模式 | 说明 |
---|---|---|
学习、测试集群 | Flannel VXLAN | 简单易用、部署快 |
节点同网段 | Flannel host-gw / Calico BGP | 性能最优 |
异网、多子网 | Calico VXLAN | 稳定、灵活 |
生产环境 | Calico VXLAN / BGP | 安全、可控、可扩展 |
七、总结:一句话记住它们
插件 | 模式 | 通俗理解 |
---|---|---|
Flannel VXLAN | 虚拟交换机,广播式隧道 | 每个节点都像接入同一个二层交换机,包被 VXLAN 封装后通过隧道传输,简单好用但性能一般。 |
Flannel host-gw | 直连路由,高性能 | 节点间无封装,直接用路由表转发,只适合同网段、高速内网场景。 |
Flannel UDP | 过时的用户态隧道 | 早期方案,数据包进出用户态封装,性能低下,几乎已淘汰。 |
Calico BGP | 无封装,纯三层路由 | 每个节点像小型路由器,通过 BGP 广播 Pod 网段,无需隧道,延迟最低。 |
Calico IPIP | IP 封装,跨网段可通 | 外层再套一层 IP,适合节点跨网段的场景,配置简单兼容性强。 |
Calico VXLAN | 智能点对点隧道 + 安全策略 | 自动建立 VXLAN 隧道,可跨网段通信,并支持 NetworkPolicy 安全隔离。 |
八、Calico BGP 模式与跨网段通信总结
Calico BGP 模式的核心机制
-
通信原理: 每个节点运行一个 BGP 客户端(默认使用 Bird),将本节点的 Pod 网段(如 192.168.1.0/24)通过 BGP 广播给其他节点。 其他节点学习到这些路由后,可以直接通过三层网络访问对应的 Pod。
-
关键特征: ✅ 无隧道封装(无 VXLAN / IPIP) ✅ 纯三层通信,性能最高 ✅ 依赖底层网络三层可达性(L3 reachability)
关于 “BGP 只能同网段” 的误区
-
❌ 误区:Calico 的 BGP 模式必须同网段。
-
✅ 事实:BGP 是三层协议,不要求同网段,只要求 IP 层能互通。
也就是说:
只要两台节点之间三层可达(可以互 ping 通、TCP 179 端口未被防火墙阻挡), 就可以建立 BGP 邻居关系,无论是否在同一网段。
Calico 默认只自动发现同网段邻居的原因
Calico 默认使用 Node-to-Node Mesh 模式,自动与同子网节点建立 BGP 邻居。 原因:
-
避免大规模集群时 BGP 会话过多;
-
避免自动与跨子网节点建邻造成混乱;
-
简化默认配置。
但这并不代表它不能跨网段,只是默认不自动建立。
跨网段时如何建立 BGP 邻居关系
✅ 条件
-
节点间三层可达(能互通 TCP 179 端口);
-
手动配置
BGPPeer
对象,指定邻居节点的 IP 和 AS 号。
✅ 示例
NodeA: 10.0.1.3
NodeB: 10.0.2.5
在 NodeA 创建邻居:
calicoctl create -f - <<EOF apiVersion: projectcalico.org/v3 kind: BGPPeer metadata:name: peer-to-nodeB spec:peerIP: 10.0.2.5asNumber: 64512 EOF
在 NodeB 创建邻居:
calicoctl create -f - <<EOF apiVersion: projectcalico.org/v3 kind: BGPPeer metadata:name: peer-to-nodeA spec:peerIP: 10.0.1.3asNumber: 64512 EOF
建立成功后,两节点会互通 Pod 路由,实现跨网段 Pod 互访。
跨网段集群的推荐架构:Route Reflector 模式(RR)
在多子网或大规模集群中,不建议所有节点互为邻居,而是:
-
选取 1~2 台节点作为 Route Reflector(RR);
-
各子网节点只与 RR 建邻;
-
RR 之间再互通路由;
-
减少 BGP 会话数量,提高稳定性。
Flannel 与 Calico VXLAN 的对比
对比项 | Flannel VXLAN | Calico VXLAN | Calico BGP |
---|---|---|---|
通信层 | 二层封装 | 二层封装 + 网络策略 | 三层直连 |
封装方式 | UDP VXLAN | UDP VXLAN | 无封装 |
性能 | 中等 | 中等偏高 | ⭐最高 |
是否支持跨网段 | 否 | 是(Overlay) | ✅ 是(需路由可达 + 手动建邻) |
核心结论总结
-
🧠 BGP 是三层路由协议,不限制网段;
-
🚀 Calico BGP 模式可跨网段使用,只要 IP 可达、TCP 179 端口未被防火墙阻挡;
-
⚙️ 跨网段节点需手动配置 BGPPeer 对象建立邻居关系;
-
🏗 推荐大规模或多网段集群使用 Route Reflector 模式;
-
⚡ BGP 模式性能最高,但对网络设计要求更高。
🧠 写在最后
-
Flannel 胜在“简单易用”,适合入门与测试;
-
Calico 胜在“可控与可扩展”,是生产环境首选;
-
VXLAN 是连接跨节点的主流方案,但 Calico 的 VXLAN 比 Flannel 更智能、更安全。
📌 简而言之:
Flannel 让集群“能通”, Calico 让集群“既能通,又能控”。