ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

VXLAN技术实战:从VLAN瓶颈到EVPN控制平面的数据中心网络演变

2026/9/20 4:34:16 拓冰建站 浏览量
VXLAN技术实战:从VLAN瓶颈到EVPN控制平面的数据中心网络演变 做数据中心网络的这两年应该没少被问一个问题业务要扩容虚拟机要迁移容器一开就是几十个网段但二层网络还是被 VLAN 卡得死死的。VLAN 用了几十年4094 个可用 ID 的天花板摆在那生成树又不敢关跨机房的二层拉通更是想都不敢想。早期我给的方案要么是堆 VLAN Trunk 加链路捆绑要么干脆让业务改 IP结果运维同事看我的眼神都不太对。后来 VXLAN 进场这些问题才有了一个像样的解。它不是说把 VLAN 从 4094 扩到几百万这么简单而是把二层报文的“传输方式”整个改掉了——不再依赖物理链路泛洪和 MAC 学习而是把二层帧塞进三层 UDP 报文里在 IP 网络上像快递一样寄过去。今天就把 VXLAN 从原理到落地完整拆一遍包括 VTEP、VNI、EVPN 控制平面这些核心概念以及我在实际项目里踩过的坑。1. VLAN 的 4094 天花板到底卡在哪从广播域到 STP 的两座大山先不急着讲 VXLAN 的封装格式得先搞清楚传统 VLAN 在大二层场景里是怎么崩的。只有把痛点钉死了后面看 VXLAN 的每一项设计才会觉得“本来就该这样”。1.1 4094 个 VLAN ID 为什么不够用VLAN 的报文标记字段只有 12 bit理论值是 4096扣除保留的 0 和 4095实际可用 4094 个。这个数量在 2010 年以前觉得绰绰有余因为一个园区的 VLAN 数撑死几十个。但虚拟化普及之后就不一样了——每一台物理服务器上的每个虚拟机都可能有独立网段公有云租户隔离、数据库多实例、容器平台 Pod 网络一栋机柜分分钟吃掉几百个 VLAN ID。我见过一个中等规模的数据中心光业务分区就用了八百多个 VLAN这还是没算管理网和存储网后续新业务上线申请网段都只能挤着用。更麻烦的是 VLAN ID 是集群共享的资源不像 VNI 有 24 bitVXLAN 的虚拟网络标识范围是 1600 万个左右差不多是 VLAN 的四千倍租户隔离根本不用发愁。而且 VLAN 是二层标记离开广播域就失效跨设备做扩展还得靠 QinQ 和各种私有协议打补丁实际用起来复杂度和故障率都是直线上升。1.2 生成树协议如何钝化链路利用率VLAN 只能在一个广播域内工作广播域大了就必须拿生成树协议STP/RSTP/MSTP来防环。STP 的逻辑很简单物理上有环逻辑上砍掉冗余路径全网只剩一棵无环树。这样做虽然保证了安全但代价是设备之间明明有多条万兆链路实际只能走一条剩下全被 Block 掉用来做备份。大二层网络里这个矛盾会加倍放大。业务流量从服务器 A 去服务器 B如果横跨核心、汇聚两层设备STP 收敛时间再快也有数秒甚至数十秒vMotion 过程中网络闪断直接导致虚拟机迁移失败这在大规模云平台里是不可接受的。VXLAN 的思路则是从根源上绕开这个约束既然二层广播域依靠泛洪和生成树才有意义那我把所有租户流量都封装成三层报文在 IP 网络里按路由转发物理链路天然支持 ECMP 多路径负载分担STP 只在少量接入段存在核心区域可以更像一张纯 IP 网络来跑。1.3 虚拟机迁移和容器编排带来的“二层延伸”刚需为什么非要大二层最直接的需求就是虚拟机在线迁移。vMotion 之类的机制要求在迁移过程中虚拟机的 IP 地址、MAC 地址保持不动如果迁移前后两台物理服务器不在同一个二层广播域目标主机收到虚拟机发出的 Gratuitous ARP 就没人回应网络直接断。容器编排平台也有类似问题。Kubernetes 里的 Pod 漂移、Service 负载均衡尤其在使用某些网络插件时同样要求跨节点的 Pod 能共享二层连通性。如果你只靠 VLAN 去延伸二层碰到跨机房、跨城域网的场景立刻抓瞎VXLAN 恰恰就是用来承载这些“不在同一物理区域却要在同一逻辑二层”的业务。2. VXLAN 到底做了什么VTEP、VNI 与 UDP 封装三元组拆解VXLAN 全称是 Virtual Extensible LANRFC 7348 定义核心思想只有一句话在已有的 IP 网络上叠加一层虚拟二层网络。这句话听起来轻巧但拆开以后涉及几个必须严格理解的概念搞混了后面配置必出问题。2.1 谁是 VTEP隧道端点的宿命与要求VTEPVXLAN Tunnel Endpoint是 VXLAN 隧道的起点和终点所有原始二层帧都在 VTEP 上完成封装和解封装。VTEP 可以是物理交换机、虚拟交换机比如 Open vSwitch、服务器上的 vSwitch或者是网关设备。它必须有一个 IP 地址作为隧道源地址这个地址要求是三层可达的否则封装后的报文根本没路可走。VXLAN 对 VTEP 有个特别容易被忽略的要求处理 BUM 流量广播、未知单播、组播的能力。无论是不带控制平面的传统 VXLAN 泛洪模式还是后面讲的 EVPN 模式VTEP 都要知道去哪复制流量。实际组网里VTEP 通常由两台交换机做集群或堆叠来承担避免单点故障导致整个隧道失效。2.2 VNI 就是租户二层网络的身份证VNIVXLAN Network Identifier长度 24 bit标识一个独立的虚拟二层网络。VXLAN 报头用 VNI 把不同租户的流量隔离开两个 VNI 不同的 VTEP 之间即使物理链路互通也绝对不会互相转发二层帧因为 VTEP 在解封装后会检查 VNI 是否映射到本地 VLAN映射不上直接丢包。vCenter 或者云平台创建网络时管理员看到的“VLAN 100”背后可能已经分配了 VNI 5010但用户不需要感知这层映射。在设备配置上通常是交换机里定义一个 VBDIF 接口或者 VXLAN 相关配置把本地的 VLAN 和 VNI 绑定起来这种绑定关系直接决定了二层广播域的边界也是排错时最先要查的地方。2.3 MAC-in-UDP 封装格式的细节标准的 VXLAN 报文结构从外到内依次是外层以太网头MAC 头外层 IP 头源/目的 VTEP 地址外层 UDP 头目的端口 4789VXLAN 头8 字节包含 VNI 和标志位原始二层以太网帧含内层 MAC 头VXLAN 头里最重要的就是一个标志位 I 位必须置 1以及 24 位的 VNI其余 Reserved 字段必须清零。外层 UDP 目的端口默认是 4789IANA 分配的知名端口这个端口在排错时格外重要很多防火墙策略会默认拦截非知名端口导致 VXLAN 隧道起不来后面专门讲这个坑。之所以选择 UDP 做承载而不是 TCP是因为 VXLAN 并不需要 TCP 的可靠传输和有序到达——内层帧本身就是带重传机制的上层协议TCP 居多隧道层再搞可靠性纯属多余而且 UDP IP 才能让报文哈希字段参与 ECMP 负载均衡流量才能均匀分布在多条链路上。如果换成 TCPL4 端口号波动会毁掉哈希稳定性这是设计上的理性选择。3. 数据平面转发流程一个跨三层二层的“包裹派送系统”VXLAN 的转发行为本质上是一个“封包-寄送-拆包”的过程。我习惯拿快递做类比内层 MAC 帧是你要寄送的货物VXLAN 头是贴在外箱上的运单写清楚 VNI 编号外层 UDP/IP 头是快递公司选定的派送路线VTEP 就是发件和收件的网点。3.1 同 VNI 内的单播转发从源 VTEP 到目的 VTEP假设虚拟机 AVNI 100要和虚拟机 BVNI 100通信而两台机器分别在两个机房、挂在两台不同的 VTEP 设备下。A 发出的原始二层帧到达源 VTEP 后VTEP 查询 VNI 100 对应的二层转发表MAC-VNI 表发现目的 MAC 对应的出口方向是一个远端 VTEP 地址就执行封装把原始帧塞进 VXLAN 头再加上 UDP/IP 头目的 IP 填远端 VTEP 地址然后从三层接口扔出去。到达目的 VTEP 后设备检查 UDP 端口是不是 4789是则剥掉外层头取出 VXLAN 头里的 VNI再查这个 VNI 映射到本地哪个 VLAN最后把原始二层帧从该 VLAN 对应的接入端口转发给虚拟机 B。整个过程中间走的全是三层路由但只要 VTEP 识别正确两端虚拟机感知到的就是一个畅通无阻的二层网络。3.2 BUM 流量处理泛洪、组播抑制与 ARP 抑制VXLAN 最烦的部分是广播、未知单播和组播的处理。常规二层网络中ARP 请求就是靠广播帧全广播域转发才拿到响应的VXLAN 在 Overlay 里自然不能真的把广播帧丢到物理网上否则跨机房广播包会让网络瘫痪。传统 VXLAN 的解决办法是头端复制Head-End Replication源 VTEP 收到 BUM 帧后向它运维的同一 VNI 下所有远端 VTEP 复制一份并封装发送。这样做实现简单但 VTEP 数量一多源端负责的复制份数会急剧增加CPU 和带宽压力很大。另一种做法是用组播组承载 BUM 流量但由于组播在现网中部署复杂而且跨公网很难打通数据中心组网里并不常用。现代方案基本是 EVPN 控制平面提供“ARP 抑制”和“BUM 优化”——通过 BGP 通告 MAC/IP 路由大多数 ARP 请求在源 VTEP 上就能直接回应只有极少数未知帧才需要封装转发这比头端复制省资源得多。3.3 为什么 UDP 哈希让 ECMP 终于有了用武之地传统二层链路被 STP 阻塞三层网络却可以用 ECMP 做等价多路径VXLAN 因为封装在 UDP 里天然适合这个机制。当一条 VXLAN 隧道经过三层网络到达远端时沿途路由器会根据外层 IP 和 UDP 端口做哈希选择不同的物理路径从而充分利用带宽。用户可能听过“VXLAN 不足之处是增加了 50 字节开销”这个开销如果不做 MTU 调整在某些网络里会导致 1500 字节的大帧被分片而分片后一旦某个分片丢了整帧都得重传。所以部署 VXLAN 时我一般习惯把 VTEP 接入侧和核心链路 MTU 统一调到 1550 或更高并保证路径上的所有转发设备都支持 jumbo frame这个细节直接决定了大流量业务的稳定性。4. 控制平面进化史从数据平面泛洪学习到 EVPN 的“路由化”麦克风最早的 VXLAN 是纯数据平面学习的类似于传统二层交换机的 MAC 学习只不过把广播域扩展到了三层隧道上。这种模式在中小规模能被接受但到了大规模数据中心泛洪学习的问题会暴露得非常明显。4.1 数据平面学习的缺陷与扩容瓶颈数据平面学习模式下VTEP 的转发表要靠泛洪来填充。一个新虚拟机上线发出第一个 ARP 请求源 VTEP 就要把 ARP 广播复制给所有同 VNI 的远端 VTEP。VTEP 数量从 10 台涨到 100 台控制消息量呈线性甚至更糟的上升趋势网络里飘着大量无效广播排障的时候根本不知道哪个 MAC 是从哪学来的。更膈应人的是收敛速度。传统二层靠老化时间去收敛 MAC跨三层 Overlay 老化时间一长虚拟机迁移后 MAC 的位置变化要泛洪几轮才能被全网感知在这个窗口期里流量会造成黑洞。对于动不动就迁移上百台虚拟机的云平台来说这个缺陷是完全不能接受的。4.2 EVPN 如何用 BGP 把 MAC 变成可路由信息EVPNEthernet VPN把传统二层网络的 MAC 学习从“数据面泛洪”搬到了“控制面路由通告”规范在 RFC 7432 中定义是 VXLAN 事实上的最佳控制平面搭档。VTEP 设备运行 MP-BGP通过 address-family l2vpn evpn 这个地址族把本地学习到的 MAC 地址、IP 地址和 VNI 信息打包成 BGP 路由通告给对端。对端 VTEP 收到路由后直接写入自己的 MAC-VNI 转发表不再需要靠泛洪去猜。EVPN 的核心路由类型主要有Type-2 路由MAC/IP Advertisement Route通告 MAC 地址可带 IP用于主机路由学习和 ARP 抑制Type-3 路由Inclusive Multicast Ethernet Tag Route通告本端在某个 VNI 下的所有 VTEP 列表用于指导 BUM 流量复制Type-5 路由IP Prefix Route通告三层的网段路由用于分布式网关等场景。有了 Type-2 路由当 VTEP 收到一个 ARP 请求时它会先查本地是否已经有对应的 IP-MAC 映射如果有就直接代答压根不需要泛洪出去。这就是 EVPN 模式下的 ARP 抑制能力实测下来广播报文能下降一个数量级以上。4.3 分布式网关与对称/非对称 IRB 的取舍EVPN 配合 VXLAN 还支持分布式网关也就是说每个 VTEP 都可以作为三层网关对外提供一个 anycast 网关 IP 和 MAC。虚拟机默认网关指向 this anycast gateway不管它迁移到哪个 VTEP 下网关地址始终不变这比传统 VLAN 网络里网关固定在核心交换机上要灵活得多。三层转发上存在对称 IRB 和非对称 IRB 两种模型。非对称 IRB 是在入方向 VTEP 上做一次三层终结出方向再以二层方式交付实现简单但要求每个 VTEP 都配置所有租户的 VNI对称 IRB 是两端 VTEP 都做三层转发中间走 L3 VNI扩展性好但配置复杂。实际项目里规模小选非对称省事规模大追求一致性和收敛质量就上对称这个视设备能力而定没有绝对的对错。5. 弹性到底弹在哪跨数据中心、RoCE 无损与容器场景的落地组合标题里强调“弹性二层业务网络”到底哪些业务场景在 VXLAN 下真正获得了弹性我挑三个最典型的落地场景来说。5.1 跨数据中心二层拉通与 DCI 改造两个机房之间要做大二层互备传统方案是裸光纤加 VLAN Trunk距离和传输设备类型限制很多一旦跨城域网还要考虑二层环路非常痛苦。VXLAN 方案直接把二层帧封装成三层报文依赖运营商 IP 网络或 DCI 链路承载只要 VTEP 之间的三层可达二层业务就能打通。我部署过的项目里双活数据中心的两台核心交换机各自作为 VTEP通过 DCI 链路建立 VXLAN 隧道两边的虚拟机处于同一个 VNI 网段。做存储双活和数据库扩展时虚拟机迁移到备中心网络完全没有重配置这是弹性最直观的体现。5.2 无损网络与 RoCEVXLAN 如何和 PFC/ECN 共存标题热词里有“支持 RoCE 无损网络技术”这个说明 VXLAN 在 AI 和高性能计算场景也被大量引入。RoCERDMA over Converged Ethernet依赖无损以太网特性比如 PFC 优先级流控和 ECN 显式拥塞通知。VXLAN 隧道上加一层封装之后外层 IP 头的 DSCP 需要和内层优先级做好映射否则 PFC 的优先级队列根本匹配不到 RDMA 流量。实际配置里需要把 VXLAN 外层 DSCP 值映射到内层 RoCE 流量优先级保证交换机在拥塞时能正确触发流控。这个点经常被忽略很多 RoCE 集群搭起来性能抖动查来查去最后发现是 VXLAN 封装把 DSCP 丢了。5.3 K8s 与 Multus 网络中的 VLAN/VXLAN 配置容器场景中 K8s 网络插件比如 Calico 的 VXLAN 模式、Flannel 的 VXLAN 后端也大量使用 VXLAN 做 Overlay。社区热词里 K8s Multus 配置 VLAN本质就是允许一个 Pod 同时接入多个网络平面其中一个平面的底层承载就可以是 VXLAN。Multus 通过 NetworkAttachmentDefinition 定义网络配置指定 vlan ID 或 VXLAN 参数让 Pod 在默认 CNI 之外获得额外的二层网络能力。现在的 CNI 插件普遍成熟了Calico VXLAN 后端把每个节点自动变成 VTEPPod 流量自动走 Overlay 隧道。如果你在容器平台上遇到跨节点 Pod 二层不通先看看节点间的 UDP 4789 端口通不通多半就是防火墙把 VXLAN 给拦了。6. 实战踩坑记录VXLAN 配置动态、MTU 调整与典型排错命令最后还是得回到地上讲讲我实际部署 VXLAN 遇到的问题和排错方法。这部分内容一般文档里不会细写但搞运维网工的基本都靠这些保命。6.1 三张配置清单NVE 接口、VNI- VLAN 映射与 BGP 邻居VXLAN 配置大体分三层基础隧道配置创建 NVE 接口指定源接口通常是 Loopback 口然后建立 VNI。例如华为设备的思路是interface NVE1下配置source和vni 5010 head-end peer-list把对端 VTEP 加进头端复制列表。二层桥接配置把接入侧物理接口或 trunk 口划分到某个 VLAN同时把这个 VLAN 映射到 VNI。命令因厂商而异但逻辑都是bridge-domain或者xconnect与 VLAN/VNI 关联。EVPN 控制平面配置启用 BGP 的 l2vpn evpn 地址族配置对等体关系并把 EVPN 使能到 NVE 接口上让 MAC 路由能通过 BGP 发布。配置完成后先用display vxlan tunnel或等价命令确认隧道状态是 UP再看display vxlan peer或display evpn routing-table确认对端 VTEP 的状态和学到的 MAC。如果 Tunnel 状态 DOWN优先检查 loopback 接口路由是否可达以及 UDP 4789 端口是否被中间 ACL、防火墙策略给挡了。6.2 MTU 引发的血案和解决方案这是我强烈建议每个部署 VXLAN 的人提前做的事全网 MTU 评估。VXLAN 封装让原本 1500 字节的 MTU 变成了 1550如果物理链路的 MTU 还是 1500大帧就会分片分片不仅增加转发延迟还会造成严重的乱序重排问题尤其对存储流量和数据库同步来说是灾难。我的做法是所有 VTEP 设备和核心设备统一将物理接口 MTU 设为 9216如果硬件支持VM 侧网卡 MTU 保持 1500 或按业务需要设定中间若有运营商专线或第三方设备必须确认链路在传输上允许 1550 字节以上帧通过否则要在两端主机上把 MTU 调到略低比如 1450来规避。6.3 二层 MAC 漂移、ARP 表不对与隧道起不来的排查链路遇到 VXLAN 二层不通我常按这个顺序查VTEP 三层连通性ping 隧道对端地址如果不通隧道一定起不来UDP 4789 端口用抓包或 telnet 排除中间安全策略拦截VNI 映射对比两端 VNI 值是否一致VNI 不一致会直接丢包没有任何协商机制MAC 表项看源 VTEP 和目的 VTEP 的 MAC-VNI 表是否都有对应条目缺条目时多半是 EVPN 路由没有学到去查 BGP 邻居状态和 Type-2 路由ARP 抑制误伤EVPN 的 ARP 抑制如果通告的 MAC 过期或错误会出现能 ping 通网关但业务不通的诡异现象这时可以把抑制关掉临时验证再排查路由通告谁更新错了。MAC 漂移问题则多半出在 VNI 跨多个 VTEP 时由于某个接入设备在多个端口下重复通告同一 MAC。用display mac-move flap看漂移记录处理思路是检查接入侧是否有非预期的环路或者是否有多条路径同时注入同一个 MAC 导致 EVPN 路由振荡必要时关掉某一边的接入链路来确认故障源。6.4 仿真与验证环境华为 eNSP 里能练到什么程度热词里提到 eNSP 模拟器很多朋友问能不能在模拟器里练习 VXLAN。华为的 eNSP 部分版本对 VXLAN 和 EVPN 支持不完整更多时候需要用真机或者更强大的仿真平台。如果你条件有限建议在 eNSP 里先把 VLAN 互访、路由配置这些基本功练透VXLAN 和 EVPN 的设备交互最好用厂商的现网设备或专业模拟器去验证否则会被模拟器的功能边界误导。按我个人的经验VXLAN 这套东西最靠谱的学习路径是先把传统二层和三层的原理彻底搞清楚然后动手配一组“两台 VTEP 两台服务器”的最小实验逐步加 BGP EVPN再慢慢扩展到分布式网关和跨数据中心场景。设备厂商的差异只在命令思路是通用的。VXLAN 真正改变的不是某条命令而是网络设计的理念——你不再需要为每一层业务小心翼翼地规划广播域也不用在扩展性和可靠性之间做痛苦的取舍。它把二层网络从物理拓扑的捆绑里解放了出来让网络管理和云平台的动态调度真正对上了频率。