3. Calico 架构概览:Felix、BIRD、confd、etcd/Kubernetes datastore 角色
在生产环境中排查容器网络缓存命中故障,首先需要理解 Calico 的控制面与数据面是如何协作的。Calico 采用模块化架构,每个组件承担明确的职责,共同实现基于 BGP 的纯三层网络策略与路由分发。本章聚焦四个核心组件:Felix、BIRD、confd 以及 etcd / Kubernetes datastore,剖析它们在路由同步、策略执行与数据存储中的角色。
3.1 架构总览:控制面与数据面分离
Calico 不依赖 Overlay 隧道,而是将每个容器端点的 IP 路由直接通过 BGP 协议通告到物理网络。其架构分为两层:
- 数据面:由 Linux 内核的 iptables / nftables 规则和路由表组成,负责实际的数据包转发与策略过滤。
- 控制面:由 Felix、BIRD、confd 和 datastore 构成,负责策略计算、路由生成与状态同步。
下图展示了 Calico 核心组件之间的交互关系:
3.2 组件角色详解
| 组件 | 核心职责 | 关键行为 | 故障关联点 |
|---|---|---|---|
| Felix | 策略代理 & 端点管理 | 监听 datastore 中的 NetworkPolicy、Endpoint 变化;写入 iptables 规则与路由表 | 规则未刷新、端点缓存过期 |
| BIRD | BGP 路由守护进程 | 从 Felix 获取本地路由,通过 BGP 会话通告给 ToR 或 Spine 交换机 | BGP 会话中断、路由撤回延迟 |
| confd | 配置模板引擎 | 监听 datastore 变化,动态生成 BIRD 配置文件并触发重载 | 模板渲染错误、重载失败 |
| etcd / K8s datastore | 全局状态存储 | 存储所有 WorkloadEndpoint、NetworkPolicy、IPPool、Node 等资源 | 数据不一致、watch 超时 |
3.3 Felix:策略执行与端点管理
Felix 是运行在每个 Calico 节点上的守护进程,是数据面策略的直接执行者。它的工作流程如下:
- 监听 datastore:通过 watch 机制获取 WorkloadEndpoint、NetworkPolicy、Profile 等资源的变更事件。
- 计算差分:将当前期望状态与节点本地实际状态对比,生成增量更新指令。
- 写入内核:调用 iptables / nftables 命令插入或删除规则;同时操作路由表添加或删除容器端点路由。
- 上报状态:将节点状态、端点状态写回 datastore,供其他组件消费。
3.4 BIRD:BGP 路由分发引擎
BIRD 是 Calico 默认的 BGP 路由守护进程,负责将每个节点上的容器路由通告到外部网络。其关键特性包括:
- 路由来源:从 Felix 写入内核的路由表中导入直连容器路由。
- BGP 会话管理:与 ToR 交换机、Spine 交换机或其他 Calico 节点建立 eBGP / iBGP 会话。
- 路由过滤与聚合:支持通过 BGP 社区属性、前缀列表等机制控制路由发布范围。
- 故障恢复:当 BGP 会话中断时,BIRD 会保持已学习路由直到会话恢复或超时。
import 和 export 过滤规则配置错误,会导致容器路由无法正确通告,外部流量无法到达 Pod,形成“路由缓存缺失”。
3.5 confd:动态配置生成器
confd 是一个轻量级的配置模板引擎,在 Calico 中专门用于生成 BIRD 的配置文件。它的工作模式如下:
- 监听 datastore:订阅 Node、IPPool、BGPConfiguration 等资源的变化。
- 渲染模板:使用预定义的 Go 模板(如
bird.cfg.template)生成 BIRD 配置文件。 - 触发重载:通过 SIGHUP 信号或
birdc configure命令让 BIRD 重新加载配置。
confd 的引入使得 Calico 能够动态响应集群拓扑变化,无需手动修改 BIRD 配置。但模板渲染错误或重载失败会直接导致 BIRD 运行在过期配置上。
3.6 etcd / Kubernetes datastore:状态一致性的基石
Calico 支持两种 datastore 模式:
| 模式 | 存储后端 | 适用场景 | 一致性模型 |
|---|---|---|---|
| etcd 模式 | 独立 etcd 集群 | 非 Kubernetes 环境、需要独立存储 | 强一致性(Raft) |
| Kubernetes 模式 | K8s API Server + etcd | Kubernetes 原生集成 | 最终一致性(watch 机制) |
在 Kubernetes 模式下,Calico 将 WorkloadEndpoint、NetworkPolicy 等资源以 CRD 形式存储在 K8s API Server 中。Felix、confd 通过 watch 接口监听变化。这种架构简化了部署,但 watch 连接的稳定性直接影响组件间的状态同步速度。
3.7 组件协作与缓存命中故障的根因
从上述架构可以看出,一次完整的策略或路由更新需要经过以下链路:
Datastore 变更
├─→ Felix 监听 → 计算差分 → 写入 iptables/路由表
└─→ confd 监听 → 渲染模板 → 触发 BIRD 重载 → BGP 通告
当缓存命中故障发生时,问题通常出现在以下环节:
- Felix 处理延迟:节点资源紧张或 watch 连接断开,导致 Felix 未能及时拉取最新策略。
- confd 模板错误:BGP 配置模板语法错误导致重载失败,BIRD 继续使用旧配置。
- BIRD 会话问题:BGP 会话因网络抖动中断,路由无法及时撤销或更新。
- Datastore 不一致:etcd 或 K8s API Server 中的数据与节点实际状态出现偏差。