2、Calico 网络基础:Felix、BIRD、confd 组件架构与数据平面转发原理

Calico 作为 Kubernetes 生态中最流行的纯三层网络方案之一,其核心优势在于将网络策略与数据转发解耦,利用标准 Linux 路由和 iptables/netfilter 实现高性能转发。理解 Felix、BIRD、confd 三大控制面组件以及数据平面的转发路径,是后续进行参数调优和镜像拉取加速的前提。

2.1 三大控制面组件架构总览

Calico 的控制面由三个核心守护进程组成,它们各自承担不同的职责,并通过 etcd 或 Kubernetes API 进行状态同步。下表总结了各组件的功能定位与关键特性:

组件 运行位置 核心职责 数据来源 关键输出
Felix 每个节点(DaemonSet) 管理主机路由、iptables 规则、策略执行 etcd / K8s API 路由条目、安全策略规则
BIRD 每个节点(可选 DaemonSet) BGP 路由协议守护进程,负责跨节点路由分发 Felix 写入的路由表 BGP 路由更新
confd 每个节点(通常与 BIRD 同容器) 监听 etcd 变化,动态生成 BIRD 配置文件 etcd BIRD 配置文件
架构要点:Felix 是“执行者”,直接操作节点网络栈;BIRD 是“传播者”,负责将 Felix 写入的路由通告给其他节点;confd 是“配置桥梁”,确保 BIRD 的配置始终与集群状态一致。在非 BGP 模式(如 VXLAN 或 IPIP)下,BIRD 和 confd 可以被替换或禁用。

2.2 Felix:节点网络策略引擎

Felix 是 Calico 在每台节点上的代理,它直接与 Linux 内核交互。Felix 的主要工作循环包括:

  1. 端点发现:通过监听 Kubernetes API 或 etcd,获取本节点上所有 Pod 的 IP 地址、MAC 地址以及关联的网络策略。
  2. 路由编程:为每个本地 Pod 写入主机路由(例如 10.244.1.3/32 dev caliXXXX scope link),确保 Pod 流量可以正确进入 veth 对。
  3. 策略编程:将 Kubernetes NetworkPolicy 翻译为 iptables 规则链(cali-policy、cali-failsafe 等),实现入站和出站流量过滤。
  4. 健康检查与清理:定期清理过期规则,确保节点网络状态与集群期望一致。
性能关键点:Felix 的 iptables 规则数量直接影响数据平面延迟。当集群中存在大量 NetworkPolicy 时,Felix 需要频繁更新规则链,这可能导致 CPU 开销上升。后续章节的调优将重点围绕 IptablesBackend(nftables 模式)和 ChainInsertMode 参数展开。

2.3 BIRD 与 confd:BGP 路由分发链路

在 Calico 的 BGP 模式下,BIRD 负责将 Felix 写入的本地路由通过 BGP 协议通告给其他节点或网络设备。confd 则作为配置生成器,确保 BIRD 的配置始终反映集群拓扑变化。

下图展示了 BIRD 与 confd 的协作流程:

BIRD 与 confd 协作流程 BIRD 与 confd 协作流程 etcd confd BIRD BGP 对等体 监听变化 生成配置 通告路由 工作流程说明: 1. confd 持续监听 etcd 中 Calico 配置(如 IP 池、AS 号、对等体信息)。 2. 配置变化时,confd 动态重写 BIRD 配置文件并触发 BIRD 重载。 Felix 写入本地路由表 → BIRD 从内核路由表导入 → 通过 BGP 会话通告 内核路由表 BIRD 导入 BGP 会话
注意:在非 BGP 模式下(例如使用 ipip 或 vxlan 封装),BIRD 和 confd 不会被启用。此时跨节点路由由 Felix 通过 IPIP/VXLAN 隧道直接处理,不再依赖 BGP 协议。选择哪种模式直接影响网络吞吐量和延迟,也是后续调优的核心决策点。

2.4 数据平面转发原理

Calico 的数据平面转发遵循“纯三层”设计理念,不依赖 Overlay 封装(默认模式)。当 Pod A(节点1)向 Pod B(节点2)发送数据包时,转发路径如下:

  1. Pod 出站:数据包通过 veth 对进入宿主机网络栈,目标 IP 为 Pod B 的 IP。
  2. 路由查找:宿主机内核根据路由表查找目标 IP。Felix 已为每个远程 Pod 写入主机路由(例如 10.244.2.3/32 via 192.168.1.2 dev eth0)。
  3. 下一跳转发:数据包被路由到下一跳节点(节点2的物理 IP),通过节点间二层网络直接发送。
  4. 目标节点处理:节点2 收到数据包后,再次进行路由查找,命中本地 Pod 路由,将数据包通过 veth 对送入 Pod B。
  5. 策略过滤:在入站和出站路径上,Felix 插入的 iptables 规则链对数据包进行过滤,匹配 NetworkPolicy。

下图展示了完整的跨节点数据包转发路径:

Calico 跨节点数据包转发路径 Calico 跨节点数据包转发路径(纯三层模式) 节点 1 (192.168.1.1) Pod A 10.244.1.2 veth caliXXXX 路由表 10.244.2.3 → 192.168.1.2 iptables 策略 节点 2 (192.168.1.2) Pod B 10.244.2.3 veth caliYYYY 路由表 10.244.2.3 → caliYYYY iptables 策略 物理网络 目标: 192.168.1.2 关键路径:Pod A → veth → 路由查找 → iptables 出站 → 物理网络 → 节点2 路由查找 → iptables 入站 → veth → Pod B

2.5 数据平面性能关键因素

从上述转发路径可以看出,Calico 的数据平面性能受以下因素影响:

因素 影响 调优方向
路由表规模 每增加一个远程 Pod 条目,路由查找时间线性增长 使用聚合路由(IP 池级别)减少条目数
iptables 规则链长度 NetworkPolicy 越多,规则链越长,匹配延迟越高 启用 nftables 后端、优化策略顺序
MTU 配置 IPIP/VXLAN 封装会额外消耗 MTU,导致分片 调整物理网络 MTU 或启用巨型帧
BGP 收敛速度 节点故障时,BIRD 需要时间重新计算路由 调整 BGP 定时器、启用 ECMP
Felix 同步间隔 Felix 与 API Server 的同步频率影响策略生效速度 调整 FelixSyncInterval 参数
镜像拉取加速关联:在多集群镜像拉取场景中,数据平面的转发延迟直接影响镜像层数据的传输效率。如果 Calico 使用 IPIP 封装,额外的 20 字节头部可能导致 MTU 问题,进而触发 TCP 分片和重传。后续章节将针对这些参数进行专项调优,以降低跨集群镜像拉取的网络开销。

2.6 组件交互时序总结

为了更直观地理解 Felix、BIRD、confd 之间的交互时序,下表总结了典型场景下的组件协作流程:

步骤 触发事件 执行组件 输出/结果
1 新 Pod 调度到节点 Kubernetes Scheduler Pod 状态更新写入 API Server
2 Felix 监听 Pod 变化 Felix 写入主机路由、创建 veth 对
3 Felix 更新 iptables Felix 生成 cali-policy 规则链
4 confd 检测路由变化 confd 更新 BIRD 配置文件
5 BIRD 重载配置 BIRD 向 BGP 对等体发送路由更新
6 其他节点 BIRD 接收路由 BIRD (其他节点) 写入内核路由表,完成路由收敛