概述

云计算三大组成部分:计算、存储和网络。VXLAN属于云计算虚拟化网络的非常重要的一部分,现在大多数云计算虚拟化网络都是基于此协议实现数据中心互联和虚拟机迁移 ,在数量级很大的虚拟机上完成这些工作是一个非常大的挑战。主要面临以下挑战:

  1. 虚拟机网络规模的挑战
    • 在传统的L2 layer,数据是通过查询MAC地址表进行L2转发,而MAC地址表的容量会限制虚拟机的数量。
  2. 网络隔离能力的挑战
    • 传统网络隔离技术是通过VLAN,通过手动配置交换机和服务器对vlan设置Tag域来实现网络隔离。但是vlan Tag只有12 bits,只能表示4096个VLAN,无法满足现在海量的云计算租户。
  3. 在其网络架构下网络迁移范围和能力的挑战
    • 虚拟机迁移过程中要保证业务不中断,特别是现在分布式系统中更是如此,要保证虚拟机的IP地址不变。

VXLAN很好的完成了上面的挑战,我们一起来看看VXLAN是什么?VXLAN(Virtual eXtensible Local Area Network)采用MAC in UDP封装方式,是Network Virtualization over Layer 3(NVO3)中的一种网络虚拟化技术,并使用物理网络的IP、MAC作为outer-header进行封装,然后在IP网络上传输, 到达目的地后由隧道终结点解封装并将数据发送给目标虚拟机。 NVO3技术还有其它协议:GENEVE、NVGRE和STT,据我了解现在云计算厂商大多数常用的技术还是VXLAN标准多一些,GENEV支持的网卡并不多。

vxlan协议

具体的报文格式

vxlan协议

  1. VXLAN数据包封装在UDP中,使用物理网络的IP和MAC地址为头部进行封装,网络通信而言只是个参数。
  2. VXLAN标准灰色部分有VNID即VNI,24bits支持千万级别。
  3. 通过UDP延伸二层网络,用户可以自定制虚拟化网络,不需要关注虚拟机的MAC地址。

虽然VXLAN协议通过UDP NVO3技术解决了网络扩展和迁移的问题,但是也会有一些缺点:

  • 1.因为采用的UDP延伸二层网络,它执行的是租户的执行隔离而流量完全没有加密,最直接的方案是通过IPsec进行加密,因为流量加密对于公有云来说很重要!!!
  • 2.VXLAN协议添加了很多字节固定开销。
  • 3.多播和组播基于VXLAN协议下要特别考虑网络洪泛影响问题和网络设计,多播在Linux不可用时可以考虑BGP EVPN的方式。
  • 4.Linux VXLAN不支持IGMP,可以通过FDB实现方式来解决。
  • 5.由于VXLAN是一个通用的网络协议标准,各厂商对VXLAN实现的协议标准的保留字段会有不一致的地方,当使用华为和华三的网络设备业务层面需要抽象另外一层来实现解耦。

基本概念

VXLAN协议网络架构:

VXLAN架构

1.Overlay和Underlay网络:物理网络作为Underlay网络,在其上构建出 虚拟的二层或三层网络,即Overlay网络。OverLay是基于隧道实现的,流量需要跑在UnderLay之上。

2.NVE:实现网络虚拟化的网络实体,报文经过NVE封装转换后,NVE间就可基于三层网络建立二层虚拟化网络。

3.VTEP隧道终点:封装在NVE实体中,主要用于VXLAN报文的封装和解装,一个VTEP地址对应一个VXLAN隧道,VXLAN报文中的源IP地址为本节点的VTEP地址,目的ip地址为对端VTEP地址。

4.VNI:网络标识,主要用于区分VXLAN段,租户和VNI映射。

虚拟机VXLAN通信

在计算机网络中,L2 根据MAC表转发,如果是首次通信则通过发送ARP广播报文请求目的MAC地址再进行转发;L3 layer转发依赖的是FIB转发表,用于判断基于 IP 包的网络前缀,如何进行转发。通过转发方式,在VXLAN网络上转发的数据包分为两类。

1.BUM:broadcast、unknown unicast和multicast

在VXLAN网络中,BUM数据包可以通过复制方式转发,主要有ingress、centralized和multicast模式

