8. Additional Options for Design (设计的附加选项)
8. Additional Options for Design (设计的附加选项)
本节讨论可以应用于基本 EBGP Clos 设计的几个高级选项和技术。这些选项可以提供额外的灵活性或优化, 但也会增加复杂性。
8.1 Third-Party Route Injection (第三方路由注入)
第三方路由注入是指从外部源 (例如控制器或应用程序) 向网络中注入路由的能力。BGP 的第三方下一跳功能使这成为可能。
用例
第三方路由注入对于以下情况很有用:
应用程序负载均衡: 应用程序可以动态通告任播 IP 地址以分发流量。例如, 当负载均衡器实例上线时, 它可以开始通告其任播 IP; 当它下线时, 它停止通告。
服务发现: 服务可以通过通告 IP 前缀来宣布其存在。客户端可以使用标准 IP 路由来到达服务。
流量工程: 控制器可以操作路由通告以实现特定的流量模式或策略。
故障转移: 应用程序可以通过改变路由通告来实现快速故障转移。
实现
第三方路由注入通常通过以下方式之一实现:
方法 1: 与控制器的 BGP 对等
网络设备与外部控制器建立 BGP 会话。控制器通告路由, 这些路由被注入到网络中。
router bgp 64701
neighbor 192.0.2.100 remote-as 65000
neighbor 192.0.2.100 description Application-Controller
控制器可以是:
- 专用的路由控制器应用程序
- 与 BGP 库集成的应用程序
- BGP 路由服务器
方法 2: 基于 API 的路由注入
一些网络设备支持 API (例如 NETCONF, RESTCONF, gRPC) 来注入路由。
方法 3: 路由服务器
路由服务器充当中央点, 从多个源收集路由并将它们分发到网络设备。
下一跳处理
在第三方路由注入中, 下一跳处理至关重要:
直接下一跳: 如果通告的下一跳是直接连接的, 则设备可以直接使用它。
递归下一跳: 如果通告的下一跳不是直接连接的, 则设备必须递归解析它 (即, 找到到达下一跳的路径)。BGP 支持这种递归下一跳解析。
例如, 如果控制器通告前缀 10.100.1.1/32, 下一跳为 192.0.2.50, 并且 192.0.2.50 可通过某个 Tier 1 设备到达, 则 Tier 2 设备将通过该 Tier 1 设备转发到 10.100.1.1 的流量。
ECMP 考虑因素
第三方路由可以利用 ECMP 进行负载均衡。如果多个应用程序实例通告相同的任播前缀但具有不同的下一跳, ECMP 将在它们之间分配流量。
例如:
- 负载均衡器 1 通告 10.100.1.1/32, 下一跳 192.0.2.51
- 负载均衡器 2 通告 10.100.1.1/32, 下一跳 192.0.2.52
Tier 2 设备将同时学习到这两条路径, 并使用 ECMP 在它们之间分配流量。
注意事项
使用第三方路由注入时的注意事项:
安全性: 确保只有授权的源才能注入路由。使用 BGP 认证 (MD5 或 TCP-AO) 和访问控制。
路由策略: 应用过滤器以防止注入不适当的路由 (例如, 默认路由, 基础设施前缀)。
递归下一跳限制: 验证设备支持递归下一跳解析, 并了解任何限制 (例如, 递归深度)。
收敛时间: 了解控制器或应用程序检测故障并撤回路由所需的时间。
复杂性: 第三方路由注入增加了操作复杂性。仅在明确好处的情况下使用它。
8.2 Route Summarization within Clos Topology (Clos 拓扑内的路由汇总)
如第 5.2.3 节所述, 在 Clos 拓扑内部进行路由汇总通常是危险的, 可能导致黑洞。本节讨论在特定情况下可以使用的两种有限形式的汇总。
8.2.1 Collapsing Tier 1 Devices Layer (折叠 Tier 1 设备层)
在某些数据中心设计中, 可能希望减少 Tier 1 层的大小或完全消除它。这可以通过在 Tier 2 设备上进行有限的路由汇总来实现。
动机
折叠 Tier 1 层的原因包括:
降低成本: 更少的 Tier 1 设备意味着更低的 CAPEX。
简化: 更少的层级意味着更简单的设计和操作。
降低延迟: 更少的跳数意味着更低的延迟。
方法
折叠 Tier 1 可以通过以下方式实现:
部分 Tier 1: 使用较小的 Tier 1, 仅用于集群间流量。
Tier 2 汇总: Tier 2 设备汇总其本地集群前缀并通告聚合到其对等体。
对等 Tier 2: Tier 2 设备在集群之间相互对等以交换汇总路由。
示例拓扑
Cluster A Cluster B
+---------+ +---------+
| Tier 2A |<---------------->| Tier 2B |
+---------+ +---------+
| | | | | |
Servers Servers
在此设计中:
- Tier 2A 汇总集群 A 的服务器前缀 (例如, 10.1.0.0/16)
- Tier 2B 汇总集群 B 的服务器前缀 (例如, 10.2.0.0/16)
- Tier 2A 和 Tier 2B 相互通告聚合
黑洞问题
标准的 Clos 拓扑汇总危险的原因是: 如果 Tier 1 设备通告聚合, 但不是所有的更具体前缀都可达, 则流量可能被黑洞化。
例如:
- Tier 1 从 Tier 2A 学习 10.1.1.0/24
- Tier 1 通告聚合 10.1.0.0/16 到 Tier 2B
- 如果 Tier 2A 和服务器之间的链路失败, Tier 2A 撤回 10.1.1.0/24
- Tier 1 仍然通告 10.1.0.0/16 到 Tier 2B
- 发送到 10.1.1.x 的流量被 Tier 1 黑洞化
解决方案: 条件汇总
为了避免黑洞, 必须有条件地执行汇总: 仅当至少一个更具体的前缀存在时才通告聚合。
大多数 BGP 实现支持这种条件汇总:
router bgp 64701
aggregate-address 10.1.0.0 255.255.0.0 summary-only
使用此配置, 仅当存在至少一个属于 10.1.0.0/16 的更具体前缀时, 才通告聚合 10.1.0.0/16。
权衡
折叠 Tier 1 的权衡包括:
优点:
- 更低的 CAPEX (更少的设备)
- 更简单的拓扑
- 更少的跳数
缺点:
- 更复杂的 Tier 2 配置
- 潜在的黑洞风险 (如果汇总配置不当)
- Tier 2 之间需要对等链路 (O(N^2) 扩展)
- 每个 Tier 2 的端口使用量增加
推荐
折叠 Tier 1 仅推荐用于:
- 较小的部署 (其中 Tier 2 计数低)
- 成本高度敏感的环境
- 运营商对汇总配置和风险有深入了解
对于大规模部署, 建议使用完整的 Tier 1 层以获得最大的扩展性和简单性。
8.2.2 Simple Virtual Aggregation (简单虚拟聚合)
简单虚拟聚合 (Simple Virtual Aggregation, SVA) 是一种技术, 允许在 Clos 拓扑内部进行路由汇总, 同时避免黑洞。
概念
SVA 的工作原理是:
- 边缘设备 (Tier 2/3) 通告更具体的前缀
- 核心设备 (Tier 1) 通告聚合前缀
- 边缘设备安装"丢弃路由"用于聚合以防止环路
示例
假设:
- 服务器前缀: 10.1.1.0/24, 10.1.2.0/24, ..., 10.1.255.0/24
- 聚合: 10.1.0.0/16
配置:
- Tier 2/3: 通告更具体的 /24 前缀
- Tier 1: 通告聚合 10.1.0.0/16
- Tier 2/3: 安装丢弃路由
ip route 10.1.0.0/16 null0
行为:
- Tier 1 到 Tier 2 的流量使用更具体的 /24 路由
- Tier 2 到 Tier 1 的流量可以使用聚合
- 如果流量到达 Tier 2 的不存在的子前缀, 它被丢弃路由黑洞化 (而不是创建环路)
好处
SVA 的好处包括:
- 减少的路由表大小 (在核心中)
- 改进的收敛 (更少的路由更新)
- 避免黑洞 (通过丢弃路由)
复杂性
SVA 增加了配置和操作复杂性:
- 需要仔细的地址规划
- 需要在多个设备上协调配置
- 丢弃路由的调试可能令人困惑
推荐
SVA 是一种高级技术, 仅应在以下情况下使用:
- 路由表大小是严重限制因素
- 运营团队对 SVA 概念有深入了解
- 已经进行了彻底的测试
对于大多数部署, 不进行拓扑内汇总的更简单方法是推荐的。
8.3 ICMP Unreachable Message Masquerading (ICMP 不可达消息伪装)
在某些情况下, 数据中心网络中的设备可能需要代表其他设备生成 ICMP 不可达消息。这种技术称为 ICMP 不可达消息伪装。
问题
在 EBGP Clos 设计中, 如第 5.2.3 节所述, 点对点链路前缀通常不通告到 BGP 中。这有利于减少路由表大小, 但会导致 ICMP 问题。
当数据包需要被分片但设置了 DF (Don't Fragment) 位时, 路由器应该发送 ICMP "Fragmentation Needed" 消息回源。但是, 如果路由器的接口 IP 地址不可达 (因为它没有通告到 BGP 中), 则源可能无法接收或处理 ICMP 消息。
解决方案 1: 通告所有接口
一个解决方案是通告所有点对点链路前缀到 BGP 中。但是, 如第 5.2.3 节所述, 这会增加路由表大小和复杂性。
解决方案 2: ICMP 伪装
另一个解决方案是让路由器在其 ICMP 消息中使用可达的源 IP (例如, 其环回地址) 而不是接口 IP。
ip icmp source-interface Loopback0
此配置告诉路由器使用其环回地址作为 ICMP 消息的源。由于环回通常通告到 BGP 中, 因此它是可达的, ICMP 消息可以成功传递。
ICMP 重定向
类似的问题可能出现在 ICMP 重定向消息中。一般建议在数据中心环境中禁用 ICMP 重定向:
no ip redirects
数据中心网络通常不需要 ICMP 重定向, 因为路由是由协议而不是主机驱动的。
路径 MTU 发现 (PMTUD)
对于依赖路径 MTU 发现的应用程序, 正确的 ICMP 操作至关重要。确保:
- ICMP 消息具有可达的源地址
- 防火墙和 ACL 不阻止 ICMP
- ICMP 速率限制不会过度抑制消息
推荐
对于 EBGP Clos 部署:
- 使用环回地址作为 ICMP 源
- 通告环回地址到 BGP
- 禁用 ICMP 重定向
- 确保 ICMP 可以遍历网络
这些简单的配置可以避免与 ICMP 相关的微妙问题。