Calico CNI 与 Flannel 网络插件详解
CNI(Container Network Interface)是 K8s 容器网络标准规范。Calico 和 Flannel 是两种主流 CNI 插件,本文从原理、架构、工作模式、性能对比全维度详解。
1. Calico 核心组件
Calico 每个节点运行 calico-node 容器,包含三个核心进程:
1.1. Felix(节点代理,核心进程)
- 为 Pod 创建虚拟网卡(veth pair)
- 配置主机路由、iptables 规则(实现网络策略)
- 监控本地网络状态、上报健康信息
1.2. BIRD(BGP 路由协议客户端)
- 节点之间同步路由信息
- 集群所有节点互相学习 Pod 网段路由
1.3. confd(配置监听)
监听 Calico 配置(etcd / K8s APIServer),动态更新 BIRD 配置
2. 网络模型:Pod 通信流程(无隧道,纯路由)
2.1. 基础网络架构
每个 Pod 拥有独立唯一 IP,Pod IP 集群内全路由可达。
- 节点内 Pod:通过 veth pair 直接通信(本机二层转发)
- 跨节点 Pod:Linux 主机路由 + BGP 路由转发
2.2. 节点内 Pod 通信(同机器)
- Pod1 发数据包 → 容器内网卡 → 宿主机端 veth 网卡
- 宿主机根据本地路由直接转发到目标 Pod 的 veth
- 直连转发,不经过网桥、不封装报文,性能高
2.3. 跨节点 Pod 通信(不同机器)
以 节点A(PodA) → 节点B(PodB) 为例:
- PodA 发包,宿主机查路由:目标 Pod IP 在节点B网段
- 数据包直接发给 节点B 主机物理 IP(三层路由)
- 节点B 接收,查本地路由,转发到对应 Pod
- 全程原始 IP 包,无隧道封装
关键点 所有节点通过 BGP 互相交换「Pod网段-节点IP」路由,整个集群形成一张大路由表。
3. BGP 路由工作模式
3.1. 全节点互联(Node-to-Node Mesh,默认)
所有 calico-node 两两建立 BGP 连接,互相同步路由。
- ✅ 优点:简单、开箱即用
- ❌ 缺点:节点多(>50)时 BGP 连接数暴涨,消耗资源
3.2. 路由反射器(Router Reflector,大规模集群必用)
选部分节点作为路由反射器,其他节点只和反射器建立 BGP 连接。
- ✅ 优点:减少连接数,适合上千节点大规模集群
4. Calico 三种工作模式
4.1. BGP 模式(默认,纯路由)
- 原理:不打隧道,依赖底层网络允许 Pod IP 互通
- 要求:宿主机二层/三层网络能直通所有 Pod IP
- 性能:最优,生产首选(同机房集群)
4.2. IPIP 隧道模式
- 原理:把 Pod 原始 IP 包封装在宿主机 IP 包里传输(IP-in-IP)
- 适用:底层网络不支持 Pod 网段路由(云厂商、多机房、跨网段)
- 注意:跨节点走隧道,有少量性能损耗
4.3. VXLAN 隧道模式
- 原理:基于 VXLAN 二层隧道,主流替代 IPIP
- 优点:兼容更多云环境、防火墙策略,隔离性更好
- 注意:同样报文封装,性能略低于纯路由
5. 网络策略(NetworkPolicy)实现原理
Calico 是 K8s 网络策略标准实现者,依靠 iptables 做访问控制:
- K8s 创建 NetworkPolicy → 规则同步到 Felix
- Felix 动态在节点写入 iptables 过滤规则
- 入/出 Pod 流量先经过 iptables 匹配,拒绝未授权流量
- 支持:基于 Pod 标签、命名空间、IP、端口的黑白名单访问控制
6. IP 地址管理(IPAM)
Calico 内置 IPAM 组件,负责 Pod IP 分配:
- 从
--pod-network-cidr网段(如192.168.0.0/16)自动划分子段给节点 - 节点本地从所属子段分配 IP 给 Pod
- 避免 IP 冲突、动态回收释放 IP
7. 优缺点总结
7.1. 优点
- ✅ 纯三层路由,性能高(BGP 模式)
- ✅ 网络策略功能强大、成熟稳定
- ✅ 架构简单,故障排查直观
- ✅ 支持 BGP、隧道、混合部署,适配多场景
7.2. 缺点
- ❌ 默认 BGP Mesh 不适合超大规模集群(需改路由反射器)
- ❌ 纯 BGP 模式对底层网络有路由要求
- ❌ 隧道模式存在少量封装开销
8. 快速记忆链路
Pod(veth) → 宿主机路由 → BGP 同步全网路由 → 目标节点路由 → 目标Pod
访问控制:Felix + iptables 实现网络策略
9. 附:Flannel 完整原理
9.1. Flannel 架构
Flannel 整体架构分为两大组件:
- flanneld:控制平面,监听 etcd,存储全集群各节点子网段信息
- cni-flannel:数据平面 CNI 插件,kubelet 调用完成 Pod 网卡配置
集群预先规划一个大的连续网段(例如 10.244.0.0/16),flanneld 自动给每个节点分配一段独立小子网。
9.2. Flannel 三种工作模式
9.2.1. VXLAN(默认,云环境首选)
UDP 封装隧道模式,将二层帧封装在 UDP 包中跨节点传输。
数据流:
PodA → veth → cni0(网桥)→ flannel.1(VTEP)→ 宿主机eth0 → UDP封装 → 目标节点 → flannel.1 → cni0 → veth → PodB
- ✅ 优点:跨节点通信不需要路由支持,云环境通用
- ❌ 缺点:UDP 封装解封装带来性能损耗
9.2.2. Host-GW(纯路由模式,性能最优)
flanneld 在各节点添加路由条目,直接把目标 Pod 网段的下一跳指向目标节点物理 IP。
数据流:
PodA → veth → cni0 → 宿主机路由表(下一跳指向目标节点eth0)→ 物理网络 → 目标节点cni0 → veth → PodB
- ✅ 优点:纯三层路由,无封装,性能最优
- ❌ 缺点:要求所有节点二层连通,不适合云环境跨 VPC
9.2.3. DirectRouting(混合模式)
同子网用 Host-GW(直连路由),跨子网自动回退 VXLAN(隧道封装),兼具性能与兼容性。
9.3. Calico vs Flannel 对比
| 对比维度 | Calico(BGP 模式) | Flannel(Host-GW) | Flannel(VXLAN) |
|---|---|---|---|
| 封装方式 | 无封装 | 无封装 | UDP/VXLAN 封装 |
| 性能 | 最高 | 最高 | 中等 |
| 网络策略 | 支持,功能强 | 不支持 | 不支持 |
| 底层要求 | 需要 BGP 路由支持 | 二层连通 | 无特殊要求 |
| 大规模集群 | 需路由反射器 | 适合中小规模 | 适合中小规模 |
| 生产推荐 | 同机房首选 | 小型集群 | 云环境 |
选型建议
- 同机房、高性能需求 → Calico BGP 模式
- 云环境、跨VPC → Calico VXLAN 或 Flannel VXLAN
- 小集群、简单需求 → Flannel Host-GW
- 需要网络策略 → 必须用 Calico
关联文档
- eBPF 技术详解 — eBPF 是 Cilium 的底层技术
- K8s 核心概念 — K8s 网络模型
- K8s Service 核心原理 — Service 网络
- firewalld 与 iptables 对比 — iptables 与网络策略