2.2 当前主流的Overlay隧道技术
目前,市面上除了VMware外,Cisco和Microsoft等公司都能提供网络虚拟化解决方案。在介绍其网络虚拟化解决方案并进行对比之前,需要先讨论一下现在的网络虚拟化使用的Overlay技术分为哪几种。经各大厂商努力,已经有三种Overlay技术成形,即VXLAN、NVGRE、STT。
2.2.1 VXLAN技术
首先讨论VXLAN。VXLAN是Virtal Extensible LAN(虚拟可扩展局域网)的缩写。它是为了解决前文提到的数据中心的三个问题,由Cisco、VMware、Broadcom这几家行业内的巨头,外加快速窜红的新兴网络设备公司Arista Networks联合向IETF提出的。它能将通过OTV、TRILL、FabricPath等技术实现的二层网络扩展得更大。
VXLAN的核心技术理念是对现有标签技术进行彻底的改变,以优化VLAN的缺陷。其实Cisco之前提出的OTV协议已经使用了类似的技术——通过隧道机制,在使用了IS-IS协议的三层网络之上,叠加一个二层的虚拟网络,从而绕过VLAN标签的限制。而VXLAN则更进一步,它是将以太网报文封装在UDP传输层上的一种隧道转发模式。
VXLAN定义了一个名为VTEP(VXLAN Tunnel End Point,VXLAN隧道终结点)的实体。VTEP对数据包的封装可以在虚拟交换机上完成,也可以在物理交换机上完成。它会将数据在出服务器(主要是虚拟机,其实也可以是物理服务器)时封装到UDP中再发送到网络,在传输过程中这台服务器的MAC地址、IP地址、VLAN信息等,都不会再作为转发依据。如果VTEP功能直接集成到虚拟机的Hypervisor内,那么所有虚拟机流量在进入物理交换机之前,就可以在虚拟交换机所在的Hypervisor之上打上VXLAN标签和UDP包头,相当于在任意两点间建立了隧道。因此,VXLAN技术更适合虚拟化环境,且更应该把VTEP功能集成到服务器的虚拟交换系统内——如果VTEP在物理交换机上实现,那么物理交换机与虚拟交换机通信时,需要执行一次VXLAN-VLAN的转换,这样效率并不高。
由于虚拟机本身的VLAN信息对外已不可见,VXLAN添加了一个新的标签VNI(VXLAN Network Identifier,VXLAN标识符)。VNI取代VLAN用来标识VXLAN的网段,只有拥有相同的VNI,即在同一个VXLAN里的虚拟机才能实现二层通信,它类似于VLAN ID的作用。VNI是一个24比特的二进制标识符,把VLAN的4096(2的12次方)做了一个级数级别的扩展,达到了16777216(2的24次方)个网段,就目前超大规模数据中心而言,暂时是绰绰有余了。
新的UDP包头意味着VNI有新的帧结构。VTEP收到数据包时,会在这个数据包上增加4个部分,以形成新的帧头。如图2.7所示,这个新的帧头从内而外分别是VXLAN头部、UDP头部、外部三层IP头部、外部二层MAC头部。
VXLAN头部的作用是携带VTEP分配的VNI标识符。UDP头部是一个标准的UDP头部,包含了源目端口号,其中源端口号是VXLAN通过将原始以太网数据头部(MAC、IP、四层端口号等)进行哈希后得出的值,这样就能提供更好的负载均衡、更好的等价多路径;而目的端口尚未从IANA申请固定端口号。外部三层IP头部已不再是虚拟机的通信地址,而是隧道两端VTEP的通信地址——如果虚拟机的Hypervisor直接承担VTEP的工作,那么这个地址就是两台服务器的物理网卡IP地址。外部二层MAC头部与虚拟机原本自带的MAC地址已经没有任何关系了。
有了新的帧头,VTEP就可以依照VNI来决定流量走向,在整网的物理交换环境内完成数据转发。转发过程中,新的包头只有到达了目的地才会被对端的VTEP终结掉,这就意味着,VXLAN数据包在转发过程中保持了内部数据的完整性。这种数据转发机制叫做隧道机制——即链路两端有一对用于隧道封装的设备,类似IPSec VPN,其好处是可以减少对现网拓扑的改动,且方便网络在改动时实现快速收敛。
2.2.2 NVGRE技术
介绍完了VXLAN,再来讨论NVGRE。NVGRE是Network Virtualization using Generic Routing Encapsulation的缩写,是将以太网报文封装在GRE内的一种隧道转发模式,最初由Microsoft提出,并联合了Intel、HP、DELL等公司,向IETF提出。其实与VXLAN相比,它除了将MAC封装在GRE内(与VXLAN将MAC封装在UDP内不同)外,其他功能几乎完全相同。比如,NVGRE定义了一个类似VNI的TNI(Tenant Network Identifier),长度同样是24比特,同样可以扩展到16777216(2的24次方)个网段(NVGRE里面叫做租户)。
硬说两者有什么区别的话,就是VXLAN新的UDP头部中包含了对原始二层帧头的哈希结果,容易实现基于等价多路径的负载均衡,而GRE的头部实现负载均衡要困难些——很多网络设备不支持用GRE的Key来做负载均衡的哈希计算。
VXLAN和NVGRE技术有惊人的相似之处,或许两者都无法最终成为行业标准,只能在围绕着Cisco、VMware、Microsoft的战略联盟(Ecosystem)内部进行标准化。
2.2.3 STT技术
再来讨论另一种隧道技术STT(Stateless Transport Tunneling,无状态传输隧道),它是Nicira的私有协议。STT利用MAC over IP的机制,与VXLAN、NVGRE类似,把二层的帧封装在一个IP报文之上。STT协议很聪明地在STT头部前面增加了一个TCP头部,把自己伪装成一个TCP包。但和TCP协议不同的是,这只是一个伪装的TCP包,利用了TCP的数据封装形式,但改造了TCP的传输机制——数据传输不遵循TCP状态机,而是全新定义的无状态机制,将TCP各字段的意义重新定义,无需三次握手建立TCP连接,也没有用到TCP那些拥塞控制、丢包重传机制,因此STT被Nicira称为无状态TCP。STT技术除了用于隧道封装,还可以用于欺骗网卡——数据中心内部的TCP报文往往非常大,在发出去之前经常需要分片,但分片以前往往需要CPU处理,从而影响CPU性能,因此现在绝大多数服务器网卡支持报文分片,不由CPU来处理,也就减轻了CPU的负担。然而通过网卡进行分片只能针对TCP报文,通过VXLAN或者NVGRE协议封装的原始TCP报文到达网卡后,网卡认为它们不是TCP报文,就无法分片了,这就还是需要CPU来进行分片工作,也就增加了CPU负担,降低了服务器性能(最新推出的一些网卡声称可以对VXLAN进行分片,但其技术上不成熟)。而STT的头部是TCP格式,这样网卡就会认为它是TCP,从而对大包进行分片。但实际上它不是TCP,也无需三次握手,因此提高了CPU的效率。STT技术在Nicira被VMware收购前只能用于Nicira NVP平台之上,被收购后主要用在部署了多Hypervisor的NSX网络虚拟化环境,即NSX-MH架构中。
2.2.4 三种Overlay技术的对比和应用场景
介绍完三种Overlay隧道技术,我们将其做一个对比,如表2.2所示。
VMware的NSX-V网络虚拟化解决方案在Overlay层使用VXLAN技术,为虚拟网络提供服务——利用VMware的NSX环境中支持VXLAN的分布式逻辑交换机对数据包进行封装和解封装,从而实现网络虚拟化,而其中间的物理网络变得就不重要了。VXLAN甚至可以在多数据中心之间进行扩展,因为无论数据中心之间的运营商链路、路由协议多么复杂,只要打通了隧道,就可以看作一个简单的二层链路。VMware NSX利用这个技术,在三层网络之实现了大二层扩展和多租户环境。
其他物理硬件厂商近几年新推出的交换机,大多都支持VXLAN,可以由连接服务器的ToR交换机对VXLAN流量进行封装和解封装。当然这种解决方案不是基于主机的Overlay,也没有实现控制平面和转发平面的分离。
而STT作为先前的Nicira私有协议,在其被VMware收购后,主要运用在NSX-MH网络虚拟化架构中,是NSX-MH中的默认隧道协议。这是因为STT有其绝佳的优势——可以减轻服务器CPU的负担。当然NSX-MH同样也支持GRE和VXLAN。
而NVGRE目前已广泛用于以Microsoft Hyper-V搭建的虚拟化环境中,但主要应用在Azure公有云,而没有在企业级的虚拟化环境中广泛部署。它与VMware的Overlay方案非常类似——在Hyper-V的Hypervisor之上给数据包打上Tag(标签),封装进GRE隧道,到达目的Hypervisor时解封装。
未来Overlay技术究竟走向何方,这就要看几大IT巨头如何斗法了。这些巨头们身边都有战略合作伙伴,都打造了一个属于自己的生态圈。
2.2.5 下一代Overlay技术——Geneve
最后来介绍另一种未来会出现的Overlay技术。诚然,Overlay解决了一些问题,但其封装头格式固定,不利于修改和扩展——毕竟一些特殊应用的数据包需要在封装过程中添加一些额外的信息。比如在端口镜像的报文附加逻辑交换机目的端口信息,用于目的端口不能在隧道终点被可视化的情况;比如在报文附加逻辑交换机源端口信息或应用及服务的上下文,以指导隧道终端的转发决策或服务策略实施;比如标识Traceflow报文,用于抓包或整网健康状况的可视化。因此,VMware、Microsoft、Red Hat、Intel几家公司正在联合研发Geneve(Generic Network Virtualization Encapsulation)协议来解决这些问题。它的报文格式其实也使用了UDP进行封装,也有24比特的网段级别,但是它在报文中增加了一个可选字段(Option),允许虚拟化应用实现扩展。Geneve设想的报文如图2.8所示。
在将来,Geneve协议会非常适用于服务链的场景。例如,NSX可以创建一个服务的逻辑连接(如图2.9所示,它可以为VPN服务、防火墙服务、第三方服务之间的关系创建成一个逻辑关系),而这些逻辑链的节点之间需要传递元数据。有了Geneve协议,头部可以进行变更和扩展后,就可以指示报文的下一个链节点,并将报文分类(Classification)的结果传递到一个服务。
Geneve协议不仅支持将IPv4封装在UDP里,还支持IPv6。该研发项目已提交IETF。或许在不久的将来,我们就可以看到这种技术被标准化,并广泛用于数据中心内部。