3. CNI插件深度解析(上):Calico架构、BGP模式与IPIP模式原理、Felix与Bird组件交互

Calico 是 Kubernetes 生态中最流行的 CNI 插件之一,以其纯三层网络模型和高性能著称。本章深入解析 Calico 的核心架构、两种主要数据平面模式(BGP 与 IPIP)的原理,以及 Felix 与 BIRD 组件的交互机制。

3.1 Calico 整体架构

Calico 采用分布式架构,每个节点上运行一组代理组件,通过 etcd 或 Kubernetes API 进行状态同步。其核心组件包括:

  • Felix:运行在每个节点上的守护进程,负责管理网络接口、路由规则和 iptables/ipset 策略。
  • BIRD:BGP 路由协议实现,负责在节点间分发路由信息。
  • confd:动态配置管理工具,监控 etcd 或 Kubernetes API 中的配置变更,并更新 BIRD 配置。
  • Dikastes:用于 Istio 集成,将 Calico 网络策略转换为 Envoy 可理解的格式。
  • CNI 插件:负责 Pod 网络接口的创建与配置。
架构要点:Calico 不依赖 Overlay 网络(默认模式),每个 Pod 分配一个可路由的 IP 地址,通过 BGP 协议在节点间直接交换路由,实现高性能的三层转发。
Calico 节点组件架构图 Kubernetes 节点 1 Pod A eth0: 10.0.1.2 Pod B eth0: 10.0.1.3 Felix 守护进程 路由 / iptables / 接口管理 BIRD BGP 路由 confd 配置管理 CNI 插件 calico / calico-ipam Kubernetes 节点 2 Pod C eth0: 10.0.2.2 Felix 守护进程 路由 / iptables / 接口管理 BIRD BGP 路由 confd 配置管理 CNI 插件 calico / calico-ipam BGP 会话 (iBGP/eBGP) 数据流:Pod → veth pair → 宿主机路由表 → BGP 路由 → 对端节点 → 目标 Pod

3.2 BGP 模式原理

BGP(Border Gateway Protocol)模式是 Calico 的默认数据平面模式,利用标准 BGP 协议在节点间交换 Pod 网段路由。

3.2.1 核心机制

  • 每个节点作为一个 BGP Speaker:运行 BIRD 进程,与集群内其他节点建立 BGP 会话。
  • Pod CIDR 路由通告:每个节点将其负责的 Pod CIDR 段(如 10.0.1.0/24)通过 BGP 通告给其他节点。
  • 直连路由:节点收到对端 Pod CIDR 路由后,直接写入内核路由表,数据包无需封装直接转发。
  • 两种拓扑模式:
    • Full Mesh(全互联):每个节点与所有其他节点建立 BGP 会话,适用于小规模集群(< 50 节点)。
    • Route Reflector(路由反射器):指定部分节点作为 Route Reflector,其他节点只与 Reflector 建立会话,适用于大规模集群。

3.2.2 BGP 模式优缺点

维度 说明
性能 无封装开销,接近原生网络性能,延迟最低
复杂度 需要物理网络支持 BGP 路由协议,对网络设备有要求
可扩展性 Full Mesh 模式下节点数受限,建议使用 Route Reflector
适用场景 物理网络支持 BGP、对性能要求高的生产环境
关键限制:BGP 模式要求底层网络设备(交换机/路由器)能够处理大量 BGP 路由条目。如果网络设备不支持或路由表容量不足,应选择 IPIP 模式。

3.3 IPIP 模式原理

IPIP(IP in IP)模式是一种 Overlay 网络方案,将 Pod 数据包封装在另一个 IP 包中传输,解决底层网络不支持 BGP 或路由隔离的问题。

3.3.1 封装与解封装流程

  1. 源 Pod 发送数据包:目标 IP 为对端 Pod IP(如 10.0.2.2)。
  2. 节点路由查找:根据路由表,发现目标 IP 属于对端节点,需要走 IPIP 隧道。
  3. IPIP 封装:在原始 IP 包外添加新 IP 头,源 IP 为本地节点 IP,目标 IP 为对端节点 IP。
  4. 物理网络转发:封装后的数据包通过物理网络路由到对端节点。
  5. 解封装:对端节点收到后,剥离外层 IP 头,还原原始数据包。
  6. 交付目标 Pod:根据内层目标 IP,将数据包转发给目标 Pod。
