一、Calico 核心概念与特性
什么是 Calico?
Calico 是一套开源的网络和网络安全方案,专为容器、虚拟机和宿主机之间的网络连接设计,可无缝集成于 Kubernetes、OpenShift、DockerEE、OpenStack 等平台。其核心特点是采用纯三层网络架构,通过路由规则而非 Overlay 隧道控制报文流向,大幅减少额外开销。
核心优势
- 高性能:基于原生 TCP/IP 协议栈,无 Overlay 封装开销,转发效率高
- 可扩展性:采用与互联网相同的 BGP 路由协议,天然支持大规模集群
- 易调试性:无隧道封装,网络路径清晰,可直接在主机上进行调试
- 低依赖性:仅需三层路由可达,适配 VM、容器、物理机等混合环境
- 安全可控:支持细粒度的网络策略(ACL 规则)实现访问控制
主要局限
- 路由规模限制:路由数量与容器数量一致,可能超过网络设备处理能力
- 运维复杂度:节点上会生成大量 iptables 规则和路由表项,排障难度较高
- 功能限制:不支持 VPC,容器 IP 只能从 Calico 指定网段分配,无流量控制功能
- BGP 规模依赖:网络扩张受限于 BGP 协议的最大支持规模
二、Calico 架构与核心组件
Calico 的架构围绕 "纯三层路由 + BGP 协议" 设计,核心组件协同工作实现网络连通与策略控制:
| 组件 | 功能说明 |
|---|---|
| Felix | 运行在每个节点的核心组件,负责接口管理(配置主机 endpoint 流量处理)、路由规则维护(写入内核 FIB 转发信息库)、ACL 规则管理(写入内核确保安全策略)及状态报告(向 etcd 反馈网络健康状态) |
| Etcd | 分布式数据库,存储集群路由信息和网络策略,保证数据一致性,建议至少 3 节点部署以提高容错性 |
| Orchestrator Plugin | 协调器插件(如 Kubernetes CNI 插件),实现 Calico 与容器平台的无缝集成 |
| BIRD | BGP 客户端,运行在每个节点,读取 Felix 维护的路由信息并通过 BGP 协议在集群内分发 |
| BGP Router Reflector (RR) | 解决大规模集群中 BGP 连接数爆炸问题,所有节点仅与 RR 同步路由,减少连接数(替代全互联模式) |
| Calicoctl | Calico 命令行管理工具,用于配置和监控集群网络 |
组网核心原理
Calico 将每个节点的操作系统协议栈视为 "虚拟路由器",容器作为连接在路由器上的终端,通过 BGP 协议在路由器之间交换路由信息:
- 每个容器 / 虚拟机分配唯一的 workload-endpoint(网络端点)
- 节点通过 BGP 协议向集群宣告:"某 IP / 网段在我这里,下一跳是我的 IP"
- 所有节点通过 BGP 学习到全网路由,从而实现跨节点通信
三、Calico 网络模式详解
Calico 提供两种主要网络模式,适用于不同的网络环境:
1. BGP 模式:高效的原生路由
BGP(边界网关协议)是互联网核心路由协议,Calico 通过 BGP 自动维护集群路由信息,与 Flannel 的 host-gw 模式原理类似,但路由同步更自动化。
BGP 部署模式:
- 全互联模式(Node-to-Node Mesh):所有节点两两建立 BGP 连接,路由直接交换。优点是简单,缺点是连接数随节点数呈 N² 增长,适合节点数 < 100 的集群。
- 路由反射模式(RR):指定 1 个或多个节点作为路由反射器,其他节点仅与 RR 建立连接并同步路由。解决大规模集群连接数爆炸问题,建议生产环境采用(至少 2 个 RR 节点保证高可用)。
2. IPIP 模式:跨网段的隧道方案
IPIP 是 Linux 内核的隧道技术,将 IP 包封装在另一个 IP 包中(类似 "IP 层网桥"),解决跨网段通信问题。
工作流程:
- 容器数据包到达主机后,由 IPIP 驱动(tunl0 设备)封装,源 / 目的 IP 替换为主机 IP
- 封装后的数据包通过物理网络路由到目标节点
- 目标节点解封装,还原原始 IP 包并转发到目标容器
模式对比
| 维度 | BGP 模式 | IPIP 模式 |
|---|---|---|
| 流量处理 | 路由直接转发,无封装 | tunl0 设备封装 / 解封装 |
| 适用场景 | 同网段集群,大型网络 | 跨网段集群 |
| 效率 | 高(原生路由) | 略低(需封装) |
| 网络类型 | Underlay(底层网络) | Overlay(叠加网络) |
四、Pod 通信流程深度解析
1. 同一节点内 Pod 通信
无需经过物理网络,完全依赖主机内核路由:
- Pod1 通过 vEth pair(一端在 Pod 内为 eth0,另一端在主机为 caliXXX)将数据包发送到主机
- 主机查询路由表,发现目标 Pod2 的 IP 对应本地 cali 设备
- 数据包通过对应 cali 设备转发到 Pod2 的 eth0
2. 不同节点间 Pod 通信
依赖 BGP 路由同步和物理网络:
- Pod1 数据包通过 vEth 到达 Node-A 主机
- Node-A 查询路由表(由 BGP 同步),发现目标 Pod2 所在网段的下一跳是 Node-B 的主机 IP
- 数据包通过 Node-A 的物理网卡发送到物理网络,路由至 Node-B
- Node-B 接收后查询本地路由表,通过对应 cali 设备转发到 Pod2
- 回复包按反向路径返回
BGP 在跨节点通信中的核心作用
- 路由宣告:每个节点的 Felix 将本地 Pod 网段信息写入 BIRD
- 路由交换:BIRD 通过 BGP 协议将路由信息宣告给其他节点或 RR
- 路由学习:接收节点学习到路由后更新内核路由表
- 动态维护:Felix 持续监控并更新路由,确保正确性
五、总结
Calico 凭借纯三层架构和 BGP 协议,在 Kubernetes 网络方案中展现出高性能、可扩展的优势,尤其适合对网络效率和大规模集群有需求的场景。其核心价值在于:
- 摒弃 Overlay 隧道,依赖原生路由和 BGP 协议,减少性能损耗
- 支持细粒度网络策略,满足安全隔离需求
- 灵活的部署模式(BGP 全互联 / RR、IPIP),适配不同网络环境
无论是中小规模集群的全互联部署,还是大规模集群的路由反射模式,Calico 都能通过简洁的设计提供稳定高效的网络能力,是容器网络方案的优质选择。