technology

Calico CNI 与 Flannel 网络插件详解

·8 分钟阅读·3130 字
📋 目录

Calico CNI 与 Flannel 网络插件详解

CNI(Container Network Interface)是 K8s 容器网络标准规范。CalicoFlannel 是两种主流 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 通信(同机器)

  1. Pod1 发数据包 → 容器内网卡 → 宿主机端 veth 网卡
  2. 宿主机根据本地路由直接转发到目标 Pod 的 veth
  3. 直连转发,不经过网桥、不封装报文,性能高

2.3. 跨节点 Pod 通信(不同机器)

以 节点A(PodA) → 节点B(PodB) 为例:

  1. PodA 发包,宿主机查路由:目标 Pod IP 在节点B网段
  2. 数据包直接发给 节点B 主机物理 IP(三层路由)
  3. 节点B 接收,查本地路由,转发到对应 Pod
  4. 全程原始 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 做访问控制:

  1. K8s 创建 NetworkPolicy → 规则同步到 Felix
  2. Felix 动态在节点写入 iptables 过滤规则
  3. 入/出 Pod 流量先经过 iptables 匹配,拒绝未授权流量
  4. 支持:基于 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 整体架构分为两大组件:

  1. flanneld:控制平面,监听 etcd,存储全集群各节点子网段信息
  2. 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

关联文档