通往单个 VTEP 的 ECMP:VXLAN 熵从何而来
远端 VTEP 可以有多个等价的下一跳,但 /32 并不会让它们变得有用。分发取决于外层元组和源端口哈希。
「等价多路径对主机路由毫无意义」这个说法被反复得足够多,以至于听起来像真的。/32 只选择目的地址,这个选择本身并不把数据包限制在一条物理链路上。当目的地是远端 VXLAN 隧道端点时,多个下一跳可以承载不同的 overlay 流,而它们是否真的这样做,取决于转发哈希被允许看到什么。剩下的只是外层头部上的算术,而不是前缀的属性。
路由决定可达性,哈希决定分发。
误解:/32 意味着只有一条路径
OSPF 可以报告到 VTEP loopback 的等价可达性,而转发表为同一前缀安装一组下一跳。协议提供候选,平台决定哪些可用以及数据包如何分配。没有任何路由协议会为每个封装帧重新计算哈希。正是这种分离,使得两台拥有相同路由的路由器仍然可能以不同方式分发流量。
要查看已安装的转发表项,而不只是路由显示,因为硬件或策略限制可能剔除控制面仍在通告的候选。
熵必须从何而来
两台 VTEP 之间,外层源地址和目的地址保持不变,在常规部署中 UDP 目的端口是 4789。只读取这些值的哈希看到的是恒定输入,返回的也是恒定路径。外层头部必须有某个东西变化,而 VTEP 正是能做到这一点的设备。
RFC 7348 建议从封装帧内部的字段派生 UDP 源端口。这样不同的内层会话就会产生不同的外层元组,让普通的传输哈希有可用的东西。
如果转发硬件能看进数据包更深处,就检查它的哈希实现支持哪些内层字段。不应把这种深度当作每台 underlay 设备的要求,因为仅源端口的差异就已经暴露出有用的区别。
检查你实际得到的哈希
测量而不是假设。抓取一段封装流量的样本,观察外层源端口,然后把结果与转发表项和每链路计数器对照。
show ip route 10.255.0.5/32 show ip cef 10.255.0.5 internal ip route show 10.255.0.5 tcpdump -ni eth0 -c 200 'udp port 4789' -vv
同一个源端口出现在许多不同的内层会话中,说明 VTEP 没有让该字段变化,再怎么调 underlay 也分散不了负载。反之,大量不同端口却只用一个下一跳,指向的是转发组。
记录取样前后的计数器,并注意共享上行链路的无关流量,否则这些数字看起来会比哈希应得的更糟。
均匀分发并不意味着什么
每条流的哈希旨在让一个会话停留在一条路径上,只要它的输入和可用路径集合不变。因此单个大 TCP 传输不会聚合所有上行链路,增加链路也不会让那条流变快。这是正常行为,不是故障。
多条流也可能碰巧撞到同一个下一跳。短样本可能看起来很偏,而哈希只是按配置正常工作;链路故障或路径集合变化则可能在传输中途搬移已建立的流。
在获批的计划下,用有代表性的地址对、传输协议和速率进行测试,并把链路聚合成员选择与路由多路径选择分开考虑,因为两级哈希会组合出各自的模式。下一跳组已填满、外层熵可见,这两点解释了结果;前缀长度解释不了。