4. VXLAN
在多租户环境中存在 VM 时, VXLAN (Virtual eXtensible Local Area Network) 满足前文所述 Layer 2 和 Layer 3 数据中心网络基础设施的需求. 它运行在现有网络基础设施之上, 并提供一种"拉伸" Layer 2 网络的方法. 简而言之, VXLAN 是 Layer 3 网络之上的 Layer 2 overlay 方案. 每个 overlay 称为一个 VXLAN segment. 只有位于同一 VXLAN segment 内的 VM 才能相互通信. 每个 VXLAN segment 通过一个 24 bit 的 segment ID 标识, 该 ID 称为 "VXLAN Network Identifier (VNI)". 这允许同一管理域内最多共存 16 M 个 VXLAN segments.
VNI 标识由单个 VM 发起的内部 MAC frame 的作用域. 因此, 不同 segment 之间可以存在重叠的 MAC 地址, 但流量绝不会"跨越"到其他 segment, 因为流量使用 VNI 隔离. VNI 位于外部头部中, 该外部头部封装由 VM 发起的内部 MAC frame. 在以下各节中, 术语 "VXLAN segment" 与 "VXLAN overlay network" 可以互换使用.
由于这种封装, VXLAN 也可以称为一种隧道方案, 用于在 Layer 3 网络之上叠加 Layer 2 网络. 隧道是无状态的, 因而每个 frame 都按一组规则封装. 下文讨论的隧道端点, 即 VXLAN Tunnel End Point (VTEP), 位于承载 VM 的服务器上的 hypervisor 内. 因此, 与 VNI 和 VXLAN 相关的隧道/外部头部封装只有 VTEP 知道, VM 永远看不到它 (见图 1). 请注意, VTEP 也可能位于物理交换机或物理服务器上, 并且可以用软件或硬件实现. 第 6 节有关 VXLAN 部署场景的讨论中包含一个 VTEP 位于物理交换机上的用例.
以下各节讨论 VXLAN 环境中的典型流量场景, 使用一种控制方案, 即数据平面学习. 在该方案中, VM MAC 到 VTEP IP 地址的关联通过源地址学习发现. 组播用于承载未知目标, 广播和组播 frame.
除了基于学习的控制平面之外, 还可以采用其他方案分发 VTEP IP 到 VM MAC 的映射信息. 可选方案包括由各个 VTEP 基于中央权威或目录进行查找, 由中央权威向 VTEP 分发该映射信息, 等等. 这些方案有时分别被描述为 push 和 pull 模型. 本文档将重点讨论作为 VXLAN 控制平面的数据平面学习方案.
4.1. 单播 VM 到 VM 通信
考虑 VXLAN overlay network 中的一个 VM. 该 VM 并不知道 VXLAN 的存在. 为了与不同主机上的 VM 通信, 它像通常一样发送一个以目标为目的地的 MAC frame. 物理主机上的 VTEP 查找该 VM 关联的 VNI. 然后它判断目标 MAC 是否位于同一 segment 中, 以及是否存在目标 MAC 地址到远端 VTEP 的映射. 如果存在, 则在原始 MAC frame 前添加一个外部头部, 该头部由外部 MAC, 外部 IP 头部和 VXLAN 头部组成 (frame 格式见第 5 节图 1). 封装后的 packet 被转发到远端 VTEP. 远端 VTEP 收到后验证 VNI 的有效性, 并检查该 VNI 上是否存在 MAC 地址与内部目标 MAC 地址匹配的 VM. 如果存在, 则移除 packet 的封装头部, 并将其传递给目标 VM. 目标 VM 永远不知道 VNI, 也不知道该 frame 是通过 VXLAN 封装传输的.
除了将 packet 转发给目标 VM 外, 远端 VTEP 还会学习内部源 MAC 到外部源 IP 地址的映射. 它将该映射存储在表中, 因而当目标 VM 发送响应 packet 时, 不需要对响应 packet 执行 "unknown destination" 泛洪.
源 VM 在发送前确定目标 VM 的 MAC 地址, 其方式与非 VXLAN 环境相同, 但第 4.2 节所述情况除外. 仍使用广播 frame, 但这些 frame 会封装在组播 packet 中, 详见第 4.2 节.
4.2. 广播通信以及到组播的映射
考虑源主机上的 VM 尝试使用 IP 与目标 VM 通信. 假设二者位于同一子网, 该 VM 会发送 Address Resolution Protocol (ARP) 广播 frame. 在非 VXLAN 环境中, 该 frame 会使用 MAC broadcast 经由承载该 VLAN 的所有交换机发送出去.
使用 VXLAN 时, 包含 VXLAN VNI 的头部会和 IP 头部, UDP 头部一起插入到 packet 开头. 但是, 该广播 packet 会发送到实现该 VXLAN overlay network 的 IP 组播组.
为实现这一点, 需要在 VXLAN VNI 与其将使用的 IP 组播组之间建立映射. 该映射在管理层完成, 并通过管理通道提供给各个 VTEP. 使用该映射, VTEP 可以向上游交换机/路由器提供 IGMP membership reports, 以便按需加入或离开 VXLAN 相关的 IP 组播组. 这将支持基于特定组播地址在该主机上是否存在成员, 对特定组播流量地址的叶节点进行剪枝 (见 [RFC4541]). 此外, 使用 Protocol Independent Multicast - Sparse Mode (PIM-SM, 见 [RFC4601]) 等组播路由协议, 可以在 Layer 3 网络内提供高效的组播树.
VTEP 将使用 (*,G) joins. 这是必要的, 因为 VXLAN tunnel sources 的集合未知, 且可能会随着 VM 在不同主机上启动或关闭而频繁变化. 另一个旁注是, 由于每个 VTEP 都可以同时充当组播 packet 的源和目标, 因此 bidirectional PIM (BIDIR-PIM, 见 [RFC5015]) 之类的协议会更高效.
目标 VM 使用 IP 单播发送标准 ARP 响应. 该 frame 会使用 IP 单播 VXLAN 封装, 被封装回连接发起 VM 的 VTEP. 这是可行的, 因为 ARP 响应的目标 MAC 到 VXLAN tunnel end point IP 的映射此前已通过 ARP 请求学习到.
请注意, 组播 frame 和 "unknown MAC destination" frame 也与广播 frame 类似, 使用组播树发送.
4.3. 物理基础设施要求
当网络基础设施内部使用 IP 组播时, 网络内各个 Layer 3 IP 路由器/交换机可以使用 PIM-SM 等组播路由协议. 该协议用于构建高效的组播转发树, 使组播 frame 只发送给请求接收它们的主机.
同样, 连接源 VM 和目标 VM 的实际网络不要求必须是 Layer 3 网络: VXLAN 也可以在 Layer 2 网络上运行. 无论哪种情况, 都可以使用 IGMP snooping 在 Layer 2 网络内实现高效的组播复制.
VTEP MUST NOT 对 VXLAN packets 进行分片. 由于 frame 尺寸较大, 中间路由器可能会对封装后的 VXLAN packets 进行分片. 目标 VTEP MAY 静默丢弃这类 VXLAN fragments. 为了确保端到端流量无需分片即可交付, RECOMMENDED 将整个物理网络基础设施中的 MTU (Maximum Transmission Units) 设置为能够容纳因封装而变大的 frame 尺寸的值. 也可以使用 Path MTU discovery 等其他技术来满足这一要求 (见 [RFC1191] 和 [RFC1981]).