1、Overlay网络与SDN
VXLAN(虚拟可扩展局域网),是一种虚拟化隧道通信技术。它是一种Overlay(覆盖网络)技术,通过三层的网络来搭建虚拟的二层网络。
对计算机网络或者Kubernetes网络稍有了解的工程师都应该听说过延展网络(OverlayNetwork),Overlay网络其实并不是一门新技术,它是指构建在另一个网络上的计算机网络,这是一种网络虚拟化技术的形式,近年来云计算虚拟化技术的演进促进了网络虚拟化技术的应用。
因为Overlay网络是建立在另一个计算机网络之上的虚拟网络,所以它不能独立出现,Overlay底层依赖的网络就是Underlay网络,这两个概念也经常成对出现。
Underlay网络是专门用来承载用户IP流量的基础架构层,它与Overlay网络之间的关系有点类似物理机和虚拟机。Underlay网络和物理机都是真正存在的实体,它们分别对应着真实存在的网络设备和计算设备,而Overlay网络和虚拟机都是依托在下层实体使用软件虚拟出来的层级。
在分析Overlay网络的作用之前,我们需要对它的常见实现有大概的了解,在实践中我们一般会使用虚拟局域网扩展技术(VirtualExtensibleLAN,VxLAN)组建Overlay网络。在下图中,两个物理机可以通过三层的IP网络互相访问:
VxLAN使用虚拟隧道端点(VirtualTunnelEndPoint、VTEP)设备对服务器发出和收到的数据包进行二次封装和解封。
上图中两个VTEP会相互连接并获得网络中的MAC地址、IP地址等信息,例如,服务器1中的VTEP需要知道想要访问绿色网络中的10.0.0.2虚拟机需要先访问IP地址为204.79.197.200的服务器2。这些配置可以被网络管理员手动配置、自动学习、也可以通过上层的管理器设置。当绿色的10.0.0.1虚拟机想要向绿色的10.0.0.2发送数据时,会经过以下几个步骤:
1、绿色的10.0.0.1会将IP数据包发送给VTEP;
2、服务器1的VTEP收到10.0.0.1发送的数据包后;
3、服务器2的VTEP收到UDP数据包后;
4、绿色的10.0.0.2会收到绿色服务器10.0.0.1发送的数据包;
在数据包的传输过程中,通信的双方都不知道底层网络做的这些转换,它们认为两者可以通过二层的网络互相访问,但是实际上经过了三层IP网络的中转,通过VTEP之间建立的隧道实现了连通。除了VxLAN之外,Overlay网络还有很多实现方案,不过也都大同小异。Overlay网络虽然能够利用底层网络在多数据中心之间组成二层网络,但是它的封包和拆包过程也会带来额外开销,所以为什么我们的集群需要Overlay网络呢,本文将介绍Overlay网络解决的三个问题:
云计算中集群内的、跨集群的或者数据中心间的虚拟机和实例的迁移比较常见;
单个集群中的虚拟机规模可能非常大,大量的MAC地址和ARP请求会为网络设备带来巨大的压力;
传统的网络隔离技术VLAN只能建立4096个虚拟网络,公有云以及大规模的虚拟化集群需要更多的虚拟网络才能满足网络隔离的需求;
2、VXLAN协议原理
VXLAN有几个常见的术语:
VXLAN网络的边缘设备,用来进行VXLAN报文的处理(封包和解包)。VTEP可以是网络设备(比如交换机),也可以是一台机器(比如虚拟化集群中的宿主机)。
VNI是每个VXLAN段的标识,是个24位整数,一共有16777216,一般每个VNI对应一个租户,也就是说使用VXLAN搭建的公有云可以理论上可以支撑千万级别的租户。
隧道是一个逻辑上的概念,在VXLAN模型中并没有具体的物理实体向对应。隧道可以看做是一种虚拟通道,VXLAN通信双方认为自己是在直接通信,并不知道底层网络的存在。从整体来说,每个VXLAN网络像是为通信的虚拟机搭建了一个单独的通信通道,也就是隧道。
上图所示为VXLAN的工作模型,它创建在原来的IP网络(三层)上,只要是三层可达(能够通过IP相互通信)的网络就能部署VXLAN。在VXLAN网络的每个端点都有一个VTEP设备,负责VXLAN协议报文的解包和封包,也就是在虚拟报文上封装VTEP通信的报文头部。
物理网络上可以创建多个VXLAN网络,可以将这些VXLAN网络看成一个隧道,不同节点上的虚拟机/容器能够通过隧道直连。通过VNI标识不同的VXLAN网络,使得不同的VXLAN可以相互隔离。
IANA(
InternetAs-signedNumbersAutority)分配了4789作为VXLAN的默认目的端口号。
在上面添加的二层封装之后,再添加底层网络的IP头部(20字节)和MAC头部(14字节),这里的IP和MAC是宿主机的IP地址和MAC地址。
同时,这里需要注意MTU的问题,传统网络MTU一般为1500,这里加上VXLAN的封装多出的(36+14/18,对于14的情况为access口,省去了4字节的VLANTag)50或54字节,需要调整MTU为1550或1554,防止频繁分包。
VXLAN的Flood与Learn:
总的来说,VXLAN报文的转发过程就是:原始报文经过VTEP,被Linux内核添加上VXLAN头部以及外层的UDP头部,再发送出去,对端VTEP接收到VXLAN报文后拆除外层UDP头部,并根据VXLAN头部的VNI把原始报文发送到目的服务器。但这里有一个问题,第一次通信前双方如何知道所有的通信信息?这些信息包括:
第一个问题简单,VTEP通常由网络管理员来配置。要回答后面两个问题,还得回到VXLAN协议的报文上,看看一个完整的VXLAN报文需要哪些信息:
内层报文:通信双方的IP地址已经明确,只需要VXLAN填充对方的MAC地址,因此需要一个机制来实现ARP功能。
VXLAN头部:只需要知道VNI。一般直接配置在VTEP上,要么提前规划,要么根据内层报文自动生成。
UDP头部:需要知道源端口和目的端口,源端口由系统自动生成,目的端口默认是4789。
IP头部:需要知道对端VTEP的IP地址,这个是最关键的部分。
实际上,VTEP也会有自己的转发表,转发表通过泛洪和学习机制来维护,对于目标MAC地址在转发表中不存在的未知单播,广播流量,都会被泛洪给除源VTEP外所有的VTEP,目标VTEP响应数据包后,源VTEP会从数据包中学习到MAC,VNI和VTEP的映射关系,并添加到转发表中,后续当再有数据包转发到这个MAC地址时,VTEP会从转发表中直接获取到目标VTEP地址,从而发送单播数据到目标VTEP。
VTEP转发表的学习可以通过以下两种方式:
3、Overlay与SDN
在使用VxLAN搭建的Overlay网络中,网络会将虚拟机发送的数据重新封装成IP数据包,这样网络只需要知道不同VTEP的MAC地址,由此可以将MAC地址表项中的几十万条数据降低到几千条,ARP请求也只会在集群中的VTEP之间扩散,远端的VTEP将数据拆包后也仅会在本地广播,不会影响其他的VTEP,虽然这对于集群中的网络设备仍然有较高的要求,但是已经极大地降低了核心网络设备的压力。
Overlay网络其实与软件定义网络(Software-definednetworking、SDN)密切相关,而SDN引入了数据平面和控制平面,其中数据平面负责转发数据,而控制平面负责计算并分发转发表。VxLAN的RFC7348中只定义了数据平面的内容,由该技术组成的网络可以通过传统的自学习模式学习网络中的MAC与ARP表项5,但是在大规模的集群中,我们仍然需要引入控制平面分发路由转发表。
4、总结
Overlay网络只是一种在物理网络上的虚拟网络,使用该技术并不能直接解决集群中的规模性等问题,而VxLAN也不是组建Overlay网络的唯一方法,在不同场景中我们可以考虑使用不同的技术,例如:NVGRE、GRE、STT等。