
本文介绍 Calico 常见网络模式包括 IPIP、BGP、VXLAN、CrossSubnet 以及 eBPF 数据面并结合 IPPool 配置说明如何查看和切换模式。Calico 是一个开源的 CNI 解决方案主要用于 Kubernetes 和 Docker 环境提供高性能、高可扩展性的网络和网络安全策略。在 Calico 中不同的网络模式决定了 Pod 跨节点通信时采用何种转发方式是直接路由、IP-in-IP 封装还是 VXLAN 封装。不同模式在性能、底层网络依赖和适用场景上差异较大。一、Calico 常见网络模式对比模式封装方式性能适用场景依赖条件IPIPIP-in-IP 封装中公有云AWS、GCP 等底层网络允许 IP-in-IPBGP无封装纯路由高裸金属、私有云网络支持 BGPVXLANVXLAN 封装中受限网络、防火墙限制场景内核支持 VXLANCrossSubnet同子网直连跨子网封装较高混合云、跨子网环境支持 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关键字段说明字段说明cidrCalico 分配给 Pod 的地址池ipipModeIPIP 模式可选Always、CrossSubnet、NevervxlanModeVXLAN 模式可选Always、CrossSubnet、NevernatOutgoingPod 访问集群外时是否做 SNATblockSize每个节点分配的地址块大小nodeSelectorIPPool 适用的节点范围三、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 --typemerge -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 改为 Alwaysspec: ipipMode: Always vxlanMode: Never修改后查看 IPPoolcalicoctl get ippool -o wide检查 Calico 节点和 Pod 状态kubectl get pods -A -o wide calicoctl node status注意修改网络模式可能会影响现有 Pod 的跨节点通信生产环境建议在维护窗口内操作并提前做好验证和回滚方案。九、模式选型建议场景推荐模式公有云、底层不允许 BGPIPIP裸金属、私有云、网络可控BGP防火墙受限、不允许 IP-in-IPVXLAN同子网优先直连、跨子网封装IPIP/VXLAN CrossSubnet高性能、内核版本满足要求eBPF实际选择时建议重点确认三点底层网络是否允许 IP-in-IP 或 VXLAN。网络设备是否支持 BGP以及能否与 Calico 建立邻居。当前内核版本、Calico 版本和 Kubernetes 版本是否兼容目标模式。十、总结Calico 提供了 IPIP、BGP、VXLAN、CrossSubnet 以及 eBPF 等多种数据转发方式想要配置简单、兼容公有云可以选择 IPIP。追求高性能、网络可控可以选择 BGP。网络受限、防火墙严格可以选择 VXLAN。同子网直连、跨子网封装可以选择 CrossSubnet。追求高性能和先进数据面能力可以评估 eBPF。最终选择哪种模式需要结合底层网络能力、性能要求和运维复杂度综合判断。如果这篇文章对你有帮助欢迎点赞、收藏、评论交流。