VXLAN简介
概念 | 描述 |
---|---|
定义 | RFC7348定义了VLAN扩展方案VXLAN(Virtual eXtensible Local Area Network)。 VXLAN采用MAC in UDP(User Datagram Protocol)封装方式,是NVO3(Network Virtualization over Layer 3)中的一种网络虚拟化技术 。 |
传统网络缺陷 |
虚拟机规模受网络规格限制: 在传统二层网络环境下,数据报文是通过查询MAC地址表进行二层转发,而MAC地址表的容量限制了虚拟机的数量。 网络隔离能力限制:当前主流的网络隔离技术是VLAN,在大规模的虚拟化网络中部署存在如下限制: – 由于IEEE 802.1Q中定义的VLAN Tag域只有12比特,仅能表示4096个VLAN,无法满足大二层网络中标识大量租户或租户群的需求。 – 传统二层网络中的VLAN无法满足网络动态调整的需求。 虚拟机迁移范围受网络架构限制:虚拟机启动后,可能由于服务器资源等问题(如CPU过高,内存不够等),需要将虚拟机迁移到新的服务器上。为了保证虚拟机迁移过程中业务不中断,则需要保证虚拟机的IP地址保持不变,这就要求业务网络是一个二层网络,且要求网络本身具备多路径的冗余备份和可靠性 。 |
VXLAN优势 | 随着数据中心在物理网络基础设施上实施服务器虚拟化的快速发展,作为NVO3技术之一的VXLAN: 通过24比特的VNI可以支持多达16M的VXLAN段的网络隔离,对用户进行隔离和标识不再受到限制,可满足海量租户。 除VXLAN网络边缘设备,网络中的其他设备不需要识别虚拟机的MAC地址,减轻了设备的MAC地址学习压力,提升了设备性能。 通过采用MAC in UDP封装来延伸二层网络,实现了物理网络和虚拟网络解耦,租户可以规划自己的虚拟网络,不需要考虑物理网络IP地址和广播域的限制,大大降低了网络管理的难度 |
vlxan基本概念
概念 | 描述 |
---|---|
Underlay网络和Overlay网络 | VXLAN技术将已有的物理网络作为Underlay网络,在其上构建出虚拟的二层或三层网络,即Overlay网络。 Overlay网络通过封装技术、利用Underlay网络提供的三层转发路径,实现租户报文在不同站点间传递。对于租户来说, Underlay网络是透明的,只能感知到Overlay网络。 |
NVE(NetworkVirtualizationEdge) | 网络虚拟边缘节点NVE,实现网络虚拟化功能的网络实体。报文经过NVE封装转换后, NVE间就可基于三层基础网络建立二层虚拟化网络。说明设备和服务器上的虚拟交换机VSwitch都可以作为NVE。按照NVE部署位置的不同,可以分为以下三种模式: Ø硬件模式:所有的NVE都部署在支持NVE的设备上,所有的VXLAN报文封装与解封装都在设备上进行。 该模式又称之为network overlay。 Ø软件模式:所有的NVE都部署在vSwitch上,所有的VXLAN报文封装与解封装都在vSwitch上进行。 该模式又称之为host overlay。 Ø混合模式:部分NVE部署在vSwitch上,部分NVE部署在支持NVE的设备上,在vSwitch和设备上都有可能会进行VXLAN报文封装与解封装。 |
VTEP(VXLANTunnelEndpoints) | VTEP是VXLAN隧道端点,封装在NVE中,用于VXLAN报文的封装和解封装。VTEP与物理网络相连,分配有物理网络的IP地址,该地址与虚拟网络无关。VXLAN报文中源IP地址为本节点的VTEP地址, VXLAN报文中目的IP地址为对端节点的VTEP地址,一对VTEP地址就对应着一个VXLAN隧道。 |
BD(BridgeDomain) | BD是VXLAN网络中转发数据报文的二层广播域。在VXLAN网络中,将VNI以1:1方式映射到广播域BD, BD成为VXLAN网络转发数据报文的实体。VBDIF接口 基于BD创建的三层逻辑接口。通过VBDIF接口配置IP地址可实现不同网段的VXLAN间,及VXLAN和非VXLAN的通信,也可实现二层网络接入三层网络。 |
vxlan报文格式
概念 | 描述 |
---|---|
VXLAN header | VXLAN Flags: 8比特,取值为00001000。 VNI: VXLAN网络标识, 24比特,用于区分VXLAN段。 Reserved: 24比特和8比特,必须设置为0。 |
Outer UDP header |
DestPort:目的UDP端口号是4789。 Source Port:源端口号是内层报文通过哈希算法计算后的值,这个值很重要,underlay报文的五元组只有这个值是可以根据内层报文进行变化的,对underlay业务(如负载均衡,多核CPU业务均衡)非常重要。 |
Outer IP header |
IP SA:源IP地址是VXLAN隧道本端VTEP的IP地址。 IP DA:目的IP地址是VXLAN隧道远端VTEP的IP地址。如果Underlay网络为IPv4网络, VTEP IP为IPv4类型;如果Underlay网络为IPv6网络, VTEP IP为IPv6类型 |
Outer Ethernet header |
MAC DA:在发送报文的虚拟机所属VTEP上根据目的VTEP地址查找路由表,路由表中下一跳IP地址对应的MAC地址。 MAC SA:发送报文的虚拟机所属VTEP的MAC地址。 802.1Q Tag:可选字段,该字段为报文中携带的VLANTag。 Ethernet Type:以太报文类型。 |
VXLAN在linux内核中部署方式
二层网关
#创建一个桥,这个桥作为我们的bridge-domain
sudo ip link add br10 type bridge
#up我们的bdif,该bdif可以作为二层网关,跨vni报文通过该接口进入三层路由
sudo ip link set br10 up
#创建vxlan接口。后面的nolearning标志很重要,这里设置了不学习,因为我们可以使用evpn进行mac的控制。
#如果不部署evpn,可以将该标志去掉。
sudo ip link add vxlan10 type vxlan id 10 local 192.168.59.129 dstport 4789 nolearning
sudo ip link set vxlan10 up
sudo ip link set vxlan10 master br10
通过上面的配置,如果运行了BGP-EVPN协议的话,内核会通知BGP,本端创建了一个VTEP,BGP将会向邻居发送type-3类型的路由。可以在bdif上配置IP和MAC作为默认网关的IP和MAC,内核会通知BGP向邻居发布type-2类型的路由。
三层网关
#添加vni 100,作为l3vni
sudo ip link add br100 type bridge
sudo ip link add vxlan100 type vxlan id 100 local 192.168.59.128 dstport 4789 nolearning
sudo ip link set br100 up
sudo ip link set vxlan100 up
sudo ip link set vxlan100 master br100
#sudo ip addr add 5.5.5.254/24 dev br100 切记,作为l3vni的svi接口不能配置IP,否则收到type-5路由不会安装。
sudo ip link set dev br100 address 00:00:01:02:03:04 #这个是路由mac
对于三层网关,RFC推荐了3中模式:
- interface-less
- interface-full Core-facing IRB
- interface-full Unnumbered Core-facing IRB
FRR BGP采用的是interface-less模型,linux在实现这种模型的时候,需要创建l3vni,如上面vni100,这个在linux看来与其他的l2vni没有啥区别,区别在于BGP中会明确指定该vni为l3vni。在这种模型中bdif不能配置IP地址。创建好如上基础配置后,在BGP中指定vni 100位l3vni后,可以使用network命令发布type-5路由:携带前缀,下一跳(remote vtep的ip)和路由mac,即上面的00:01:02:03:04。BGP根据这些信息在内核中创建路由,noarp邻居(是一个伪造的邻居),以及fdb表项。这种模型下,overlay报文会进行路由查找,然后根据邻居找到路由mac作为目的,封装好报文后,从bdif出去进入mac-vrf进行fdb转发,从vxlan100出去。
sonic vxlan实现
前面讲解了BGP-EVPN的模型,sonic使用的控制面程序也是FRR,所以在实现的时候会参考上面的模型。
sonic实现vxlan涉及的组件
VRF:一个租户一个VRF,用于隔离租户之间的路由表项,在sonic中还有一个相似的概念vnet。
VNET:租户网络,一个vnet表示一个租户,对应于一个l3 VNI
ROUTE:路由支持VRF隔离
INTERFACE:支持VRF
VXLAN:创建VXLAN隧道
FDB:支持fdb表项出接口指向vxlan隧道
VRF
ROUTE
VXLAN
INTERFACE
说明
目前sonic只实现了l3 vni,还没有实现l2vni,暂时没看明白sonic的l2网关实现原理。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。