《重识云原生系列》专题索引:
图3-1 VXLAN网络模型图
从上图中可以发现,VXLAN网络中出现了以下传统数据中心网络中没有的新元素:
VXLAN网络的边缘设备,是VXLAN隧道的起点和终点,VXLAN报文的相关处理均在这上面进行。总之,它是VXLAN网络中绝对的主角。VTEP既可以是一个独立的网络设备(比如华为的CE系列交换机),也可以是虚拟机所在的服务器。
前文提到,以太网数据帧中VLAN只占了12比特的空间,这使得VLAN的隔离能力在数据中心网络中力不从心。而VNI的出现,就是专门解决这个问题的。VNI是一种类似于VLAN ID的用户标示,一个VNI代表了一个租户,属于不同VNI的虚拟机之间不能直接进行二层通信。VXLAN报文封装时,给VNI分配了足够的空间使其可以支持海量租户的隔离。
VNI还可分为二层VNI和三层VNI,它们的作用不同,二层VNI是普通的VNI,用于VXLAN报文同子网的转发;三层VNI和VPN实例进行关联,用于VXLAN报文跨子网的转发。
“隧道”是一个逻辑上的概念,它并不新鲜,比如大家熟悉的GRE。说白了就是将原始报文“变身”下,加以“包装”,好让它可以在承载网络(比如IP网络)上传输。从主机的角度看,就好像原始报文的起点和终点之间,有一条直通的链路一样。而这个看起来直通的链路,就是“隧道”。顾名思义,“VXLAN隧道”便是用来传输经过VXLAN封装的报文的,它是建立在两个VTEP之间的一条虚拟通道。
和VLAN类似,不同VNI之间的主机,以及VXLAN网络和非VXLAN网络中的主机不能直接相互通信。为了满足这些通信需求,VXLAN引入了VXLAN网关的概念。VXLAN网关分为二层网关和三层网关,VXLAN二层网关用于终端接入VXLAN网络,也可用于同一VXLAN网络的子网通信;VXLAN三层网关用于VXLAN网络中跨子网通信以及访问外部网络。
根据三层网关部署方式的不同,VXLAN三层网关又可以分为集中式网关和分布式网关。
图3-2 建立VXLAN隧道示意图
如图3-2所示,网络中存在多个VTEP,那么这其中哪些VTEP间需要建立VXLAN隧道呢?
如前所述,通过VXLAN隧道,“二层域”可以突破物理上的界限,实现大二层网络中VM之间的通信。所以,连接在不同VTEP上的VM之间如果有“大二层”互通的需求,这两个VTEP之间就需要建立VXLAN隧道。换言之,同一大二层域内的VTEP之间都需要建立VXLAN隧道。
例如,假设图3-2中VTEP_1连接的VM、VTEP_2连接的VM以及VTEP_3连接的VM之间需要“大二层”互通,那VTEP_1、VTEP_2和VTEP_3之间就需要两两建立VXLAN隧道,如图3-3所示。
图3-3 建立VXLAN隧道示意图
前面提到的“同一大二层域”,就类似于传统网络中VLAN(虚拟局域网)的概念,只不过在VXLAN网络中,它有另外一个名字,叫做Bridge-Domain,简称BD。
我们知道,不同的VLAN是通过VLAN ID来进行区分的,那不同的BD是如何进行区分的呢?其实前面已经提到了,就是通过VNI来区分的。对于CE系列交换机而言,BD与VNI是1:1的映射关系,这种映射关系是通过在VTEP上配置命令行建立起来的。配置如下:
bridge-domain 10 //表示创建一个“大二层广播域”BD,其编号为10
vxlan vni 5000 //表示在BD 10下,指定与之关联的VNI为5000
VTEP会根据以上配置生成BD与VNI的映射关系表,该映射表可以通过命令行查看,如下所示:
Number of vxlan vni : 1
VNI BD-ID State
----------------------------------
5000 10 up
有了映射表后,进入VTEP的报文就可以根据自己所属的BD来确定报文封装时该添加哪个VNI。那么,报文根据什么来确定自己属于哪个BD呢?
这里要先澄清下,VTEP只是交换机承担的一个角色而已,只是交换机功能的一部分。也就是说,并非所有进入到交换机的报文都会走VXLAN隧道(也可能报文就是走普通的二三层转发流程)。所以,我们在回答“如何确定报文属于哪个BD”之前,必须先要回答“哪些报文要进入VXLAN隧道”。
回答这个问题之前,不妨先让我们想下VLAN技术中,交换机对于接收和发送的报文是如何进行处理的。我们知道,报文要进入交换机进行下一步处理,首先得先过接口这一关,可以说接口掌控着对报文的“生杀大权”。传统网络中定义了三种不同类型的接口:Access、Trunk、Hybrid。这三种类型的接口虽然应用场景不同,但他们的最终目的是一样的:一是根据配置来检查哪些报文是允许通过的;二是判断对检查通过的报文进行怎样的处理。
其实在VXLAN网络中,VTEP上的接口也承担着类似的任务,只不过在CE系列交换机中,这里的接口不是物理接口,而是一个叫做“二层子接口”的逻辑接口。类似的,二层子接口主要做两件事:一是根据配置来检查哪些报文需要进入VXLAN隧道;二是判断对检查通过的报文进行怎样的处理。下面我们就来看下,二层子接口是如何完成这两件事的。
在二层子接口上,可以根据需要定义不同的流封装类型(类似于传统网络中不同的接口类型)。CE系列交换机目前支持三种不同的流封装类型,分别是dot1q、untag和default,它们各自对报文的处理方式如表3-1所示。有了这张表,你就能明白哪些报文要进VXLAN隧道了。
表3-1 不同流封装类型的接口对报文的处理方式
流封装类型 |
允许进入VXLAN隧道的报文类型 |
报文进行封装前的处理 |
收到VXLAN报文并解封装后的处理 |
dot1q |
只允许携带指定VLAN Tag的报文进入VXLAN隧道。(这里的“指定VLAN Tag”是通过命令进行配置的) |
进行VXLAN封装前,先剥掉原始报文的外层VLAN Tag。 |
进行VXLAN解封装后:若内层原始报文带有VLAN Tag,则先将该VLAN Tag替换为指定的VLAN Tag,再转发;若内层原始报文不带VLAN Tag,则先将其添加指定的VLAN Tag,再转发。 |
untag |
只允许不携带VLAN Tag的报文进入VXLAN隧道。 |
进行VXLAN封装前,不对原始报文做处理,即不添加任何VLAN Tag。 |
进行VXLAN解封装后,若内层原始报文带有vlan tag,则先将该vlan tag 剥掉,再转发;若内层原始报文不带vlan tag,则直接转发 |
default |
允许所有报文进入VXLAN隧道,不论报文是否携带VLAN Tag。 |
进行VXLAN封装前,不对原始报文做处理,即不添加/不替换/不剥掉任何VLAN Tag。 |
进行VXLAN封装后,不对原始报文做处理,即不添加/不替换/不剥掉任何VLAN Tag。 |
VXLAN隧道两端二层子接口的配置并不一定是完全对等的。正因为这样,才可能实现属于同一网段但是不同VLAN的两个VM通过VXLAN隧道进行通信。
看了上面的描述,再来回答“如何确定报文属于哪个BD”就非常简单了。其实,只要将二层子接口加入指定的BD,然后根据二层子接口上的配置,就可以确定报文属于哪个BD啦!
比如图3-4所示的组网,我们可以分别在VTEP的两个物理接口10GE 1/0/1和10GE 1/0/2上配置不同流封装类型的二层子接口并将其分别加入不同的BD。
图3-4 二层子接口加入BD
基于二层物理接口10GE 1/0/1,分别创建二层子接口10GE 1/0/1.1和10GE 1/0/1.2,且分别配置其流封装类型为dot1q和untag。配置如下:
interface 10GE1/0/1.1 mode l2 //创建二层子接口10GE1/0/1.1
encapsulation dot1q vid 10 //只允许携带VLAN Tag 10的报文进入VXLAN隧道
bridge-domain 10 //报文进入的是BD 10
interface 10GE1/0/1.2 mode l2 //创建二层子接口10GE1/0/1.2
encapsulation untag //只允许不携带VLAN Tag的报文进入VXLAN隧道
bridge-domain 20 //报文进入的是BD 20
基于二层物理接口10GE 1/0/2,创建二层子接口10GE 1/0/2.1,且流封装类型为default。配置如下:
interface 10GE1/0/2.1 mode l2 //创建二层子接口10GE1/0/2.1
encapsulation default //允许所有报文进入VXLAN隧道
bridge-domain 30 //报文进入的是BD 30
此时你可能会有这样的疑问,为什么要在10GE 1/0/1上创建两个不同类型的子接口?是否还可以继续在10GE 1/0/1上创建一个default类型的二层子接口?换句话说,用户应该如何选择配置哪种类型的二层子接口?三种类型的二层子接口之间,是否存在配置约束关系?
我们先来解答下是否可以在10GE 1/0/1上再创建一个default类型的二层子接口。答案是不可以。其实根据表3-1的描述,这一点很容易理解。因为default类型的二层子接口允许所有报文进入VXLAN隧道,而dot1q和untag类型的二层子接口只允许某一类报文进入VXLAN隧道。这就决定了,default类型的二层子接口跟其他两种类型的二层子接口是不可以在同一物理接口上共存的。否则,报文到了接口之后如何判断要进入哪个二层子接口呢。所以,default类型的子接口,一般应用在经过此接口的报文均需要走同一条VXLAN隧道的场景,即下挂的VM全部属于同一BD。例如,图3-3中VM3和VM4均属于BD 30,则10GE 1/0/2上就可以创建default类型的二层子接口。
再来看下为什么可以在10GE 1/0/1上分别创建dot1q和untag类型的二层子接口。如图3-3所示,VM1和VM2分别属于VLAN 10和VLAN 20,且分别属于不同的大二层域BD 10和BD 20,显然他们发出的报文要进入不同的VXLAN隧道。如果VM1和VM2发出的报文在到达VTEP的10GE 1/0/1接口时,一个是携带VLAN 10的Tag的,一个是不携带VLAN Tag的(比如二层交换机上行连接VTEP的接口上配置的接口类型是Trunk,允许通过的VLAN为10和20,PVID为VLAN 20),则为了区分两种报文,就必须要在10GE 1/0/1上分别创建dot1q和untag类型的二层子接口。所以,当经过同一物理接口的报文既有带VLAN Tag的,又有不带VLAN Tag的,并且他们各自要进入不同的VXLAN隧道,则可以在该物理接口上同时创建dot1q和untag类型的二层子接口。
当然,现网中可能存在各种不同的组网,小编也不可能一一列举出来。所以在实际应用中,请务必根据组网需求,结合表3-1,合理规划二层子接口的流封装类型。
现在,我们可以来看下VXLAN隧道是怎么建立起来的了。一般而言,隧道的建立不外乎手工方式和自动方式两种。
这种方式需要用户手动指定VXLAN隧道的源和目的IP地址分别为本端和对端VTEP的IP地址,也就是人为的在本端VTEP和对端VTEP之间建立静态VXLAN隧道。
对于CE系列交换机,以上配置是在NVE(Network Virtualization Edge)接口下完成的。配置过程如下:
interface Nve1 //创建逻辑接口NVE 1
source 1.1.1.1 //配置源VTEP的IP地址(推荐使用Loopback接口的IP地址)
vni 5000 head-end peer-list 2.2.2.2
vni 5000 head-end peer-list 2.2.2.3
其中,vni 5000 head-end peer-list 2.2.2.2和vni 5000 head-end peer-list 2.2.2.3的配置,表示属于VNI 5000的对端VTEP有两个,IP地址分别为2.2.2.2和2.2.2.3。根据这两条配置,VTEP上会生成如下所示的一张表:
BD ID : 10
State : up
NVE : 288
Source : 1.1.1.1
UDP Port : 4789
BUM Mode : head-end
Group Address : -
Peer List : 2.2.2.2 2.2.2.3
根据上表中的Peer List,本端VTEP就可以知道属于同一BD(或同一VNI)的对端VTEP都有哪些,这也就决定了同一大二层广播域的范围。当VTEP收到BUM(Broadcast&Unknown-unicast&Multicast,广播&未知单播&组播)报文时,会将报文复制并发送给Peer List中所列的所有对端VTEP(这就好比广播报文在VLAN内广播)。因此,这张表也被称为“头端复制列表”。当VTEP收到已知单播报文时,会根据VTEP上的MAC表来确定报文要从哪条VXLAN隧道走。而此时Peer List中所列的对端,则充当了MAC表中“出接口”的角色。在后面的报文转发流程中,你将会看到头端复制列表是如何在VXLAN网络中指导报文进行转发的。
自动方式下VXLAN隧道的建立需要借助于其他的协议,例如BGP。CE系列交换机中,自动方式建立VXLAN隧道主要应用在EVN(Ethernet Virtual Network)和VXLAN的分布式网关场景中。本文不对该方式进行详细讲述,具体实现可参考EVN的相关资料
从前面的描述我们知道,属于同一BD的VXLAN隧道可能不止一条,比如前面的头端复制列表中,同一个源端VTEP(1.1.1.1)对应了两个对端VTEP(2.2.2.2和2.2.2.3)。那就带来了另一个问题,报文到底应该走哪一条隧道呢?
我们知道,基本的二三层转发中,二层转发依赖的是MAC表,如果没有对应的MAC表,则主机发送ARP广播报文请求对端的MAC地址;三层转发依赖的是FIB表。在VXLAN中,其实也是同样的道理。下面就让我们来看下,VXLAN网络中报文的转发流程。相信看完下面的内容,关于“如何确定报文要进哪条隧道”的疑惑也就迎刃而解了。
VXLAN介绍
VXLAN基本概述
两种Overlay技术:NVGRE和VXLAN
解读VXLAN
什么是 VxLAN ?它的优点有哪些?
深度:什么是VxLAN?
关于VLAN和VXLAN的理解
VXlan 技术实现原理
最好的vxlan介绍
VXLAN:云时代的虚拟化数据中心网络