Calico网络接口镜像拉取性能压测 - 第2节
2.1 Calico 架构概述
Calico 是一个基于 BGP(Border Gateway Protocol) 的纯三层网络方案,专为容器、虚拟机与裸金属工作负载设计。其核心设计理念是将每个工作负载(Pod/VM)视为一个独立的网络端点,通过标准路由协议在集群内分发路由信息,从而实现高性能、可扩展的网络连通性与网络策略控制。
Calico 不依赖 Overlay 封装(如 VXLAN)即可实现跨节点通信,在 BGP 模式下具有接近原生网络的性能。其架构由控制平面与数据平面两部分组成,关键组件包括 Felix、BIRD、confd 以及 CNI 插件。
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,无需额外封装。
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) |
| 配置复杂度 | 中等(需对接网络设备) | 低(开箱即用) |
| 典型场景 | 自建数据中心 | 公有云 / 混合云 |
2.3 Felix 与 BIRD 组件
Felix 和 BIRD 是 Calico 数据平面与控制平面的核心执行者,理解它们的工作机制对于容量规划与故障排查至关重要。
2.3.1 Felix:节点代理与策略执行者
Felix 是一个运行在每个节点上的守护进程,负责管理该节点的网络状态。它通过监听 Kubernetes API 或 etcd 获取预期的网络策略与端点信息,并将其转化为底层的系统配置。
- 接口管理: 创建/删除 veth 对,配置 Pod 网络命名空间内的接口。
- 路由管理: 在宿主机路由表中添加/删除 Pod 路由条目。
- 策略执行: 编写 iptables 规则(或 nftables)实现网络策略(NetworkPolicy)的准入/拒绝逻辑。
- 健康检查: 定期上报节点与端点状态至数据存储。
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 的协作流程
- 端点变更: Pod 创建/删除触发 Felix 更新本地路由表与 iptables。
- 路由注入: Felix 将新的 Pod 路由写入内核路由表(如
10.244.1.3/32 dev caliXXXX)。 - BIRD 感知: BIRD 通过内核路由表的变化(或通过 confd 触发的配置重载)感知到新路由。
- BGP 通告: BIRD 将新路由封装为 BGP Update 消息,发送给所有 BGP 对等体。
- 远端接收: 远端节点的 BIRD 收到 Update 后,将路由写入本地内核路由表。
- 数据转发: 远端节点的 Felix 无需额外操作,数据包直接根据路由表转发。