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/26
2. K8s 侧配置:身份确立与策略下发
2.1 强制网卡绑定(避坑必做)
如果宿主机存在 WireGuard (sky) 等虚拟网卡,Calico 启动时可能误选 BGP 源 IP,导致邻居建立失败。必须强制绑定物理网卡:
bash
kubectl set env daemonset/calico-node -n kube-system IP_AUTODETECTION_METHOD=interface=enp60s0
2.2 安装 calicoctl
操作 Calico 的 BGP 资源需要用到专门的客户端工具:
bash
curl -L https://github.com/projectcalico/calico/releases/latest/download/calicoctl-linux-amd64 -o calicoctl
chmod +x calicoctl
sudo mv calicoctl /usr/local/bin/
2.3 关闭 Node-to-Node Mesh
这是架构优化的核心。关闭 Mesh 可以防止节点间建立冗余的蜘蛛网连接,让 OpenWrt 成为唯一的路由中枢(类似 Route Reflector 角色)。
bash
# 修改默认 BGP 配置
calicoctl patch bgpconfig default -p '{"spec": {"nodeToNodeMeshEnabled": false, "asNumber": 64512}}' --allow-version-mismatch
2.4 定义 BGP Peer
告诉 Calico 寻找上游路由器:
yaml
# bgp-to-openwrt.yaml
apiVersion: projectcalico.org/v3
kind: BGPPeer
metadata:
name: peer-with-openwrt
spec:
peerIP: 192.168.1.1
asNumber: 65001
calicoctl apply -f bgp-to-openwrt.yaml --allow-version-mismatch
3. OpenWrt 侧配置:FRR 路由交换
3.1 基础 BGP 进程配置
在 OpenWrt 中通过 vtysh 开启 BGP 进程。注意 Router ID 必须唯一:
bash
vtysh
conf t
router bgp 65001
bgp router-id 192.168.1.1
neighbor 192.168.1.15 remote-as 64512
neighbor 192.168.1.15 description k8s-node-omen
address-family ipv4 unicast
neighbor 192.168.1.15 activate
neighbor 192.168.1.15 soft-reconfiguration inbound
exit-address-family

3.2 解除 Policy 锁定(核心点)
FRR 默认为了安全会阻断未经定义的路由交换。必须创建一个 route-map 并应用到邻居上:
bash
# 定义一个允许所有的策略
route-map ALLOW-ALL permit 10
# 进入地址族,将策略应用在入站和出站
router bgp 65001
address-family ipv4 unicast
neighbor 192.168.1.15 route-map ALLOW-ALL in
neighbor 192.168.1.15 route-map ALLOW-ALL out
exit
wr

4. 验证与总结
状态检查
在 OpenWrt 执行 show ip bgp summary,观察 State/PfxRcd 列:
- Active: 连接失败。通常是身份(Source IP)没对上,检查 Calico 端的 IP 探测。
- (Policy): 已连接但无数据。说明 route-map 没配对或没生效。
- 数字 (e.g., 1) : 成功! 已从 OMEN 节点收到了 1 条路由。
结果展示
查看 OpenWrt 内核路由表:
root@router:~# ip route | grep 10.244
10.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配置即可。