【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 配置即可。

相关推荐
lichenyang4534 天前
Docker 学习笔记(四):Dockerfile,把项目打成自己的镜像
docker·容器
lichenyang4534 天前
Docker 学习笔记(三):Docker 网络、bridge、子网和容器互通
docker·容器
lichenyang4534 天前
Docker 学习笔记(二):docker run 的参数到底在控制什么?
docker·容器
运维开发故事6 天前
基于 Arthas 的多集群在线诊断系统设计与实现
kubernetes
Patrick_Wilson8 天前
从「改个端口」到 502:Next.js on k8s 的容器端口、Service 映射与 env 覆盖
docker·kubernetes·next.js
探索云原生9 天前
K8s 1.36 这个 GA 特性,把 initContainer 拉模型的 hack 干掉了
ai·云原生·kubernetes
云恒要逆袭9 天前
运行你的第一个Docker容器
后端·docker·容器
Java之美10 天前
一次k8s升级引发的DevicePlugin注册失败
云原生·kubernetes
程序员老赵10 天前
10 分钟部署 OpenCode:Docker 一键安装,浏览器打开就能用 AI 写代码(附完整命令与排错)
docker·容器·ai编程