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 核心组件之间的交互关系:

Calico 核心组件架构图 etcd / K8s Datastore 全局状态存储 Felix 策略代理 & 端点管理 confd 配置模板引擎 BIRD BGP 路由守护进程 Linux 内核数据面 iptables / nftables 规则 + 路由表 说明:Felix 直接操作内核规则;confd 动态生成 BIRD 配置;BIRD 负责 BGP 路由通告。

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 节点上的守护进程,是数据面策略的直接执行者。它的工作流程如下:

  1. 监听 datastore:通过 watch 机制获取 WorkloadEndpoint、NetworkPolicy、Profile 等资源的变更事件。
  2. 计算差分:将当前期望状态与节点本地实际状态对比,生成增量更新指令。
  3. 写入内核:调用 iptables / nftables 命令插入或删除规则;同时操作路由表添加或删除容器端点路由。
  4. 上报状态:将节点状态、端点状态写回 datastore,供其他组件消费。
缓存命中故障提示: 当 Felix 因资源压力或 datastore watch 超时而无法及时处理变更时,节点上的 iptables 规则会停留在旧版本,导致新创建的 Pod 无法匹配正确的策略,表现为“缓存未命中”或“策略不生效”。

3.4 BIRD:BGP 路由分发引擎

BIRD 是 Calico 默认的 BGP 路由守护进程,负责将每个节点上的容器路由通告到外部网络。其关键特性包括:

  • 路由来源:从 Felix 写入内核的路由表中导入直连容器路由。
  • BGP 会话管理:与 ToR 交换机、Spine 交换机或其他 Calico 节点建立 eBGP / iBGP 会话。
  • 路由过滤与聚合:支持通过 BGP 社区属性、前缀列表等机制控制路由发布范围。
  • 故障恢复:当 BGP 会话中断时,BIRD 会保持已学习路由直到会话恢复或超时。
注意: 在缓存命中故障场景中,BIRD 的 import 和 export 过滤规则配置错误,会导致容器路由无法正确通告,外部流量无法到达 Pod,形成“路由缓存缺失”。

3.5 confd:动态配置生成器

confd 是一个轻量级的配置模板引擎,在 Calico 中专门用于生成 BIRD 的配置文件。它的工作模式如下:

  1. 监听 datastore:订阅 Node、IPPool、BGPConfiguration 等资源的变化。
  2. 渲染模板:使用预定义的 Go 模板(如 bird.cfg.template)生成 BIRD 配置文件。
  3. 触发重载:通过 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 连接的稳定性直接影响组件间的状态同步速度。

组件间数据流与缓存更新时序 时间 Datastore 资源变更事件 Felix 计算差分规则 内核数据面 iptables / 路由表 confd 渲染 BIRD 配置 BIRD BGP 路由通告 缓存命中故障关键点: ① Felix 未及时处理变更 → 内核规则过期;② confd 重载失败 → BIRD 路由未更新;③ BGP 会话中断 → 路由缓存缺失

3.7 组件协作与缓存命中故障的根因

从上述架构可以看出,一次完整的策略或路由更新需要经过以下链路:

Datastore 变更
  ├─→ Felix 监听 → 计算差分 → 写入 iptables/路由表
  └─→ confd 监听 → 渲染模板 → 触发 BIRD 重载 → BGP 通告

当缓存命中故障发生时,问题通常出现在以下环节:

  • Felix 处理延迟:节点资源紧张或 watch 连接断开,导致 Felix 未能及时拉取最新策略。
  • confd 模板错误:BGP 配置模板语法错误导致重载失败,BIRD 继续使用旧配置。
  • BIRD 会话问题:BGP 会话因网络抖动中断,路由无法及时撤销或更新。
  • Datastore 不一致:etcd 或 K8s API Server 中的数据与节点实际状态出现偏差。