3. Calico 架构概览:核心组件详解与数据/控制平面分离

Calico 是 Kubernetes 生态中最流行的 CNI 插件之一,其核心设计理念是将网络策略的执行与数据转发完全解耦。本章将深入剖析 Calico 的五大核心组件——Felix、BIRD、confd、Typha,并阐述其数据平面与控制平面分离的架构优势。

3.1 核心组件全景

Calico 采用分布式架构,每个节点上运行一组轻量级代理,通过 etcd 或 Kubernetes API Server 同步状态。下表总结了各组件的职责与部署位置:

组件 部署位置 核心职责 通信协议
Felix 每个节点(DaemonSet) 管理 iptables/IPVS 规则、路由表、接口配置 直接读写内核
BIRD 每个节点(DaemonSet) BGP 路由协议守护进程,负责路由分发 BGP (TCP 179)
confd 每个节点(DaemonSet) 监听 etcd/K8s API 变化,动态生成 BIRD 配置 HTTP/gRPC → etcd
Typha 独立 Deployment(可选) Felix 与 API Server 之间的连接扇出与缓存 gRPC/Watch API
kube-controllers 独立 Deployment 策略翻译、IPAM 回收、端点切片同步 K8s API
架构要点:Felix 是唯一直接操作数据平面的组件,BIRD 和 confd 仅负责控制平面路由信息的传播,这种分离使得 Calico 可以在不重启 Felix 的情况下动态调整路由策略。

3.2 Felix:数据平面的执行者

Felix 是 Calico 的“手脚”,运行在每个 Kubernetes 节点上,负责将网络策略和路由规则转化为内核中的实际配置。其工作流程如下:

  1. 监听数据源:通过 Watch API 从 Typha 或直接从 API Server 获取 WorkloadEndpoint、NetworkPolicy、IPPool 等资源。
  2. 计算差分:将当前内核状态与期望状态对比,生成增量更新指令。
  3. 写入内核:调用 iptables-restore、ip route replace、ip link set 等系统命令,完成规则安装。
  4. 健康上报:定期向 API Server 上报节点状态和 Felix 自身健康信息。
性能关键点:Felix 使用差分更新机制,每次变更只推送增量规则,而非全量刷新。在拥有 5000+ 条策略的集群中,单次策略变更的收敛时间可控制在 200ms 以内。

3.3 BIRD 与 confd:控制平面的路由引擎

BIRD(BIRD Internet Routing Daemon)是 Calico 实现 BGP 路由分发的核心。confd 则作为配置生成器,将 etcd 中的路由信息动态写入 BIRD 配置文件。

两者的协作关系如下:

  • confd 订阅 etcd 中 /calico/bgp/v1 路径下的变化,当有新的节点加入或 Pod 子网变更时,立即生成新的 BIRD 配置。
  • BIRD 通过 birdc configure 热加载新配置,无需重启进程。
  • BIRD 与对端(其他节点或物理路由器)建立 BGP 会话,通告 Pod CIDR 路由。
注意:在大型集群(节点数 > 100)中,BIRD 的 BGP 会话数会随节点数平方增长。建议启用 Route Reflector 模式,将全互联(Full Mesh)改为客户端-反射器架构,以降低控制平面负载。

3.4 Typha:大规模集群的通信瓶颈突破

当集群规模超过 50 个节点时,每个节点的 Felix 都直接 Watch API Server 会导致严重的连接风暴。Typha 作为中间层,解决了这一痛点:

对比维度 无 Typha 有 Typha
API Server 连接数 N(节点数) Typha 副本数(通常 2~3)
Watch 开销 每个节点独立 Watch,重复传输 Typha 聚合后扇出,减少带宽
故障恢复 所有节点同时重连,雪崩风险 Typha 缓存状态,Felix 快速同步
推荐场景 节点数 < 50 节点数 ≥ 50 或策略变更频繁

Typha 内部维护一个 状态缓存,当 Felix 断开重连时,Typha 直接发送全量快照 + 增量事件,避免 Felix 重新从 API Server 拉取全量数据。

3.5 数据平面与控制平面分离架构

Calico 最核心的设计哲学是数据平面与控制平面完全分离。这种分离带来了以下优势:

  • 独立升级:Felix 的升级不影响 BIRD 的路由会话,反之亦然。
  • 故障隔离:BIRD 进程崩溃不会导致已有网络策略失效,Felix 仍维持内核规则。
  • 性能优化:控制平面可以使用较慢的异步更新(BGP 收敛秒级),而数据平面必须快速响应(iptables 更新毫秒级)。
  • 多后端支持:控制平面可以替换为其他路由协议(如 IPIP、VXLAN),数据平面保持不变。
实际案例:在某 200 节点生产集群中,运维人员误操作导致 BIRD 配置错误,所有 BGP 会话中断。但由于 Felix 已经将路由写入内核,Pod 间通信完全不受影响,仅新 Pod 无法被外部访问。运维人员有充足时间修复 BIRD 配置,无需紧急重启 Felix。
Calico 组件架构与数据/控制平面分离 Calico 组件架构:数据平面与控制平面分离 控制平面(Control Plane) 数据平面(Data Plane) etcd / Kubernetes API Server confd(配置生成器) BIRD(BGP 路由守护进程) Typha(连接扇出 & 缓存) Felix(策略 & 路由执行器) Linux 内核 iptables / IPVS / 路由表 / 网络接口 BGP 对端 分离优势 控制平面故障不影响数据平面 独立升级、故障隔离、性能优化

3.6 组件间通信流程

为了更直观地理解组件协作,下图展示了从网络策略创建到内核规则生效的完整调用链:

Calico 策略下发流程 网络策略下发完整流程 ① 用户创建 NetworkPolicy ② API Server 存储 & 通知 ③ Typha 扇出 & 缓存 ④ Felix 差分计算 ⑤ 内核 iptables 生效 ⑥ BIRD BGP 路由更新 流程说明 步骤 ④ 和 ⑥ 并行执行:Felix 直接写入内核保证数据平面快速生效,BIRD 异步更新 BGP 路由保证控制平面收敛 数据平面收敛时间 < 100ms,控制平面 BGP 收敛时间通常为 1~5s

3.7 架构设计总结

Calico 通过以下设计原则实现了高性能与高可用的统一:

设计原则 实现方式 收益
控制与数据分离 Felix 独立操作内核,BIRD/confd 仅处理路由 故障隔离、独立升级、性能互不影响
差分更新 Felix 只推送增量 iptables 规则 大规模策略变更时收敛快,CPU 开销低
连接扇出 Typha 作为 Watch 代理 减少 API Server 压力,支持 500+ 节点集群
热加载配置 confd 动态生成 BIRD 配置,birdc 热加载 路由变更无需重启 BIRD 进程