Calico网络接口镜像拉取性能压测 - 第2节

2.1 Calico 架构概述

Calico 是一个基于 BGP(Border Gateway Protocol) 的纯三层网络方案,专为容器、虚拟机与裸金属工作负载设计。其核心设计理念是将每个工作负载(Pod/VM)视为一个独立的网络端点,通过标准路由协议在集群内分发路由信息,从而实现高性能、可扩展的网络连通性与网络策略控制。

Calico 不依赖 Overlay 封装(如 VXLAN)即可实现跨节点通信,在 BGP 模式下具有接近原生网络的性能。其架构由控制平面与数据平面两部分组成,关键组件包括 Felix、BIRD、confd 以及 CNI 插件。

架构要点: Calico 将每个节点视为一个路由器,Pod 的 IP 地址作为可路由的 IP,通过 BGP 协议在集群内同步路由表,无需额外的隧道封装即可实现跨节点通信。

2.1.1 核心组件与职责

组件 部署位置 核心职责
Felix 每个节点(DaemonSet) 管理主机网络接口(veth)、路由表、iptables/ipset 规则,实现网络策略与端点连通性。
BIRD 每个节点(DaemonSet) BGP 路由守护进程,负责在节点间分发路由信息,支持 BGP 模式与 IPIP 模式下的路由学习。
confd 每个节点(DaemonSet) 监听 etcd 或 Kubernetes API 中的 Calico 配置变更,动态生成 BIRD 配置文件并触发重载。
CNI 插件 每个节点(二进制) 实现 Kubernetes CNI 接口,负责 Pod 网络接口的创建、IP 分配与删除。
kube-controllers 集群级(Deployment) 处理策略冲突检测、命名空间隔离、IP 池管理等控制逻辑。

2.1.2 数据流与组件协作

当一个新的 Pod 在节点 A 上创建时,CNI 插件调用 Felix 创建 veth 对,一端放入 Pod 网络命名空间,另一端接入宿主机。Felix 将 Pod IP 写入本地路由表,并更新 iptables 规则。BIRD 通过 BGP 会话将这条路由通告给集群内其他节点。节点 B 收到路由后,将流量直接通过三层路由转发至节点 A 的 Pod,无需额外封装。

Calico 核心组件协作架构 节点 A Felix BIRD confd CNI Pod A 节点 B Felix BIRD confd CNI Pod B BGP 会话 三层路由转发

2.2 BGP 模式与 IPIP 模式

Calico 支持两种主要的跨节点通信模式:BGP 模式(Direct Routing)和 IPIP 模式(Overlay)。选择哪种模式取决于底层网络基础设施是否支持直接路由。

2.2.1 BGP 模式(Direct Routing)

在 BGP 模式下,Calico 将每个节点配置为一个 BGP Speaker,通过 BGP 协议将 Pod 路由直接通告给物理网络中的路由器或交换机。数据包从源 Pod 发出后,经过宿主机路由表直接转发到目标节点,不经过任何隧道封装。

  • 优势: 性能接近原生网络,无封装开销,延迟低,吞吐量高。
  • 前提条件: 底层网络(物理路由器/交换机)必须支持 BGP 协议,且允许 Calico 节点作为 BGP 对等体接入。
  • 适用场景: 自建数据中心、网络团队可配合的网络环境。

2.2.2 IPIP 模式(Overlay)

当底层网络不支持 BGP 或不允许直接路由时,Calico 使用 IPIP 隧道模式。数据包在宿主机上被封装在一个新的 IP 包中(外层 IP 头为节点 IP),通过三层网络传输到目标节点后再解封装。

  • 优势: 不依赖底层网络设备,可在任何 IP 网络上运行,包括公有云环境。
  • 劣势: 存在封装/解封装开销,性能略低于 BGP 模式(约 5%-15% 的吞吐量损失)。
  • 适用场景: 公有云、网络设备不可控、跨子网通信。
