必须用bgp模式的场景是集群节点跨子网且能控制网络设备或部署route reflector;此时需禁用ipip/vxlan,依赖底层bgp支持,否则连接失败。

什么时候必须用 BGP 模式
BGP 模式不是“更高级”的选项,而是 Calico 在三层网络中绕过隧道、直接复用物理网络路由能力的唯一方式。它不封装报文,靠节点间建立 BGP 邻居宣告 Pod 网段路由,依赖底层网络支持 BGP 或有 Route Reflector。
常见错误现象:calico/node 容器日志反复出现 Failed to establish BGP connection,但 calicoctl node status 显示 BGP 为 NotEstablished —— 很可能是因为交换机没开 BGP,或节点间 TCP 179 端口被拦截。
- 必须用 BGP 的场景:集群节点分布在不同子网(跨机房/跨 AZ),且你已控制网络设备(如 ToR 交换机)或能部署 Route Reflector
- 不能用 BGP 的典型情况:云厂商 VPC 内默认不开放 BGP,AWS/Azure/GCP 的托管 K8s(EKS/AKS/GKE)基本无法原生启用全量 BGP
- BGP 模式下
ipipMode和vxlanMode必须设为Never,否则 Calico 会降级走隧道,失去直通意义
IPIP 封装只在 IPv4 单栈且跨子网时才有效
IPIP 是 Calico 最老的隧道模式,仅支持 IPv4,且仅在源节点和目的节点不在同一二层网络(node-to-node mesh 判定失败)时触发。它不加密、无校验、头部开销小(20 字节),但内核需加载 ipip 模块。
常见错误现象:Pod 能通同节点其他 Pod,但跨节点始终超时;ip tunnel show 查不到 ipip0 接口;calicoctl get ippool -o wide 中某 IP Pool 的 ipipMode 是 Disabled 或 Never。
- 启用 IPIP 前先确认:所有节点
ip route get返回的 dev 不是lo或docker0,且不在同一 CIDR —— 否则 Calico 认为“可达”,跳过隧道 -
ipipMode: Always强制所有流量走 IPIP,哪怕节点在同一子网,这会引入不必要的封装/解封开销,别乱开 - 某些发行版(如 RHEL 8.5+)默认不自动加载
ipip模块,需手动modprobe ipip并写入/etc/modules-load.d/ipip.conf
VXLAN 模式要小心 UDP 端口与 MTU
VXLAN 封装比 IPIP 更通用:支持 IPv6、兼容性更好、内核模块 vxlan 几乎默认加载。但它基于 UDP(默认端口 8472),受防火墙、NAT、UDP 分片影响更大。
常见错误现象:Pod 间偶尔丢包、ping 延迟抖动大;tcpdump -i any port 8472 抓不到 VXLAN 包;ethtool -k <iface></iface> 显示 tx offload 开启导致 VXLAN 外层校验和错误。
- VXLAN 模式下必须统一集群所有节点的 MTU:物理网卡 MTU 若为
1500,VXLAN 接口 MTU 应设为1450(预留 50 字节头),否则大包被静默丢弃 - 云环境若用了安全组,确保放行 UDP
8472(不只是 TCP);NAT 网关可能对 VXLAN-encapsulated UDP 做异常处理,测试前先关掉 SNAT 规则 -
vxlanMode: Always和vxlanMode: CrossSubnet行为差异极大:后者只在跨子网时封装,同子网走二层转发,性能更好,推荐优先选
混用模式会导致路由混乱
Calico 允许不同 IP Pool 配不同封装模式,但实际中极少需要。一旦混用,calico/node 会为每个 Pool 创建独立的隧道接口(如 vxlan.calico、ipip0),而 Linux 路由表按目标地址最长匹配,容易因顺序或 metric 导致流量误入非预期隧道。
最常被忽略的一点:Kubernetes Service 的 ClusterIP 流量不走 Calico 隧道,但 NodePort/LoadBalancer 类型的流量会——如果某节点上同时存在 IPIP 和 VXLAN Pool,而该节点又作为 NodePort 入口,后端 Pod 恰好落在另一封装模式的 Pool 中,就可能触发跨隧道转发,延迟翻倍且难排查。
- 生产环境强烈建议全集群统一一种封装模式,不要为“兼容旧节点”留 IPIP + 新节点切 VXLAN
- 升级封装模式时,必须滚动重启
calico/nodeDaemonSet,并确认calicoctl get ippool -o wide所有 Pool 的ipipMode/vxlanMode已同步变更 - 任何模式切换后,务必检查
ip route show table all | grep -E "(vxlan|ipip|bird)",确认没有残留的旧隧道路由










