除了前面讨论的 local, flat, vlan 这几类网络,OpenStack 还支持 vxlan 和 gre 这两种 overlay network。linux
overlay network 是指创建在其余网络上的网络。 该网络中的节点能够看做经过虚拟(或逻辑)链路链接起来的。 overlay network 在底层可能由若干物理链路组成,但对于节点,不须要关心这些底层实现。网络
例如 P2P 网络就是 overlay network,隧道也是。 vxlan 和 gre 都是基于隧道技术实现的,它们也都是 overlay network。spa
目前 linux bridge 只支持 vxlan,不支持 gre;open vswitch 二者都支持。 vxlan 与 gre 实现很是相似,并且 vxlan 用得较多,因此本教程只介绍 vxlan。教程
VXLAN 全称 Virtual eXtensible Local Area Network。路由
正如名字所描述的,VXLAN 提供与 VLAN 相同的以太网二层服务,可是拥有更强的扩展性和灵活性。与 VLAN 相比,VXLAN 有下面几个优点:部署
支持更多的二层网段。 VLAN 使用 12-bit 标记 VLAN ID,最多支持 4094 个 VLAN,这对于大型云部署会成为瓶颈。VXLAN 的 ID (VNI 或者 VNID)则用 24-bit 标记,支持 16777216 个二层网段。虚拟机
能更好地利用已有的网络路径。 VLAN 使用 Spanning Tree Protocol 避免环路,这会致使有一半的网络路径被 block 掉。VXLAN 的数据包是封装到 UDP 经过三层传输和转发的,可使用全部的路径。it
避免物理交换机 MAC 表耗尽。 因为采用隧道机制,TOR (Top on Rack) 交换机无需在 MAC 表中记录虚拟机的信息。扩展
VXLAN 是将二层创建在三层上的网络。 经过将二层数据封装到 UDP 的方式来扩展数据中心的二层网段数量。 VXLAN 是一种在现有物理网络设施中支持大规模多租户网络环境的解决方案。 VXLAN 的传输协议是 IP + UDP。配置
VXLAN 定义了一个 MAC-in-UDP 的封装格式。 在原始的 Layer 2 网络包前加上 VXLAN header,而后放到 UDP 和 IP 包中。 经过 MAC-in-UDP 封装,VXLAN 可以在 Layer 3 网络上创建起了一条 Layer 2 的隧道。
VXLAN 包的格式以下:
如上图所示,VXLAN 引入了 8-byte VXLAN header,其中 VNI 占 24-bit。 VXLAN 和原始的 L2 frame 被封装到 UDP 包中。
这 24-bit 的 VNI 用于标示不一样的二层网段,可以支持 16777216 个 LAN。
VXLAN 使用 VXLAN tunnel endpoint (VTEP) 设备处理 VXLAN 的封装和解封。 每一个 VTEP 有一个 IP interface,配置了一个 IP 地址。VTEP 使用该 IP 封装 Layer 2 frame,并经过该 IP interface 传输和接收封装后的 VXLAN 数据包。
下面是 VTEP 的示意图:
VXLAN 独立于底层的网络拓扑; 反过来,两个 VTEP 之间的底层 IP 网络也独立于 VXLAN。 VXLAN 数据包是根据外层的 IP header 路由的,该 header 将两端的 VTEP IP 做为源和目标 IP。
下节咱们经过例子进一步理解 VXLAN 封装和转发包的过程,并探讨 Linux 对 VXLAN 的支持。