2. SONiC架构与BGP EVPN基础

SONiC(Software for Open Networking in the Cloud)是微软开源、现由Linux基金会托管的网络操作系统。它最核心的设计思想是“把交换机拆成可替换的积木”:底层是开放硬件与SAI,中间是Redis数据库与各容器化服务,上层是FRR等协议栈。理解这套分层结构,是后续配置BGP EVPN、排查路由不通问题的前提。

一、SONiC的四层架构

从下往上看,SONiC可以分成四层:

  • 硬件与SAI层:SAI(Switch Abstraction Interface)是一套C语言API标准,定义了创建VLAN、添加路由、下发ACL、配置下一跳等操作。不同厂商(Broadcom、Marvell、Mellanox等)各自实现SAI驱动,SONiC上层代码只调用SAI,不直接碰芯片寄存器。这就是“一次开发、多芯片运行”的关键。
  • Redis数据库层:SONiC内部所有模块之间不直接调用,而是通过Redis的发布/订阅与键值读写通信。数据库按用途分为APPL_DB(应用意图)、CONFIG_DB(用户配置)、STATE_DB(运行状态)、COUNTERS_DB(计数器)、ASIC_DB(下发到芯片的表项)等。
  • 容器化服务层:包括syncd(把APPL_DB翻译成SAI调用)、orchagent(编排者,把CONFIG_DB/APPL_DB转成ASIC_DB)、bgp容器(运行FRR)、teamd、lldp、snmp等。每个服务独立容器,故障隔离、可单独升级。
  • 管理与CLI层:config命令写CONFIG_DB,show命令读STATE_DB/APPL_DB,sonic-cfggen负责模板渲染。

下面这张图展示了从用户配置到芯片下发的完整数据通路,以及BGP EVPN路由在这条通路上的位置。

SONiC 分层架构与 BGP EVPN 数据通路 管理与 CLI 层 config bgp / config interface / show bgp evpn … sonic-cfggen 模板渲染 CONFIG_DB(用户意图) BGP_GLOBALS / BGP_NEIGHBOR / VLAN / PORT / DEVICE_METADATA 容器化服务层 bgp 容器 (FRR) BGP / EVPN 地址族 Type-2/3/5 路由 orchagent 编排 APPL_DB → ASIC_DB VXLAN / 下一跳 / 邻居 syncd ASIC_DB → SAI API 调用 批量下发、事务提交 SAI 抽象层 + 交换芯片 sai_create_route_entry / sai_create_next_hop / sai_create_vxlan_tunnel … Redis 数据库 APPL_DB / STATE_DB ASIC_DB / COUNTERS_DB BGP EVPN 路由流: 对端 VTEP 通告 Type-2 MAC/IP → FRR 写入 APPL_DB → orchagent 生成 VXLAN FDB 与下一跳 → syncd 经 SAI 下发芯片

二、Redis数据库:SONiC的“中枢神经”

SONiC各模块之间不直接函数调用,而是通过Redis解耦。以配置一个BGP邻居为例:

# 用户执行
config bgp neighbor add 10.0.0.2 remote-as 65002

# 实际写入 CONFIG_DB
redis-cli -n 4 HSET "BGP_NEIGHBOR|10.0.0.2" \
  "asn" "65002" "local_addr" "10.0.0.1"

# bgp容器内的FRR通过监听CONFIG_DB变化,生成BGP配置
# 路由建立后,EVPN路由写入 APPL_DB
redis-cli -n 0 KEYS "VXLAN_FDB_TABLE*"

关键数据库编号:0=APPL_DB,1=COUNTERS_DB,2=LOGLEVEL_DB,4=CONFIG_DB,6=STATE_DB,7=ASIC_DB。排查问题时,redis-cli -n 4看配置意图,redis-cli -n 0看应用层表项,redis-cli -n 7看最终下发到芯片的内容,三者对照就能定位是“配置没写进去”“编排没生成”还是“SAI下发失败”。

三、SAI抽象层与FRR路由栈

SAI的价值在于屏蔽芯片差异。例如创建一条VXLAN隧道,SONiC调用的是统一的sai_create_tunnel(),Broadcom芯片和Mellanox芯片各自实现该函数。这意味着同一份SONiC镜像可以跑在不同白盒交换机上,BGP EVPN的配置方式完全一致。

FRR(FRRouting)是SONiC中的路由协议栈,运行在独立的bgp容器内。它负责BGP对等体建立、EVPN地址族协商、Type-2/3/5路由的收发与选路。FRR把计算出的路由通过zebra写入内核,同时SONiC的fpmsyncd监听内核路由变化,将其写入APPL_DB,再由orchagent转成ASIC_DB,最终由syncd经SAI下发芯片。这条“FRR → zebra → fpmsyncd → APPL_DB → orchagent → ASIC_DB → syncd → SAI → 芯片”的链路,是BGP EVPN路由真正生效的完整路径。

四、BGP EVPN在数据中心的核心价值

传统数据中心用VLAN+STP,存在三大痛点:二层环路靠STP收敛慢、VLAN数量上限4094、跨Pod迁移需要重新规划IP。BGP EVPN用“控制面通告MAC/IP、数据面VXLAN封装”解决这些问题:

  • 控制面:BGP EVPN地址族(AFI=25,SAFI=70)通告Type-2(MAC/IP)、Type-3(IMET,用于BUM流量)、Type-5(IP前缀)路由,实现MAC地址的分布式学习,不再依赖数据面泛洪。
  • 数据面:VXLAN封装,VNI标识租户,VTEP之间建立隧道,虚拟机可以在任意Leaf下迁移而IP不变。
  • 标准化:RFC 7432定义BGP EVPN基本框架,RFC 8365定义数据中心网络虚拟化方案,RFC 9136定义IP前缀路由(Type-5)。SONiC的FRR实现遵循这些RFC,保证多厂商互通。
排查提示:当EVPN路由不通时,按“FRR邻居状态 → APPL_DB表项 → ASIC_DB表项 → 芯片计数器”的顺序逐层检查。如果show bgp evpn summary显示邻居Established,但redis-cli -n 0 KEYS "VXLAN*"为空,说明fpmsyncd或orchagent环节有问题;如果APPL_DB有表项但ASIC_DB没有,则问题在orchagent到syncd之间。

五、关键参数速查

项目典型值/说明
EVPN AFI/SAFI25 / 70
VXLAN UDP端口4789(默认)
Type-2路由MAC/IP Advertisement,携带MAC、IP、VNI、下一跳VTEP
Type-3路由Inclusive Multicast Ethernet Tag,用于BUM流量转发
Type-5路由IP Prefix,用于L3互通
CONFIG_DB编号4
APPL_DB编号0
ASIC_DB编号7