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 组件之间的数据交互路径,重点关注策略下发与路由同步两条主线。
2.4 组件交互时序
以创建一个新的 NetworkPolicy 为例,展示组件间的典型交互时序:
- 用户创建策略:通过
kubectl apply -f policy.yaml写入 Kubernetes API。 - 数据存储更新:API Server 将策略持久化到 etcd,并触发 watch 事件。
- Typha 接收事件:Typha 从数据存储收到变更通知,更新内部缓存,并推送给所有连接的 Felix。
- Felix 处理事件:Felix 解析策略,计算需要更新的 iptables 规则链,调用
iptables-restore应用变更。 - confd 同步:如果策略涉及路由变化(如 IP 池变更),confd 检测到后重新渲染 BIRD 配置。
- BIRD 重载:BIRD 加载新配置,更新 BGP 路由通告。
2.5 缓存命中率相关组件总结
从缓存命中率的角度,各组件的影响可归纳如下:
| 组件 | 缓存位置 | 对命中率的影响 | 优化方向 |
|---|---|---|---|
| Felix | 内部资源缓存 | 减少重复查询数据存储 | 增大缓存 TTL,减少不必要 watch |
| Typha | 事件缓存 | 避免 Felix 重连时全量同步 | 合理设置缓存大小与淘汰策略 |
| confd | 模板缓存 | 减少重复渲染 | 优化模板复杂度,减少 watch 范围 |
| 数据存储 | etcd / API Server 缓存 | 决定 watch 事件延迟 | 调整 etcd 的 --max-request-bytes 与后端存储配额 |