2. Calico 架构总览:核心组件与数据流

Calico 采用分布式无中心架构,通过一组协同工作的组件实现容器网络策略与路由管理。理解每个组件的职责及其数据交互路径,是进行缓存命中率调优的前提。本章将逐一解析 Felix、BIRD、confd、数据存储后端以及 Typha 的作用,并展示完整的数据流。

2.1 核心组件一览

组件 部署形态 核心职责 关键性能关注点
Felix DaemonSet(每个节点) 管理节点 iptables/ipvs 规则、路由表、虚拟网卡(veth) 规则变更频率、API 调用延迟
BIRD DaemonSet(每个节点) BGP 路由协议实现,负责路由分发与学习 路由收敛速度、BGP 会话数量
confd DaemonSet(每个节点) 监听数据存储变更,动态生成 BIRD 配置文件 watch 事件延迟、模板渲染效率
数据存储 etcd 或 Kubernetes API 存储网络策略、IPAM 分配、端点信息 读写 QPS、watch 连接数、缓存一致性
Typha Deployment(可选) Felix 与数据存储之间的连接扇出与事件缓存 连接数、缓存大小、事件分发延迟

2.2 组件详解与数据流

2.2.1 Felix:节点代理

Felix 是运行在每个 Kubernetes 节点上的核心代理,直接负责数据平面的编程。它通过监听数据存储中的 NetworkPolicy、Endpoint 和 IPPool 资源,将策略转化为节点本地的 iptables 规则或 eBPF 程序,并维护路由表与虚拟网卡。

  • 数据输入:从数据存储(直接或通过 Typha)watch 资源变更。
  • 数据输出:调用 iptables/ip6tables、ip route、ip link 等系统命令。
  • 缓存机制:Felix 内部维护资源缓存,减少对数据存储的重复查询。

2.2.2 BIRD:BGP 路由引擎

BIRD 负责在 Calico 节点之间通过 BGP 协议交换容器路由。每个节点的 BIRD 实例会将自己负责的容器网段通告给其他节点,从而实现跨节点 Pod 通信。

  • 配置来源:confd 根据数据存储中的 BGPPeer、Node 资源动态生成 BIRD 配置文件。
  • 路由学习:从 Felix 维护的内核路由表导入直连路由,并通过 BGP 会话导出给邻居。
  • 性能关键:BGP 会话数量、路由表规模直接影响内存与 CPU 开销。

2.2.3 confd:配置模板引擎

confd 是一个轻量级的配置管理工具,在 Calico 中专门用于为 BIRD 生成配置。它 watch 数据存储中的特定 key 前缀,一旦发现变化,就使用 Go 模板渲染出新的 BIRD 配置文件,并触发 BIRD 重新加载。

  • 工作流程:watch 事件 → 读取最新数据 → 渲染模板 → 校验配置 → 重启 BIRD。
  • 调优点:模板渲染性能、watch 超时设置、重载触发频率。

2.2.4 数据存储:etcd 与 Kubernetes API

Calico 支持两种数据存储后端:etcd 和 Kubernetes API。etcd 模式提供更精细的 watch 控制和更低延迟,但需要独立运维;Kubernetes API 模式复用集群已有存储,简化运维但 watch 性能受 API Server 限制。

特性 etcd 模式 Kubernetes API 模式
存储后端 独立 etcd 集群 Kubernetes API Server + etcd
watch 粒度 key 级别 资源类型级别
运维复杂度 高 低
缓存命中率影响 Felix 可直接 watch,延迟低 依赖 API Server 缓存,可能引入额外延迟

2.2.5 Typha:连接扇出与缓存层

在大型集群中,成百上千个 Felix 实例同时 watch 数据存储会给后端带来巨大压力。Typha 作为中间代理层,所有 Felix 连接到 Typha,Typha 再维持少量连接到数据存储。Typha 内部维护一个事件缓存,当 Felix 重连时可以直接从缓存恢复,避免全量重新同步。

  • 连接数压缩:N 个 Felix 对 M 个数据存储连接,变为 N 个 Felix 对 1 个 Typha 连接 + 1 个 Typha 对数据存储连接。
  • 缓存加速:Felix 断连后重连,Typha 可发送缓存快照,大幅减少数据存储负载。
  • 推荐场景:节点数 > 50 时强烈建议启用 Typha。

2.3 完整数据流图

下图展示了 Calico 组件之间的数据交互路径,重点关注策略下发与路由同步两条主线。

Calico 组件数据流图 数据存储 etcd / Kubernetes API Typha(可选) 连接扇出 + 事件缓存 watch Felix(节点1) iptables / 路由 / veth Felix(节点2) iptables / 路由 / veth watch 事件 watch 事件 confd 模板渲染 watch BIRD BGP 路由 生成配置 BGP 路由通告 BGP 路由通告 数据流说明: ① 策略/端点变更写入数据存储 → ② Typha 扇出 watch 事件给所有 Felix → ③ Felix 更新本地数据平面 ④ confd 监听路由/节点变更 → ⑤ 渲染 BIRD 配置 → ⑥ BIRD 通过 BGP 会话同步路由

2.4 组件交互时序

以创建一个新的 NetworkPolicy 为例,展示组件间的典型交互时序:

  1. 用户创建策略:通过 kubectl apply -f policy.yaml 写入 Kubernetes API。
  2. 数据存储更新:API Server 将策略持久化到 etcd,并触发 watch 事件。
  3. Typha 接收事件:Typha 从数据存储收到变更通知,更新内部缓存,并推送给所有连接的 Felix。
  4. Felix 处理事件:Felix 解析策略,计算需要更新的 iptables 规则链,调用 iptables-restore 应用变更。
  5. confd 同步:如果策略涉及路由变化(如 IP 池变更),confd 检测到后重新渲染 BIRD 配置。
  6. BIRD 重载:BIRD 加载新配置,更新 BGP 路由通告。
调优提示: 在大型集群中,Felix 直接 watch 数据存储会导致大量连接。启用 Typha 后,Felix 只需维持与 Typha 的单连接,且 Typha 的缓存能显著降低 Felix 重连时的全量同步开销,是提升缓存命中率的关键架构决策。

2.5 缓存命中率相关组件总结

从缓存命中率的角度,各组件的影响可归纳如下:

组件 缓存位置 对命中率的影响 优化方向
Felix 内部资源缓存 减少重复查询数据存储 增大缓存 TTL,减少不必要 watch
Typha 事件缓存 避免 Felix 重连时全量同步 合理设置缓存大小与淘汰策略
confd 模板缓存 减少重复渲染 优化模板复杂度,减少 watch 范围
数据存储 etcd / API Server 缓存 决定 watch 事件延迟 调整 etcd 的 --max-request-bytes 与后端存储配额
注意: 缓存并非越大越好。过大的缓存会导致内存占用上升,且数据一致性窗口变长。在调优缓存命中率时,必须结合业务对策略生效延迟的容忍度进行权衡。