想写个DC系列的文章,站在传统路由交换网络基础上谈谈数据中心网络,一方面是给自己的学习做下总结,另一方面也想分享一些东西。
谈到数据中心网络,能想到的东西无非就VXLAN、SDN、NFV、EVPN这些概念。先从基础协议开始再谈整体架构,才疏学浅,有不对的地方请评论告知。首先针对性地抛出几个问题:
1、为什么用VXLAN?使用场景有哪些?
在传统网络中分二层三层。随着云计算的普及,云主机无缝迁移的需求成了常态。为解决云主机跨三层网络的迁移,并且要满足迁移后云内网络架构包括云主机IP地址不能发生改变的要求孕育了大二层技术。要实现跨三层的二层网络通信实际上就要用到隧道技术。隧道技术的解决方案也有很多,其中包括本文要讲的VXLAN,还有NVGRE、STT、TRILL、VPLS等。NVGRE是由微软提出的,只支持服务器使用。STT是Nicira这家公司提出的,Nicira已经被VMWARE收购,STT也不支持交换机使用。提到Nicira,除了STT最大的成就就是开发了Open vSwitch和Neutron(Openstack的网络组件),而TRILL和VPLS仅仅交换机支持。所以用VXLAN解决大二层问题最为合理,而且还符合IETF标准。
很多人在刚接触云平台架构的时候会有个疑问,拿Openstack举例来说,在Neutron组件中可以启用VXLAN,那这里与交换机的VXLAN有什么关系?前面说到VXLAN是通用协议,可以在网络设备上使用,也可以在服务器上使用。先假设这个世界还没有Openstack等云架构,那么一台虚拟机要实现大二层迁移,怎么办?这个时候VXLAN是做在上层交换设备上。那么Neutron组建的VXLAN功能有什么用?有些云网络中,可以借助Neutron的VXLAN功能实现大二层需求满足云主机迁移和互访,然后用另一张网卡实现互联网的访问,如图1。阿里云飞天架构大二层网络也是用VXLAN实现,封装与解封装均在服务器侧,不同的是出公网的方式采用的是在一台服务器解封装后做了NAT转换的形式。
图1 Openstack VXLAN网络
实际上一般较大型的数据中心架构,云主机依靠VLAN进行隔离,不,准确的来说是租户标识。拿Openstack来说,Neutron使用了VLAN功能,而上千个VLAN号对应租户量已经足够使用。云主机带着VLAN TAG出来后,再由交换机根据不同的VLAN TAG进行VXLAN封装隧道来实现大二层,如图2。这里专门映射VXLAN和VLAN的对应关系称为桥接域。拿国产设备来说,叫bridge-domain。租户的隔离则是通过路由标识来实现。
图2 交换机实现大二层网络
在谈到什么时候用VXLAN的时候,从云计算角度出发,以上举的例子都是IAAS层面的情景,还有PAAS层面的。例如容器编排调度工具kubernetes,有几套网络模型用来实现容器之间的互相通信,我们称为CNI(container network interface),包括Flannel、Calico、macvlan、OpenvSwitch等,其中Flannel网络模型就是用VXLAN来实现不同容器在宿主机的隧道模式通信的。
2、VXLAN报文格式
VXLAN数据包也可以称为MACINUDP数据包,原本数据链路层允许的最大以太网数据包长度是1500字节,然而数据包经过VTEP(VXLAN的隧道端点)封装后数据包会增加50字节,数据包格式如图3。那么VXLAN报文长度最大达到了1550,现在有些VTEP在处理VXLAN报文的时候并不接受分片,这就需要配置设备MTU1550了。
图3 VXLAN报文
报文的详细分解可以看图4,所以VXLAN是使用UDP封装在了传输层,目标端口是4789,源端口是随机的,根据源MAC地址进行HASH产生。至于为什么源端口随机,有一个很大的好处就是可以实现ECMP,如果源端口一成不变将导致网络只走一条路。而用来封装数据包的三层IP地址一般是设备的环回口地址,至于环回口地址的发布用OSPF、ISIS、BGP都可以,只要满足三层互通就可以。
图4 VXLAN报文分解
3、怎么配?
列举了一个VTEP端的华为配置,基本上看到配置就明白什么意思了,另一端配置同理。
SW1: interface nve1(NVE是实现网络虚拟化的设备,也就是隧道的端点) source 2.2.2.2(vxlan隧道封装的源点,loopback地址,事先得做三层互通) vni 5010 head-end peer-list 3.3.3.3(5010是vni号,也就是vxlan隧道编号,3.3.3.3是对端loopback) bridge-domain 10(VLAN和VXLAN之间的联系,用BD来做,也就是称为桥接域,这里的10只是本地有效,并不是VLAN) vxlan vni 5010(对应的vxlan隧道是5010) interface 10GE1/0/3 port link-type trunk port trunk allow vlan 1-9,11-100(这里就不能写10了,10要写在单独的子口里,access的就用pvid来做咯) interface 10GE1/0/3.1 mode l2(二层端口vlan10划入DB10里) encapsulation dot1q vid 10 bridge-domain 10
4、EVPN是什么?和VXLAN是什么关系?
EVPN要讲的东西很多,会专门用一章来讲,至于为什么要用,这里先说下VXLAN的广播泛洪问题。首先介绍下BUM报文,BUM即broadcast unicast multicast,数据包在发送到一个VTEP端的时候会进行头端复制,怎么理解头端复制呢?其实有点类似二层广播泛洪,一个数据包到了VTEP以后,VTEP设备根据VLAN信息找到了对应的二层广播域,前面看配置知道,有了二层广播域以后,对应的VNI编号也知道了,也就是知道了所有隧道列表,然后会把数据包进行报文复制,然后进行VXLAN封装转发到对端的多个VTEP上。对端VTEP收到报文后对VNI等信息核对,核对完后解封装。解封装后进行广播处理。数据中心网络中,特别是云平台网络中,终端数量是成百上千的,每个终端都发起一个ARP请求,每个请求都进行一次头端复制那是很不合理的呀,由此就引入了ARP抑制。
ARP抑制是一种优化机制,由于VXLAN的引入,就有了二层网关的说法,在二层网关上会存在一个IP和MAC对应关系的表,称为ARP抑制表。当二层ARP请求发起的时候,会查找目标MAC地址有没有在这个ARP抑制表里,如果有,目标泛洪广播帧中FFFFFFFF会就改成实际目标MAC地址,变成一个单播帧。而有些网络设备,比如思科的做法是代答的方式,当发现抑制表里有,就直接由二层代答,不进行头端复制泛洪。那么问题来了,ARP抑制表怎么来的?综上所述,VXLAN是没有控制平面的,所有转发都是通过泛洪获得转发信息,那么二层路由信息的获取,用来找到对应的VTEP来避免泛洪,实现VXLAN的控制层面,就要借助EVPN了。EVPN依靠BGP扩展团体属性,用于控制IP地址和MAC的路由信息的发布与接收。EVPN的更多技术细节包括与VXLAN的配合使用在第二章分享。而在第三章中分享的是Data Center Interconnection的实现。