【k8s】K8s网络打通:CalicoBGP模式对接OpenWrt/FRR实战
0. 背景与痛点默认情况下Calico 采用Node-to-Node Mesh模式Pod 流量在宿主机间通过 IPIP 或 VXLAN 封包传输。这导致了包头损耗且集群外的设备如手机、PC无法直连 Pod IP。本篇目标通过 BGP 协议将 Pod 路由同步到核心路由器OpenWrt关闭 Mesh 冗余连接实现内网全 VLAN 与 Pod 网段的三层直连。1. 环境信息K8s Node (OMEN):192.168.1.15(AS: 64512)OpenWrt (FRR):192.168.1.1(AS: 65001)Pod CIDR:10.244.x.x/262. K8s 侧配置身份确立与策略下发2.1 强制网卡绑定避坑必做如果宿主机存在 WireGuard (sky) 等虚拟网卡Calico 启动时可能误选 BGP 源 IP导致邻居建立失败。必须强制绑定物理网卡kubectlsetenvdaemonset/calico-node-nkube-systemIP_AUTODETECTION_METHODinterfaceenp60s02.2 安装 calicoctl操作 Calico 的 BGP 资源需要用到专门的客户端工具curl-Lhttps://github.com/projectcalico/calico/releases/latest/download/calicoctl-linux-amd64-ocalicoctlchmodx calicoctlsudomvcalicoctl /usr/local/bin/2.3 关闭 Node-to-Node Mesh这是架构优化的核心。关闭 Mesh 可以防止节点间建立冗余的蜘蛛网连接让 OpenWrt 成为唯一的路由中枢类似 Route Reflector 角色。# 修改默认 BGP 配置calicoctl patch bgpconfig default-p{spec: {nodeToNodeMeshEnabled: false, asNumber: 64512}}--allow-version-mismatch2.4 定义 BGP Peer告诉 Calico 寻找上游路由器# bgp-to-openwrt.yamlapiVersion:projectcalico.org/v3kind:BGPPeermetadata:name:peer-with-openwrtspec:peerIP:192.168.1.1asNumber:65001calicoctl apply -f bgp-to-openwrt.yaml --allow-version-mismatch3. OpenWrt 侧配置FRR 路由交换3.1 基础 BGP 进程配置在 OpenWrt 中通过vtysh开启 BGP 进程。注意 Router ID 必须唯一vtysh conf t router bgp65001bgp router-id192.168.1.1 neighbor192.168.1.15 remote-as64512neighbor192.168.1.15 description k8s-node-omen address-family ipv4 unicast neighbor192.168.1.15 activate neighbor192.168.1.15 soft-reconfiguration inbound exit-address-family3.2 解除 Policy 锁定核心点FRR 默认为了安全会阻断未经定义的路由交换。必须创建一个route-map并应用到邻居上# 定义一个允许所有的策略route-map ALLOW-ALL permit10# 进入地址族将策略应用在入站和出站router bgp65001address-family ipv4 unicast neighbor192.168.1.15 route-map ALLOW-ALLinneighbor192.168.1.15 route-map ALLOW-ALL outexitwr4. 验证与总结状态检查在 OpenWrt 执行show ip bgp summary观察State/PfxRcd列Active: 连接失败。通常是身份Source IP没对上检查 Calico 端的 IP 探测。(Policy): 已连接但无数据。说明 route-map 没配对或没生效。数字 (e.g., 1):成功已从 OMEN 节点收到了 1 条路由。结果展示查看 OpenWrt 内核路由表rootrouter:~# ip route | grep 10.24410.244.3.192/26 via 192.168.1.15 dev br-lan proto bgp此时局域网内的其他 VLAN如 192.168.10.x只需通过该路由表即可直连 Pod。5. 常见问题复盘WireGuard 干扰停止wg-quick可能还不够必须在 Calico 的 DaemonSet 环境变量中明确指定IP_AUTODETECTION_METHOD。Mesh 状态如果不关闭nodeToNodeMeshEnabled集群内部依然会保留大量 IPIP 隧道连接增加系统负担。防火墙OpenWrt 的Forward链必须允许lan区域到lan区域或指定 VLAN 到br-lan的转发。如果你有多个节点只需在路由器侧增加neighbor配置即可。