IPIP 封装与解封装流程 源节点 (Node1) IP: 192.168.1.10 Pod IP: 10.0.1.2 IPIP 封装 外层: 192.168.1.10 → 192.168.1.20 内层: 10.0.1.2 → 10.0.2.2 协议: IPIP (4) 目标节点 (Node2) IP: 192.168.1.20 Pod IP: 10.0.2.2 物理网络传输 基于外层 IP 路由 解封装 剥离外层 IP 头 MTU 注意事项:IPIP 封装增加 20 字节头部,物理网络 MTU 需设置为 1480 或启用 TCP MSS 钳制

3.3.2 IPIP 模式优缺点

维度 说明
兼容性 不依赖底层网络支持 BGP,可在任何 IP 网络上运行
性能 有封装/解封装开销,性能比 BGP 模式低 5%-15%
MTU 问题 额外 20 字节头部,需调整 MTU 或启用 MSS 钳制
适用场景 云环境、网络设备不支持 BGP、跨子网通信

3.4 Felix 与 BIRD 组件交互

Felix 和 BIRD 是 Calico 节点上最核心的两个组件,它们分工明确且紧密协作。

3.4.1 Felix 职责

  • 接口管理:创建/删除 veth pair,将 Pod 端接入 caliXXX 接口。
  • 路由编程:将本地 Pod 的路由写入内核路由表(如 10.0.1.2 dev caliXXX)。
  • 策略实施:通过 iptables/ipset 实现 NetworkPolicy 规则。
  • 健康检查:监控接口和路由状态,上报节点健康信息。

3.4.2 BIRD 职责

  • BGP 会话管理:与对端节点或 Route Reflector 建立/维护 BGP 会话。
  • 路由分发:将 Felix 写入内核的 Pod 路由通过 BGP 通告给其他节点。
  • 路由接收:接收对端通告的 Pod 路由,写入内核路由表。
  • 路由过滤:根据配置策略过滤不必要的路由。

3.4.3 交互流程

  1. Pod 创建事件:Kubelet 调用 Calico CNI 插件,CNI 插件通过 Felix API 通知 Felix。
  2. Felix 配置接口:Felix 创建 veth pair,将 Pod 端接入,分配 IP 地址。
  3. Felix 写入路由:Felix 将 Pod IP 对应的路由写入内核路由表(如 10.0.1.0/24 dev eth0)。
  4. confd 检测变更:confd 监控到 Felix 写入的路由变更,更新 BIRD 配置文件。
  5. BIRD 重载配置:BIRD 读取新配置,将新增路由通过 BGP 会话通告给其他节点。
  6. 对端 BIRD 接收:对端节点 BIRD 收到路由更新,写入内核路由表。
  7. 数据面就绪:两个节点之间完成路由同步,Pod 间通信路径建立。
关键交互点:Felix 负责“本地路由编程”,BIRD 负责“路由跨节点分发”。Felix 不直接与 BIRD 通信,而是通过内核路由表作为中间桥梁。confd 作为配置转换器,将 Felix 的状态变化转换为 BIRD 可理解的 BGP 配置。

3.4.4 组件交互示意图

Felix 与 BIRD 组件交互流程 Felix 接口/路由/策略 内核路由表 中间桥梁 BIRD BGP 路由 ① Pod 创建 → CNI 插件调用 Felix → Felix 创建 veth pair 并分配 IP ② Felix 将 Pod 路由写入内核路由表(如 10.0.1.2 dev caliXXX) ③ confd 检测路由变更 → 更新 BIRD 配置 → BIRD 重载 ④ BIRD 通过 BGP 会话将路由通告给其他节点 → 对端写入内核路由表 写入 读取 Felix 不直接与 BIRD 通信,通过内核路由表 + confd 配置转换实现间接协作

3.5 模式选择对比

对比维度 BGP 模式 IPIP 模式
网络性能 原生性能,无额外开销 有封装开销,性能略低
底层依赖 需要网络设备支持 BGP 仅需 IP 可达
MTU 要求 标准 MTU (1500) 需降低 MTU 至 1480
路由条目 每个 Pod CIDR 一条路由 每个节点一条隧道路由
故障排查 依赖 BGP 会话状态 依赖隧道接口状态
推荐场景 自建机房、高性能场景 公有云、混合云、跨子网
生产建议:在物理网络支持 BGP 的环境中,优先选择 BGP 模式以获得最佳性能。在公有云或网络设备受限的环境中,使用 IPIP 模式并注意 MTU 配置。两种模式可以在集群中混合使用,通过 IPPool 资源为不同命名空间或节点组指定不同的封装模式。