对比维度 BGP 模式 IPIP 模式
封装方式 无封装,直接路由 IP over IP 隧道封装
网络依赖 需要底层网络支持 BGP 无特殊要求,仅需 IP 连通
性能 接近原生,无额外开销 有封装开销,性能略低
MTU 要求 标准 MTU(1500) 需降低 MTU(通常 1480)
配置复杂度 中等(需对接网络设备) 低(开箱即用)
典型场景 自建数据中心 公有云 / 混合云
BGP 模式 vs IPIP 模式数据路径对比 BGP 模式(Direct Routing) Pod A Pod B 直接路由 宿主机路由表 + BGP 通告 ✓ 无封装开销 ✓ 低延迟 IPIP 模式(Overlay) Pod A Pod B IPIP 隧道 封装 / 解封装 ✗ 封装开销 ✗ MTU 需降低

2.3 Felix 与 BIRD 组件

Felix 和 BIRD 是 Calico 数据平面与控制平面的核心执行者,理解它们的工作机制对于容量规划与故障排查至关重要。

2.3.1 Felix:节点代理与策略执行者

Felix 是一个运行在每个节点上的守护进程,负责管理该节点的网络状态。它通过监听 Kubernetes API 或 etcd 获取预期的网络策略与端点信息,并将其转化为底层的系统配置。

  • 接口管理: 创建/删除 veth 对,配置 Pod 网络命名空间内的接口。
  • 路由管理: 在宿主机路由表中添加/删除 Pod 路由条目。
  • 策略执行: 编写 iptables 规则(或 nftables)实现网络策略(NetworkPolicy)的准入/拒绝逻辑。
  • 健康检查: 定期上报节点与端点状态至数据存储。
容量规划提示: Felix 的 iptables 规则数量与集群中的 NetworkPolicy 规则数、Pod 数量成正比。当 Pod 密度超过 100 个/节点或策略规则超过 1000 条时,应关注 Felix 的 CPU 与内存消耗,并考虑使用 nftables 后端以提升性能。

2.3.2 BIRD:BGP 路由引擎

BIRD(BIRD Internet Routing Daemon)是 Calico 使用的 BGP 实现,负责在节点之间以及节点与外部网络设备之间交换路由信息。

  • 路由学习: 从 Felix 维护的本地路由表中学习 Pod 路由。
  • 路由分发: 通过 BGP 会话将路由通告给其他节点或 ToR 交换机。
  • 路由聚合: 支持将多个 Pod CIDR 聚合为更少的路由条目,减少路由表规模。
  • 故障收敛: 当节点或 Pod 发生故障时,BIRD 快速撤销对应路由,保障网络收敛速度。

2.3.3 Felix 与 BIRD 的协作流程

  1. 端点变更: Pod 创建/删除触发 Felix 更新本地路由表与 iptables。
  2. 路由注入: Felix 将新的 Pod 路由写入内核路由表(如 10.244.1.3/32 dev caliXXXX)。
  3. BIRD 感知: BIRD 通过内核路由表的变化(或通过 confd 触发的配置重载)感知到新路由。
  4. BGP 通告: BIRD 将新路由封装为 BGP Update 消息,发送给所有 BGP 对等体。
  5. 远端接收: 远端节点的 BIRD 收到 Update 后,将路由写入本地内核路由表。
  6. 数据转发: 远端节点的 Felix 无需额外操作,数据包直接根据路由表转发。
Felix 与 BIRD 协作流程 1. Pod 创建/删除 Felix 感知变更 2. 更新路由表 Felix 写入内核 3. BIRD 感知 路由变更事件 4. BGP Update 通告至所有对等体 5. 远端 BIRD 接收 写入远端内核路由表 6. 数据转发 直接三层路由转发
容量规划关注点: BIRD 的 BGP 会话数量与集群节点数直接相关。在超过 500 节点的集群中,BIRD 的 CPU 和内存消耗会显著上升,建议启用 BGP 路由反射器(Route Reflector)模式来减少 BGP 会话数,并合理配置路由聚合以控制路由表规模。