【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/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. 常见问题复盘

  1. WireGuard 干扰 :停止 wg-quick 可能还不够,必须在 Calico 的 DaemonSet 环境变量中明确指定 IP_AUTODETECTION_METHOD
  2. Mesh 状态 :如果不关闭 nodeToNodeMeshEnabled,集群内部依然会保留大量 IPIP 隧道连接,增加系统负担。
  3. 防火墙 :OpenWrt 的 Forward 链必须允许 lan 区域到 lan 区域(或指定 VLAN 到 br-lan)的转发。
  4. 如果你有多个节点,只需在路由器侧增加 neighbor 配置即可。

相关推荐
艾莉丝努力练剑2 小时前
【Linux:文件 + 进程】进程间通信进阶(1)
linux·运维·服务器·网络·c++·人工智能·进程
蓝天星空2 小时前
docker部署 asp.net程序
docker·容器·asp.net
Lsir10110_2 小时前
【Linux】网络编程基础—套接字
linux·运维·服务器·网络·c++
Java小白笔记2 小时前
Linux中使用systemd服务单元定时任务
linux·服务器·网络
Trouvaille ~2 小时前
【项目篇】从零手写高并发服务器(三):日志宏与Buffer缓冲区模块
运维·服务器·网络·高并发·muduo库·日志宏·缓冲区设计
lpfasd1232 小时前
Kubernetes (K8s) 入门指南:从容器混乱到云原生秩序
云原生·容器·kubernetes
~莫子2 小时前
Docker镜像构建
运维·docker·容器
吹牛不交税3 小时前
vue3项目部署到阿里云Alibaba Cloud Linux3系统的docker
docker·容器·.netcore
IpdataCloud4 小时前
金融风控管理如何借助IP离线库提升效率?多语言工程实践
网络·网络协议·tcp/ip