BUM forwarding

  • 1.广播一个ARP地址请求包,请求VM_C的MAC地址,在ARP请求包中,源MAC地址为MAC_A,目标MAC地址为f.
  • 2.接收到ARP数据包后,VTEP_1确定vlan隧道的VNI和ingress复制列表。VTEP_1基于ingress复制列表复制ARP的请求包,执行VXLAN封装,并将封装的数据包发送到每个隧道。在封装的数据包中,外部目标IP地址分别是对等VTEP(VTEP_2和VTEP_3)的IP地址。封装的数据包根据外部MAC地址和IP地址通过IP网络传输,直到到达对等的vetp。
  • 3.当数据包到达 VTEP_2和 VTEP_3时,VTEP_2和 VTEP_3对其进行去解包,以获得 VM_A 发送的原始数据包。 同时,VTEP_2和 VTEP_3学习 VM_A、 VNI 和 VETP_1的 MAC 地址之间的映射,并将映射保存在本地的 MAC 地址表中。 然后,VTEP_2和 VTEP_3将原始数据包发送到相应的第二层域中的主机。在收到 ARP 请求包之后,VM_C发送一个 ARP 响应包(而 VM_B 丢弃了 ARP 请求包)。 因为 VM _C已经知道了 VM_A 的 MAC 地址,所以 ARP 应答包是一个已知的单播包。

2.known unicast

KNOWN UNICAST

VXLAN Gateway

不同的VLAN需要通过三层Gateway相互通信,三层Gateway也需要用于不同虚拟机的VXLANs之间通信。现在大多数常用的网关部署方式采用分布式网关部署的方式,在分布式 VXLAN 网关网络中,每个leaf节点作为一个 VTEP 和一个第三层 VXLAN 网关。 Spine节点不知道 VXLAN 隧道,只转发 VXLAN 数据包。

VXLAN Gateway

  1. 三层 VXLAN 网关部署在leaf节点上,以实现同一leaf节点上虚拟机的子网间通信。

  2. 流量直接由leaf节点转发,而不需要通过 spine 节点,节省带宽资源。

  3. 分布式 vlan 网关场景中的leaf节点只需要学习连接到自己的主机的 ARP 入口,提高了网络扩展能力。

在该方案中需要一个control plane在三层网关之间传输主机路由,保证主机之间的通信。所以现在大多数的通过EVPN作为虚拟局域网的控制面。EVPN通过BGP/MPLS IP VPN机制定义BGP EVPN 路由,实现自动 VTEP 发现和主机地址学习。关于BGP EVPN和L3 DCI内容,在后续博客进行更新。

VXLAN实现

VXLAN实现有两种实现方式一种是通过Linux Kernel另外一种通过OpenvSwitch。

Linux Network Kernel实现

1.点对点VXLAN实现方式

VXLAN点对点通信

我通过vagrant创建了两台虚拟机box为CentOS 8,所以首先启动两台虚拟机:

1
vagrant up master slave1

开始创建Linux类型的网络接口vxlan

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
#在master虚拟机中执行
sudo ip link add vxlan1 type vxlan id 88 remote 192.168.88.8 dstport 4789 dev eth1
sudo ip link set vxlan1 up
sudo ip addr add 10.0.0.106/24 dev vxlan1
#下面的两条命令到是我了查看配置
#路由表多了vxlan1,并通过vxlan1转发
[vagrant@master ~]$ ip route | grep vxlan1
10.0.0.0/24 dev vxlan1 proto kernel scope link src 10.0.0.106
#fdb多了vxlan1,dst的vtep是192.168.88.9
[vagrant@master ~]$ bridge fdb | grep vxlan1
00:00:00:00:00:00 dev dev vxlan1 dst 192.168.88.9 via eth1 self permanent
#在slave1虚拟机中执行
sudo ip link add vxlan1 type vxlan id 88 remote 192.168.88.9 dstport 4789 dev eth1
sudo ip link set vxlan1 up
sudo ip addr add 10.0.0.107/24 dev vxlan1
  • Id:VNI 点对点的overlay的网络需要VNI一致
  • remote:作为一个VTEP设备来封装和解封VXLAN报文,也可用group来作为组播地址下面会实现
  • dstport: 指定目的端口为4789
  • dev: 指定VTEP通过哪个物理device来通信,这里是使用eth1

