PROJECT ID · PRJ-001
EDGE FABRIC:跨机房二层延伸骨架
把两个机房的接入网络收敛到一套 EVPN-VXLAN 骨架上:谁在哪个机架、流量走哪条路径、故障时怎么收敛,都由 BGP 的 EVPN 路由决定,而不是靠人工维护的 VLAN 表。
目标
A/B 两个机房之间需要二层可达——虚拟机迁移、共享存储的心跳、以及一批写死了 IP 的旧系统都要求这一点。传统做法是把 VLAN 一路 trunk 过去,代价是广播域横跨 两个机房,一个环回就能把两边一起打挂。
这个项目把二层延伸收进 VXLAN,让传输层走三层:跨机房的路径由 BGP 选,由不得 STP 说了算。
为什么不用大二层
- 广播域可控。 VXLAN 的隧道端点只在 Spine 上,接入侧看不到对方机房的广播。
- 收敛时间可预期。 BGP 的收敛是秒级的,且行为可推导;STP 的收敛依赖拓扑, 跨机房时最容易出现”看起来通、实际绕了远路”。
- 路径可观测。 每一条 EVPN 路由都是设备上的一个条目,能读出来、能比对。
拓扑
上图是当前生产的骨架:每机房一对 Leaf 上联一台 Spine,Spine 之间是一条 EVPN 骨架链路。Leaf 只跑 BGP,不跑 STP;接入侧的 VXLAN 隧道是逻辑的, 不占物理端口。
控制面
EVPN 的 Type-2 路由承载 MAC,Type-3 承载 VTEP 发现。一条典型的路由长这样:
# Spine 上读 EVPN 路由表
vtysh -c "show bgp l2vpn evpn route type macip"
# Route Distinguisher: 10.30.0.1:10
# *> [2]:[0]:[48]:[ac:1f:6b:11:02:31]
# 10.30.0.1 0 65001 i
每一条 MAC 都能追溯到它所在的机架,这是排障时最有用的一条信息—— “这台机器在哪个交换机下面”不再需要去查台账。
部署
配置不进设备,只进仓库。fabric-agent 渲染配置并下发,设备上的手工改动会在
下一次巡检时被报出来。
# 全量下发(先在 lab 机架跑一遍)
ansible-playbook -i inventories/prod fabric-deploy.yml --limit lab
ansible-playbook -i inventories/prod fabric-deploy.yml --check
ansible-playbook -i inventories/prod fabric-deploy.yml
已知限制
- Spine 是单点。 目前每个机房一台 Spine,掉一台等于该机房的跨机房路径全断。 补第二台在计划里,但需要先解决机柜空间和电源。
- MTU 依赖端到端一致。 隧道封装额外占用 50 字节,接入侧必须按 1450 配, 这条约束靠巡检脚本检查,不靠文档。
- VXLAN 的 ECMP 哈希是逐流的。 单条大流不会分摊到多条路径上, 这也是监控里偶尔看到”某条链路满了、另一条空着”的原因,属于预期行为。