VXLAN与EVPN的一些理解
笔者在四月底换了一份新的工作,新部门主要做云网络,里面涉及不少我不了解的东西,因此在学习和积累的过程中,形成了一些文档。
这些文档本身与主流Java技术无关,更多还是笔者自己记录整理思绪的。
另外由于前段时间在求职,而现在入职后又在熟悉新公司业务,因此也好久没更新个人博客了,这篇笔记算是一篇水文,好让自己不会停更那么久难看。
1. VLAN
说VXLAN前,我们先说一下VLAN,VLAN的作用是二层隔离。也即对原本在同一个子网(二层)下的多个设备再细分组。
如上图所示,多个终端连接在同一个交换机下形成一个二层网络,但二层网络比如以太网在设计的时候存在一个弊端:以太网是基于广播来设计的。如果一个二层网络下的设备过多,将会存在广播风暴问题。比如终端A发送一条ARP,这个ARP会被交换机广播到这个子网下的所有设备(假设交换机内查不到mac,ip映射关系),网络中存在过多的无意义广播消息会影响设备的通信效率。
因此为解决这一问题就提出了VLAN概念,VLAN是逻辑隔离,将我们上面说的网络再进行分组,让广播只在这个小组内传播,不会到别的组。
如上图所示。广播只会在一个VLAN内传播,而不会在整个二层传播。这种情况下,交换机维护的Mac地址与端口映射表又多加了一个vlanId字段。
通过VLAN,我们将原本物理上在同一子网的设备划分成了多个逻辑上不同子网(或者说不同二层)的设备。实际上,如果不使用VLAN,而是多加几台交换机,也依然可以达到二层隔离的目的,但加交换机成本就会上来,因此我觉得VLAN的发明其实就是对交换这一资源的复用,可以让一个交换机资源也能划分多个二层网络。
VLAN协议设计如下:
它在原来的以太网头中加了4个字节的VLAN标签,这4个字节中,比较有意义的就是12bit的VID,VID就是VLAN_ID,因此一个二层网络下可以划分2^12=4096个VLAN。
2 VXLAN
vlan隔离二层网络看起来很好,但这里存在一个比较大的问题:vlan是完全基于物理连线来隔离的。随着云的发展,VLAN变得越来越不灵活。我们举个例子:
假设现在有两台物理机A和B,它们分别和交换机相连,根据连接的物理端口的不同,物理机A和物理机B属于不同的VLAN,数据发到交换机会自动根据端口打上VLAN Tag。现在物理机A和B内有若干台虚拟机,这些虚拟机有自己的IP和MAC,通过物理机与交换机的物理连接发送数据。因此物理机A内的VM都属于VLAN1,而物理机B的VM都属于VLAN2。
假设此时物理机A内有100个虚拟机在被使用,而物理机B内只有3台虚拟机被使用。如果此时我想再创建一台VLAN1的虚拟机,依然只能在物理机A内创建,使用物理机A的资源。很明显,这会导致资源的使用不均衡。这一根本原因是物理的网络连接限制了我们对虚拟机的创建。除此以外,如果我们想做资源迁移,将虚拟机从物理机A迁到物理机B也会很麻烦。还有,我们知道交换机内会存储一些信息,如Mac地址与IP映射关系,Mac与端口的关系等,上面这种设计会导致物理机内的每一个虚拟机的IP,Mac等信息都会记录在交换机内。云上虚拟化的时候,一台物理设备可能能够创建成百上千台虚拟机,而交换机的内存又很珍贵有限,因此这样会导致交换机的映射表溢出。
VXLAN很好的解决了上面的问题。
VXLAN是基于overlay设计的,它的网络会独立于物理网络,VXLAN能做到即使是在不同物理机、不同交换机甚至不同地域的两个虚拟机也可以在一个二层下。VXLAN类似于L2层的VPN,它可以将任意两个(或多个)虚拟机连接起来,把它们归为一个L2层。
VXLAN的核心其实是将二层以太网信息进行封装,在三层网络上传递。
我们以上图为例,上图中颜色相同的虚机都在同一个二层网络下,假设现在虚机1想通过二层转发给虚机4发送消息:
由于虚机1认为自己和虚机4在同一个子网下,因此目的Mac会直接填写虚机4的mac地址(这里忽略ARP)。这与三层转发是完全不同的,对于三层转发,虚机1会填目的IP是虚机4,但目的Mac是默认网关。这里发送的包就好像虚机1和虚机4真的在一个二层网络下一样。数据包到了VTEP,VTEP有VSI接口,因此VTEP清楚虚机1和虚机4不在一个子网下的,这时候就需要VXLAN ,将虚机1发的包通过UDP封装,以三层协议的形式在骨干路由上传递,最终会传递到虚机4所在的网络下的那个VTEP上,这个VTEP又会解VXLAN包,然后将解析后的包转发到自己网络内的虚机4上,这样就达到了两个虚机间的L2层通信。因此我个人认为VXLAN算是L2层的VPN,就好像在虚机1和虚机4之间搭了一个L2层的专线一样。
可以看到,通过VXLAN,我们很好的做到了即使在不同网络,不同区域的虚机,也可以划分在一个L2层,这样就完全打破了物理网络的限制,因此VXLAN是基于overlay设计的。
其中VXLAN的协议如下:
可以看到VXLAN将原始以太网帧封装为数据,在外层先加上了VXLAN头,再加上UDP头,再加上IP和以太网头,让原始的以太网信息可以以三层网络在骨干路由中转发。
3. EVPN
SDN的一个核心思想是:把网络控制层面(controller plane)与数据转发层面(data plane)分离。通过分离控制层面,可以提高网络整体的管控能力。统一的网络管控加上分散在各个转发设备(也可能就是服务器)上的转发层面,可以更好的实现网络的管理能力。
上面我们的VXLAN虽然好,但仍然存在一个问题:没有分离控制层和数据层。交换机习得的数据依然是靠解析以太网包来更新的。这会有什么问题呢?
我们将刚才的例子再拿过来:刚才我们说虚机1给虚机4发消息的时候,由于在同一个子网下,因此目的Mac是虚机4的Mac。但往往通信的时候,我们是只知道目的IP而不知道目的Mac的,此时就需要ARP请求。假设此时虚机1发送ARP给VTEP1,如果VTEP1内没有虚机4的Mac-IP映射要怎么办?那么VTEP1就要将这个ARP广播出去,当然广播也不是随意广播,它会参照自己的MAC-VRF表,只给那些存在同一个VXLAN的VTEP发消息(还会存在站内广播),因此虽然说是广播,但不如说是多次的单播,VTEP会挨个给那些存在同一个VXLANID的VTEP发这个ARP消息(也是封装成VXLAN),假设此时VTEP2收到了ARP请求,它如果自己也查不到映射关系,会泛洪到与VXLAN相等的VSI A的子网内,此时虚机4应答,然后VTEP2习得虚机4的IP-Mac映射关系(其实还有虚机1的),并将应答封装成VXLAN返回给VTEP1,VTEP1收到应答,解VXLAN,习得虚机4的IP-Mac映射关系,然后将应答传给虚机1,这时完成整个ARP。
但这个例子很明显存在一些问题:
- ARP广播依然泛洪到了骨干路由
- VTEP对于Mac-IP信息的学习依然是靠数据转发,通过数据转发,解析数据习得,如果数据不发送就永远没有这个条目。因此其实是只有数据层,没有控制层。
- 我们其实假设VTEP1知道下一跳是VTEP2,但这个消息到底是怎么知道的?VTEP之间的隧道是如何创建的?VXLAN往往依然是通过组播来习得的,或者手动的创建。
这里我们就需要引入EVPN,我个人认为如果把VXLAN认为是L2层VPN的数据层,那EVPN就是L2层VPN的控制层。
我们还以刚才那个例子来说,看下EVPN是如何解决上面说的问题的:
EVPN的核心其实就是让多个VTEP能通过MP-BGP协议通信。MP-BGP消息主要携带的是NLRI数据,NLRI数据上可能包含VTEP的路由信息,Mac-IP映射信息,VXLAN信息等。VTEP通信彼此交换它们的信息,就很容易习得很多数据,也可以自动建立VTEP间的隧道。
还拿上面的例子来说:
首先虚机4上线会将自己的Mac-IP信息上报给VTEP2(这里是通过免费ARP上报的),VTEP2收到消息后,会将消息通过MP-BGP转发给RR,RR会再通过MP-BGP协议同步给其他VTEP,此时VTEP1就可以习得虚机4的Mac-IP信息。如果虚机1想给虚机4发消息,发送ARP的时候,由于VTEP1之前已经通过控制层习得了虚机4的Mac-IP信息,因此可以直接代答,返回给虚机1,无需再将ARP广播到骨干路由中。
可以看到引入EVPN最大的好处就是增加了网络控制层,让VTEP之间可以通信,传递彼此的一些路由、Mac、VXLAN信息。
另外公司的PPT上有一个叫RR的角色:
使用这个的原因如下:
现实中要求BGP连接是full mesh(任意两两互连),而为了减轻配置压力,通常会引入BGP RR(Router Reflector)。BGP RR的作用是将一个BGP Speaker的数据反射给所有其他连接的BGP peer。使用BGP RR可以使得所有的BGP Speaker只需与BGP RR建立连接,否则按照full mesh,任意一个BGP Speaker必须与其他所有的BGP peer建立BGP连接。