然后我们直接ping10.0.0.107

1
2
3
4
5
6
7
8
9
[vagrant@master ~]$ ping -c 3 10.0.0.107
PING 10.0.0.107 (10.0.0.107) 56(84) bytes of data.
64 bytes from 10.0.0.107: icmp_seq=1 ttl=64 time=0.576 ms
64 bytes from 10.0.0.107: icmp_seq=2 ttl=64 time=0.576 ms
64 bytes from 10.0.0.107: icmp_seq=3 ttl=64 time=0.812 ms

--- 10.0.0.107 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 86ms
rtt min/avg/max/mdev = 0.576/0.654/0.812/0.115 ms

2.多播VXLAN实现

之前在介绍单播VXLAN通信时通过dst单播IP地址进行通信的,而多播的VXLAN实现时通过group的参数设置一个组多播地址,将vxlan接口的VTEP纳入该组播地址。

1
2
3
4
5
6
7
8
#master 虚拟机实现
sudo ip link add vxlan1 type vxlan id 98 dstport 4789 group 239.1.1.1 dev eth1
sudo ip addr add 10.1.1.8/24 dev vxlan1
sudo ip link set vxlan1 up
#slave1 
sudo ip link add vxlan1 type vxlan id 98 dstport 4789 group 239.1.1.1 dev eth1
sudo ip addr add 10.1.1.9/24 dev vxlan1
sudo ip link set vxlan1 up

然后我们ping目标地址会有

1
2
3
4
5
6
7
8
9
[vagrant@master ~]$ ping -c 3 10.1.1.9
PING 10.1.1.9 (10.1.1.9) 56(84) bytes of data.
64 bytes from 10.1.1.9: icmp_seq=1 ttl=64 time=0.546 ms
64 bytes from 10.1.1.9: icmp_seq=2 ttl=64 time=0.684 ms
64 bytes from 10.1.1.9: icmp_seq=3 ttl=64 time=0.636 ms

--- 10.1.1.9 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 32ms
rtt min/avg/max/mdev = 0.546/0.622/0.684/0.057 ms

下面我们分别介绍一下该命令:

通过配置,VTEP加入同一个多播地址239.1.1.1并实现该多播互通。

  1. 发送 ping 报文到 10.20.1.3,首选通过route路由表,报文会从 vxlan1 转发。
  2. 内核发现 vxlan1 的 IP 是 10.1.1.8/24和目的IP(10.1.1.9/24) 在同一个网段,首次互通会发送ARP请求报文查询。
  3. ARP 报文源 MAC 地址为 vxlan1 的 MAC 地址,目的 MAC 地址为全 1 的广播地址,并且vxlan1根据VNI添加到头部,并把IP地址作为VTEP的地址。
  4. vtep 向多播地址 239.1.1.1 发送多播报文,多播组中所有的主机都会受到这个报文,内核发现是 vxlan 报文,会根据 VNI 发送给对应的 vtep。
  5. VTEP解包去掉相应头部内容,并将地址映射(SOURCE MAC-VTEP IP-VNI)信息保存到fdb表中。
  6. ARP 应答报文,并更新配置。
  7. 后续 的 ping 报文都是单播进行的。

一台主机可以有成千上万个容器进行管理和通信,所以我们需要通过一种方式将成千上万的通信实体进行连接,通过bridge来连接多个vm,现在docker网络下一篇文章再详细介绍。

NVO3

NVO3技术还有其它协议:GENEVE和STT。

STT

STT Tunneling

在三层网络上,在 IP 报头中使用类似 tcp 的报头。 使用 TCP 字段已经被提议为向下兼容提供 NICs 的现有实现来支持卸载逻辑,因此 STT 特别适用于目标终端系统的部署,例如物理服务器上的虚拟交换机。

NVGRE

NVGRE Header

头部 MAC 的外部为18字节; 使用 IPv4时的外部 IP 为20字节; GRE 的 VSID 的外部 IP 为16字节,支持的网卡比较少。

参考链接

1.华为VXLAN白皮书

2.Comparison: VXLAN vs NVGRE vs STT vs LISP - Overlay Network Technologies

3.Linux中的虚拟网络

4.Linux & VXLAN

5.什么是VXLAN