非 Overlay 扁平网络 Calico
Calico 原意为"有斑点的",如果说一只猫为 calico cat 的话,就是说这是只花猫,也叫三色猫,所以 Calico 的 logo 是只三色猫。Calico 是一个开源的云原生网络和网络安全解决方案,为容器、虚拟机和基于主机的工作负载提供网络连接和网络安全策略。

核心特性
Calico 创建和管理一个扁平的三层网络(不需要 overlay),每个容器会分配一个可路由的 IP。由于通信时不需要解包和封包,网络性能损耗小,易于排查,且易于水平扩展。
主要特性包括:
- 高性能网络:基于标准 Linux 网络栈,支持 eBPF 和 XDP 加速
- 扁平网络架构:无需 overlay 网络,减少网络延迟和复杂性
- 灵活的网络策略:支持 Kubernetes NetworkPolicy 和 Calico 扩展策略
- 多种数据平面:支持 iptables、IPVS 和 eBPF 数据平面
- 跨平台支持:支持 Kubernetes、OpenShift、Docker、OpenStack 等平台
小规模部署时可以通过 BGP client 直接互联,大规模部署可通过指定的 BGP Route Reflector 来完成,确保所有数据流量都通过 IP 路由的方式完成互联。
架构概览
Calico 采用分布式架构,由多个组件协同工作,在部署时部分组件是可选的。

核心组件
Felix
Felix 是 Calico 的核心代理,以 DaemonSet 形式在每个节点上运行,负责:
- 接口管理:配置虚拟网卡和路由表,确保容器网络接口正确配置
- 路由编程:将本节点的端点路由信息写入 Linux 内核 FIB
- 安全策略执行:通过 iptables 或 eBPF 程序实施网络安全策略
- 状态上报:监控网络健康状态并上报异常
Calico API Server
Calico API Server 提供 Kubernetes 原生的 API 接口,让用户可以:
- 使用
kubectl
直接管理 Calico 资源 - 享受 Kubernetes RBAC 和审计功能
- 集成现有的 Kubernetes 工具链
BIRD
BGP Internet Routing Daemon (BIRD) 负责路由发现和分发:
- 路由分发:将本节点的路由信息通过 BGP 协议分发给其他节点
- 路由学习:从其他节点学习路由信息并更新本地路由表
- BGP 对等:与其他 BIRD 实例或网络设备建立 BGP 会话
Typha
Typha 是一个可选的扩展组件,主要用于大规模集群:
- 连接代理:代理 Felix 与数据存储的连接,减少数据存储负载
- 事件分发:缓存和过滤数据存储事件,减少不必要的网络传输
- 性能优化:在超过 100 个节点的集群中显著提升性能
插件组件
CNI 插件
Calico CNI 插件实现容器网络接口规范:
- IP 地址分配:为新创建的 Pod 分配 IP 地址
- 网络接口配置:创建和配置 veth pair 等网络接口
- 路由配置:配置容器到主机的路由规则
IPAM 插件
IP 地址管理插件负责:
- IP 池管理:管理可分配的 IP 地址池
- 地址分配:为 Pod 分配唯一的 IP 地址
- 地址回收:回收已删除 Pod 的 IP 地址
控制器组件
kube-controllers
监控 Kubernetes API 变化并执行相应操作的控制器集合:
- Policy Controller:将 Kubernetes NetworkPolicy 转换为 Calico 策略
- Namespace Controller:管理命名空间相关的网络配置
- Node Controller:监控节点状态和网络配置
- WorkloadEndpoint Controller:管理工作负载端点信息
confd
轻量级配置管理工具:
- 配置同步:监控数据存储中的配置变化
- 动态更新:自动生成和更新 BIRD 配置文件
- 服务重载:在配置变化时自动重启相关服务
数据存储
Calico 支持两种数据存储方式:
Kubernetes API Datastore (KDD)
使用 Kubernetes API 作为数据存储的优势:
- 简化管理:无需额外的数据存储组件
- 集成 RBAC:利用 Kubernetes 的权限控制机制
- 审计日志:利用 Kubernetes 的审计功能
etcd
独立的 etcd 集群提供:
- 跨平台支持:支持非 Kubernetes 环境
- 关注点分离:独立扩展网络数据存储
- 混合部署:支持多集群和裸机混合场景
可选组件
Dikastes
服务网格策略执行组件:
- 七层策略:执行应用层网络策略
- Istio 集成:作为 Envoy Sidecar 运行
- 加密认证:提供请求级别的安全控制
calicoctl
命令行管理工具:
- 资源管理:创建、查看、更新 Calico 资源
- 故障诊断:提供网络诊断和调试功能
- 配置导入导出:支持配置的备份和迁移
数据平面技术
eBPF 数据平面
Calico 支持基于 eBPF 的高性能数据平面:
- 内核级处理:在内核空间处理网络包,避免用户空间开销
- 更好的性能:相比 iptables 提供更低的延迟和更高的吞吐量
- 源 IP 保持:支持保持原始源 IP 地址
iptables 数据平面
传统的基于 iptables 的数据平面:
- 成熟稳定:经过长期验证的网络处理方式
- 广泛支持:在各种 Linux 发行版上都有很好的支持
- 调试友好:使用标准的 Linux 网络工具进行调试
网络策略
Calico 提供强大的网络安全策略功能:
Kubernetes NetworkPolicy
完全兼容 Kubernetes 原生的 NetworkPolicy:
- 入站规则:控制进入 Pod 的流量
- 出站规则:控制从 Pod 发出的流量
- 标签选择器:基于标签进行流量控制
Calico 扩展策略
提供更丰富的策略功能:
- 全局网络策略:跨命名空间的策略控制
- 主机端点策略:保护主机网络接口
- 服务策略:基于 Kubernetes Service 的策略
- 七层策略:应用层协议的流量控制
部署模式
BGP 网络模式
- Full Mesh:所有节点之间建立 BGP 会话
- Route Reflector:通过路由反射器减少 BGP 会话数量
- AS Per Rack:为每个机架分配独立的 AS 号
网络拓扑
- 扁平网络:所有 Pod 在同一个大二层网络中
- 分段网络:根据命名空间或其他标准进行网络分段
- 跨云部署:支持多云和混合云环境