3. CNI插件深度解析(上):Calico架构、BGP模式与IPIP模式原理、Felix与Bird组件交互
Calico 是 Kubernetes 生态中最流行的 CNI 插件之一,以其纯三层网络模型和高性能著称。本章深入解析 Calico 的核心架构、两种主要数据平面模式(BGP 与 IPIP)的原理,以及 Felix 与 BIRD 组件的交互机制。
3.1 Calico 整体架构
Calico 采用分布式架构,每个节点上运行一组代理组件,通过 etcd 或 Kubernetes API 进行状态同步。其核心组件包括:
- Felix:运行在每个节点上的守护进程,负责管理网络接口、路由规则和 iptables/ipset 策略。
- BIRD:BGP 路由协议实现,负责在节点间分发路由信息。
- confd:动态配置管理工具,监控 etcd 或 Kubernetes API 中的配置变更,并更新 BIRD 配置。
- Dikastes:用于 Istio 集成,将 Calico 网络策略转换为 Envoy 可理解的格式。
- CNI 插件:负责 Pod 网络接口的创建与配置。
架构要点:Calico 不依赖 Overlay 网络(默认模式),每个 Pod 分配一个可路由的 IP 地址,通过 BGP 协议在节点间直接交换路由,实现高性能的三层转发。
3.2 BGP 模式原理
BGP(Border Gateway Protocol)模式是 Calico 的默认数据平面模式,利用标准 BGP 协议在节点间交换 Pod 网段路由。
3.2.1 核心机制
- 每个节点作为一个 BGP Speaker:运行 BIRD 进程,与集群内其他节点建立 BGP 会话。
- Pod CIDR 路由通告:每个节点将其负责的 Pod CIDR 段(如 10.0.1.0/24)通过 BGP 通告给其他节点。
- 直连路由:节点收到对端 Pod CIDR 路由后,直接写入内核路由表,数据包无需封装直接转发。
- 两种拓扑模式:
- Full Mesh(全互联):每个节点与所有其他节点建立 BGP 会话,适用于小规模集群(< 50 节点)。
- Route Reflector(路由反射器):指定部分节点作为 Route Reflector,其他节点只与 Reflector 建立会话,适用于大规模集群。
3.2.2 BGP 模式优缺点
| 维度 | 说明 |
|---|---|
| 性能 | 无封装开销,接近原生网络性能,延迟最低 |
| 复杂度 | 需要物理网络支持 BGP 路由协议,对网络设备有要求 |
| 可扩展性 | Full Mesh 模式下节点数受限,建议使用 Route Reflector |
| 适用场景 | 物理网络支持 BGP、对性能要求高的生产环境 |
关键限制:BGP 模式要求底层网络设备(交换机/路由器)能够处理大量 BGP 路由条目。如果网络设备不支持或路由表容量不足,应选择 IPIP 模式。
3.3 IPIP 模式原理
IPIP(IP in IP)模式是一种 Overlay 网络方案,将 Pod 数据包封装在另一个 IP 包中传输,解决底层网络不支持 BGP 或路由隔离的问题。
3.3.1 封装与解封装流程
- 源 Pod 发送数据包:目标 IP 为对端 Pod IP(如 10.0.2.2)。
- 节点路由查找:根据路由表,发现目标 IP 属于对端节点,需要走 IPIP 隧道。
- IPIP 封装:在原始 IP 包外添加新 IP 头,源 IP 为本地节点 IP,目标 IP 为对端节点 IP。
- 物理网络转发:封装后的数据包通过物理网络路由到对端节点。
- 解封装:对端节点收到后,剥离外层 IP 头,还原原始数据包。
- 交付目标 Pod:根据内层目标 IP,将数据包转发给目标 Pod。
3.3.2 IPIP 模式优缺点
| 维度 | 说明 |
|---|---|
| 兼容性 | 不依赖底层网络支持 BGP,可在任何 IP 网络上运行 |
| 性能 | 有封装/解封装开销,性能比 BGP 模式低 5%-15% |
| MTU 问题 | 额外 20 字节头部,需调整 MTU 或启用 MSS 钳制 |
| 适用场景 | 云环境、网络设备不支持 BGP、跨子网通信 |
3.4 Felix 与 BIRD 组件交互
Felix 和 BIRD 是 Calico 节点上最核心的两个组件,它们分工明确且紧密协作。
3.4.1 Felix 职责
- 接口管理:创建/删除 veth pair,将 Pod 端接入 caliXXX 接口。
- 路由编程:将本地 Pod 的路由写入内核路由表(如 10.0.1.2 dev caliXXX)。
- 策略实施:通过 iptables/ipset 实现 NetworkPolicy 规则。
- 健康检查:监控接口和路由状态,上报节点健康信息。
3.4.2 BIRD 职责
- BGP 会话管理:与对端节点或 Route Reflector 建立/维护 BGP 会话。
- 路由分发:将 Felix 写入内核的 Pod 路由通过 BGP 通告给其他节点。
- 路由接收:接收对端通告的 Pod 路由,写入内核路由表。
- 路由过滤:根据配置策略过滤不必要的路由。
3.4.3 交互流程
- Pod 创建事件:Kubelet 调用 Calico CNI 插件,CNI 插件通过 Felix API 通知 Felix。
- Felix 配置接口:Felix 创建 veth pair,将 Pod 端接入,分配 IP 地址。
- Felix 写入路由:Felix 将 Pod IP 对应的路由写入内核路由表(如 10.0.1.0/24 dev eth0)。
- confd 检测变更:confd 监控到 Felix 写入的路由变更,更新 BIRD 配置文件。
- BIRD 重载配置:BIRD 读取新配置,将新增路由通过 BGP 会话通告给其他节点。
- 对端 BIRD 接收:对端节点 BIRD 收到路由更新,写入内核路由表。
- 数据面就绪:两个节点之间完成路由同步,Pod 间通信路径建立。
关键交互点:Felix 负责“本地路由编程”,BIRD 负责“路由跨节点分发”。Felix 不直接与 BIRD 通信,而是通过内核路由表作为中间桥梁。confd 作为配置转换器,将 Felix 的状态变化转换为 BIRD 可理解的 BGP 配置。
3.4.4 组件交互示意图
3.5 模式选择对比
| 对比维度 | BGP 模式 | IPIP 模式 |
|---|---|---|
| 网络性能 | 原生性能,无额外开销 | 有封装开销,性能略低 |
| 底层依赖 | 需要网络设备支持 BGP | 仅需 IP 可达 |
| MTU 要求 | 标准 MTU (1500) | 需降低 MTU 至 1480 |
| 路由条目 | 每个 Pod CIDR 一条路由 | 每个节点一条隧道路由 |
| 故障排查 | 依赖 BGP 会话状态 | 依赖隧道接口状态 |
| 推荐场景 | 自建机房、高性能场景 | 公有云、混合云、跨子网 |
生产建议:在物理网络支持 BGP 的环境中,优先选择 BGP 模式以获得最佳性能。在公有云或网络设备受限的环境中,使用 IPIP 模式并注意 MTU 配置。两种模式可以在集群中混合使用,通过 IPPool 资源为不同命名空间或节点组指定不同的封装模式。