我第一次使用覆盖式隧道是在 2003 年,当时我正在参与一个项目,创建一个基于 Squid 和 Cisco WCCP(Web 缓存通信协议)的透明代理。Cisco 路由器和 Squid 代理之间的部分配置需要使用 GRE(通用路由封装)隧道进行通信。那时,我并不完全了解隧道协议的必要性,到了现在,我已经知道它们的重要性了,因为在大型多租户云中,VLAN 已经不够用了。
VLAN 的开发旨在将网络流量划分成较小、较不复杂的网络。缺点是它们只有一个固定的 12 位字段,这意味着一个网络拓扑中只能有大约 4000 个 VLAN。在 1990 年代末和 2000 年代初,这种规模尚可支持联网。但是,随着云时代和多租户环境的到来,需要更多独立的网络隧道。
为解决这个问题,各家供应商提出了各种解决方案:VXLAN(虚拟可扩展局域网)、NVGRE(使用通用路由封装的网络虚拟化)和 STT(无状态传输隧道)。这三者都将应用数据封装在一个全新的更大的固定标头字段中。VXLAN 和 NVGRE(后者主要由 Microsoft 使用)的标头大小为 24 位,而 STT 则具有 64 位的标头大小。这些封装隧道方法都不需要对硬件网络基础架构进行任何更改,但有些供应商提供的硬件可以帮助提高解决方案的效率。但是,这些解决方案之间互不兼容。
然而,在当前大型多租户云时代,过去的成果并没有完全失去意义。一种新的网络虚拟化标准已经出现:GENEVE(通用网络虚拟化封装),它有望解决早期规范的局限性,并支持 VXLAN、NVGRE 和 STT 的所有功能。许多人认为,GENEVE 最终可能会完全取代这些较早的格式。
GENEVE 的既定目标是仅定义一种封装数据格式。与早期格式不同,它不包含控制平面的任何信息或规范。作者是这样说的:
“确定数据格式时有一个明显的优势:大多数协议只是表面上不同,重复他人的工作不会带来任何优势。但控制平面却并非如此,它们存在很多本质上的区别。考虑到需求、目标和部署方案的多样性,实现标准化也没有很明确的依据。”
为实现这些目标,GENEVE 作者一致认为数据格式应尽可能灵活和可扩展。虽然 VXLAN 和 NVGRE 中当前的 24 位隧道标识符字段以及 STT 中的 64 位足以指定所需的所有虚拟网络,但他们预计未来的开发人员会希望细分这一字段以承载除虚拟网络标识符以外的信息。他们将此字段的潜在用途与当前在虚拟服务器内或机箱交换机中的线卡之间交换的系统状态信息进行了比较。他们发现,无法指定足以供将来所有可能用途使用的固定字段大小。此外,GENEVE 的作者还借鉴了许多其他已证明生命周期较长的协议。诸如 BGP(边界网关协议)、LLDP(链路层发现协议)、IS-IS(中间系统 - 中间系统)等许多协议已经存在了几十年,而且仍然像以往一样受欢迎。
原因很简单:它们是可扩展的。它们会随着时间的推移而增加新的功能,但不是通过修改基础协议,而是通过添加新的可选功能。
GENEVE 封装的数据包设计为通过标准网络设备传输。利用单播或多播寻址,数据包从一个隧道端点发送到一个或多个隧道端点。客户端应用及其执行所在的主机不会以任何方式被修改。应用生成相同的 IP 数据包,就好像它们通过硬件交换机和路由器进行通信一样。数据包中包含的目标 IP 地址仅在云租户的虚拟网络内有效。然后,隧道端点将最终用户 IP 数据包封装在 GENEVE 标头中,并添加指定租户虚拟网络的隧道标识符,后面可以跟任何选项。标头由表示这是 GENEVE 数据包的字段、选项(如果有)的总长度、隧道标识符和一系列选项组成。然后,完成的数据包以 IPv4 和 IPv6 支持的标准 UDP 数据包传输到目的地端点。接收方隧道端点剥离标头,解释所包含的任何选项,并将最终用户数据包定向到其在隧道标识符所指示的虚拟网络内的目的地。
GENEVE 规范提供了有关如何通过避免碎片化并利用 ECMP(等成本多路径)和 NIC 硬件卸载工具来实现高效运维的方法建议。该规范还提供了有关如何支持差异化服务和显式拥塞通知的选项。作者认为,在同一系统上使用 GENEVE 和一种或多种其他封装方法时,不会出现问题。GENEVE 隧道端点将仅互相通信,网络基础架构对数据包的处理方式与任何其他 UDP 数据包相同。这种数据格式支持 VXLAN、NVGRE 和 STT 的所有功能,因此最终这三种较早格式的使用量可能会下降。由于没有指定控制平面协议,作者希望它支持将任何协议与其他封装方法一起使用。与其他封装方法相比,一个关键优势在于 GENEVE 灵活的选项格式,以及使用 IANA(互联网号码分配局)来指定选项类。开发人员可以动态包含任意数量的选项,不必限制为 24 位,也不会在只需要 64 位字段的一小部分时产生 64 位字段的开销。
过渡到 GENEVE 无法一蹴而就。其他封装方法已经使用了一段时间,并且可以在同一系统内运行多种方法。不过,GENEVE 目前正被用作 OVN(开放虚拟网络)的默认隧道协议,在未来的 OpenStack 版本中,OVN 又会作为 OVS(OpenvSwitch)的实施进行推广。
使用大型多租户云的经验将会越来越多,没有一种封装方法会成为公认的标准。但 GENEVE 凭借其灵活的选项格式,并且支持其他方法的所有功能,将成为广泛采用的热门选择。
2017年 6月 22日Benjamin Schmaus
Benjamin Schmaus 是北美中部地区的红帽云 TAM(大客户技术经理)。他自 1998 年开始参与 Linux 的相关工作,曾为多个行业的业务环境提供支持,包括零售、国防、软件、金融、高等教育和初级教育。最近,他一直专注于帮助我们的客户部署、运维和支持红帽 OpenStack 平台和红帽 Ceph 存储。
https://www.redhat.com/zh/blog/what-geneve