本文介绍 Calico 常见网络模式,包括 IPIP、BGP、VXLAN、CrossSubnet 以及 eBPF 数据面,并结合 IPPool 配置说明如何查看和切换模式。
Calico 是一个开源的 CNI 解决方案,主要用于 Kubernetes 和 Docker 环境,提供高性能、高可扩展性的网络和网络安全策略。
在 Calico 中,不同的网络模式决定了 Pod 跨节点通信时采用何种转发方式:是直接路由、IP-in-IP 封装,还是 VXLAN 封装。不同模式在性能、底层网络依赖和适用场景上差异较大。
一、Calico 常见网络模式对比
| 模式 | 封装方式 | 性能 | 适用场景 | 依赖条件 |
|---|---|---|---|---|
| IPIP | IP-in-IP 封装 | 中 | 公有云(AWS、GCP 等) | 底层网络允许 IP-in-IP |
| BGP | 无封装,纯路由 | 高 | 裸金属、私有云 | 网络支持 BGP |
| VXLAN | VXLAN 封装 | 中 | 受限网络、防火墙限制场景 | 内核支持 VXLAN |
| CrossSubnet | 同子网直连,跨子网封装 | 较高 | 混合云、跨子网环境 | 支持 BGP 路由 |
| eBPF | 无封装,eBPF 加速 | 极高 | 高性能需求 | Linux 4.18+,内核支持 eBPF |
说明:eBPF 更准确地说是 Calico 的一种数据面实现,而不是单纯的封装模式。它可以和 Kubernetes Service 转发等能力结合使用。
二、查看当前 Calico 网络模式
Calico 的网络模式主要通过IPPool资源中的ipipMode和vxlanMode字段控制。
查看命令:
kubectl get ippool -o yaml如果已经安装calicoctl,也可以使用:
calicoctl get ippool -o wide示例输出整理后如下:
apiVersion: projectcalico.org/v3 kind: IPPool metadata: name: default-ipv4-ippool creationTimestamp: "2024-11-29T01:39:18Z" resourceVersion: "1000" uid: c88c4c71-e0a1-49f1-b020-8df6700a975f spec: allowedUses: - Workload - Tunnel blockSize: 26 cidr: 10.119.0.0/22 ipipMode: Never natOutgoing: true nodeSelector: all() vxlanMode: Never关键字段说明:
| 字段 | 说明 |
|---|---|
cidr | Calico 分配给 Pod 的地址池 |
ipipMode | IPIP 模式,可选Always、CrossSubnet、Never |
vxlanMode | VXLAN 模式,可选Always、CrossSubnet、Never |
natOutgoing | Pod 访问集群外时是否做 SNAT |
blockSize | 每个节点分配的地址块大小 |
nodeSelector | IPPool 适用的节点范围 |
三、IPIP 模式
IPIP 模式通过 IP-in-IP 隧道封装跨节点流量,把原始 IP 包封装在一个外层 IP 包中。
配置示例:
spec: cidr: 10.119.0.0/22 ipipMode: Always vxlanMode: Never natOutgoing: true特点:
- 使用 IP-in-IP 封装,需要底层网络允许 IP-in-IP 协议。
- 相比 BGP 多一层封装,性能中等。
- 配置简单,适合公有云等不方便使用 BGP 的环境。
- 常见于 AWS、GCP 等云平台环境。
四、BGP 模式
BGP 模式下 Calico 不进行隧道封装,而是通过 BGP 发布 Pod 路由,让节点之间直接路由 Pod 网段。
配置示例:
spec: cidr: 10.119.0.0/22 ipipMode: Never vxlanMode: Never natOutgoing: true特点:
- 无封装,几乎没有额外隧道开销,性能高。
- 需要底层网络支持 BGP,或者能够与 Calico 建立 BGP 邻居。
- 适合裸金属、私有云以及网络可控的数据中心环境。
- 如果底层网络无法识别 Pod CIDR,通常需要结合
natOutgoing: true使用。
五、VXLAN 模式
VXLAN 模式通过 VXLAN 隧道封装跨节点流量,是 Overlay 网络中比较常见的一种方式。
配置示例:
spec: cidr: 10.119.0.0/22 ipipMode: Never vxlanMode: Always natOutgoing: true特点:
- 使用 VXLAN 封装,通常依赖 UDP 4789 端口。
- 适合防火墙限制 IP-in-IP 或不允许 BGP 的环境。
- 相比 IPIP,包头开销更大一些。
- 需要内核支持 VXLAN。
六、CrossSubnet 混合模式
CrossSubnet 也叫跨子网模式,可以理解为“同子网直连、跨子网封装”。
在相同子网内,节点之间直接通过 BGP 路由通信;跨子网时,再使用 IPIP 或 VXLAN 封装。
IPIP CrossSubnet 示例:
spec: cidr: 10.119.0.0/22 ipipMode: CrossSubnet vxlanMode: Never natOutgoing: trueVXLAN CrossSubnet 示例:
spec: cidr: 10.119.0.0/22 ipipMode: Never vxlanMode: CrossSubnet natOutgoing: true适用场景:
- 混合云环境。
- 集群节点分布在同一子网的不同网段。
- 希望减少同子网通信的封装开销。
注意:CrossSubnet 不是独立的封装协议,而是 IPIP 或 VXLAN 的一种工作模式。
七、eBPF 数据面
eBPF 模式使用 eBPF 技术加速数据面转发,通常用于对性能和可观测性要求较高的场景。
eBPF 不是一种封装协议,它主要替换或增强 Calico 的数据面转发能力,在某些场景下可以替代 kube-proxy。
如果使用 Calico Operator 安装,可以通过Installation资源切换数据面:
kubectl patch installation default --type=merge -p '{"spec":{"calicoNetwork":{"linuxDataplane":"BPF"}}}'查看配置:
kubectl get installation default -o yaml | grep linuxDataplane特点:
- 性能高,转发路径短。
- 对内核版本有要求,一般需要 Linux 4.18+。
- 不同 Calico 版本和 Kubernetes 版本的兼容性不同,切换前需要确认官方文档。
- 生产环境切换 eBPF 前,建议先在测试环境验证。
另外,原文中记录了一条 KubeControllersConfiguration 的 patch 命令,修正后的calicoctl语法如下:
calicoctl patch kubecontrollersconfiguration default \ --patch='{"spec":{"controllers":{"node":{"hostEndpoint":{"autoCreate":"Enabled"}}}}}'注意:这条命令用于调整 Calico 控制器配置,并不等同于开启 eBPF 数据面,两者不要混淆。
八、如何修改 Calico 网络模式
可以通过编辑IPPool修改网络模式。
kubectl edit ippool default-ipv4-ippool例如,将 IPIP 改为 Always:
spec: ipipMode: Always vxlanMode: Never修改后查看 IPPool:
calicoctl get ippool -o wide检查 Calico 节点和 Pod 状态:
kubectl get pods -A -o wide calicoctl node status注意:修改网络模式可能会影响现有 Pod 的跨节点通信,生产环境建议在维护窗口内操作,并提前做好验证和回滚方案。
九、模式选型建议
| 场景 | 推荐模式 |
|---|---|
| 公有云、底层不允许 BGP | IPIP |
| 裸金属、私有云、网络可控 | BGP |
| 防火墙受限、不允许 IP-in-IP | VXLAN |
| 同子网优先直连、跨子网封装 | IPIP/VXLAN CrossSubnet |
| 高性能、内核版本满足要求 | eBPF |
实际选择时建议重点确认三点:
- 底层网络是否允许 IP-in-IP 或 VXLAN。
- 网络设备是否支持 BGP,以及能否与 Calico 建立邻居。
- 当前内核版本、Calico 版本和 Kubernetes 版本是否兼容目标模式。
十、总结
Calico 提供了 IPIP、BGP、VXLAN、CrossSubnet 以及 eBPF 等多种数据转发方式:
- 想要配置简单、兼容公有云,可以选择 IPIP。
- 追求高性能、网络可控,可以选择 BGP。
- 网络受限、防火墙严格,可以选择 VXLAN。
- 同子网直连、跨子网封装,可以选择 CrossSubnet。
- 追求高性能和先进数据面能力,可以评估 eBPF。
最终选择哪种模式,需要结合底层网络能力、性能要求和运维复杂度综合判断。
如果这篇文章对你有帮助,欢迎点赞、收藏、评论交流。