VXLAN是Virtual eXtensible Local Area Network的缩写,RFC 7348的标题“A Framework for Overlaying Virtualized Layer 2 Networks over Layer 3 Networks”,说明了VXLAN是一个在传统Layer 3网络上架设出来的Layer 2 overlay网络。RFC Abstract如下:
This document describes Virtual eXtensible Local Area Network (VXLAN), which is used to address the need for overlay networks within virtualized data centers accommodating multiple tenants. The scheme and the related protocols can be used in networks for cloud service providers and enterprise data centers. This memo documents the deployed VXLAN protocol for the benefit of the Internet community.
在下面的场景中有两服务器,由三层物理网络连接。这两台服务器可能在同一个机架上,或者在不同的机架上,亦或在物理距离相距甚远的不同数据中心里。有4个VxLAN overlay网络,标识分别为VNI 22, 34, 74, 98。来看看Server 1上的虚拟机VM1-1和Server 2上的虚拟机VM2-4,它们属于相同的标识为VNI 22的VXLAN overlay网络。虚拟机并不知道overlay网络,也不知道VxLAN报文的封装和解封过程,因为这些过程都由物理服务器上的VTEP完成。看到这里,即使你没听说过VTEP这个概念,也大概知道它的作用了吧,VTEP (VXLAN Tunnel End Point), An entity that originates and/or terminates VXLAN tunnels,VTEP负责VxLAN的封装和解封装。
这种部署方法是基于物理机能够感知VXLAN协议,从而可以作为VxLAN的封装和解封点(VTEP) 。另外一种部署方法是把VTEP设备的位置放在网络设备中,比如交换机,可以作为一个VXLAN网络来负责VxLAN报文的封装和解封。在数据中心的部署中,物理机作为VTEP的部署方式能更好地和物理网络设备解耦,并且更加方便运维。
Linux上对VXLAN的支持快速搭建和理解VXLAN的方法之一就是利用Linux。从内核3.7版本开始,Linux就开始支持VXLAN。到了内核3.12版本,Linux对VXLAN的支持已经完备,支持单播和组播,IPv4和IPv6。利用man查看ip的link子命令,可以查看是否有vxlan type,如下:
$ man ip-link
搜索vxlan,可以看到如下描述,可以利用ip link add增加类型为VXLAN的link。
VXLAN Type Support
For a link of type VXLAN the following additional arguments are supported:
ip link add DEVICE type vxlan id VNI [ dev PHYS_DEV ] [ { group | remote } IPADDR ] [ local { IPADDR | any } ] [ ttl TTL ] [ tos TOS ] [ dstport PORT ] [ srcport MIN
MAX ] [ [no]learning ] [ [no]proxy ] [ [no]rsc ] [ [no]l2miss ] [ [no]l3miss ] [ [no]udpcsum ] [ [no]udp6zerocsumtx ] [ [no]udp6zerocsumrx ] [ ageing SECONDS ] [ maxad‐
dress NUMBER ] [ gbp ]
下面的实验在如下环境中完成:
场景1: 最简单的点对点VXLAN创建简单的点对点VXLAN环境非常简单。如下图所示,只需要在两个机器(物理机或者虚拟机都可以,本实验中是云上的虚拟机环境)中各创建一个vxlan类型的网络接口即可,vxlan类型的接口vxlan1可以作为上文中提到的VTEP。
在上面的环境中,注意我们将vxlan网络接口配置上IP地址,在10.0.0.0/24网段内。在IP地址分配后,Linux系统的路由表就会创建一条路由,去往10.0.0.0/24网段的报文走网络接口vxlan1出去。vm1上去往10.0.0.0/24的报文,在vxlan1上会做VXLAN封装,内层地址是10.0.0.106,外层地址是172.31.0.106。VXLAN报文通过物理网络达到对端vm2上的VETP vxlan1,在vm2的vxlan1接口上做VXLAN协议的解封装,从而结束整个过程。
上图是一个物理上的示意图,在逻辑上形成的VXLAN overlay网络环境如下图,虚线部分示意出来的Overlay Network和VXLAN Tunnel都是逻辑上的概念。如果有容器和虚机被接入逻辑上的Overlay网络10.0.0.0/24,它们完全不用感知底层物理网络,看起来对端是和自己在同一个二层环境里,就是像是在VTEP设备的上面直接构建了一条VXLAN Tunnel,把Overlay网络里的网络接口直接在二层打通。
具体的配置只需要3条命令。如下,在vm1上执行如下命令:
# ip link add vxlan1 type vxlan id 1 remote 172.31.0.107 dstport 4789 dev eth0 # ip link set vxlan1 up # ip addr add 10.0.0.106/24 dev vxlan1
上面的第一条命令创建了一个Linux上类型为vxlan的网络接口,名为vxlan1。
id: VNI标识是1。
remote: 作为一个VTEP设备来封装和解封VXLAN报文,需要知道将封装好的VXLAN报文发送到哪个对端VTEP。Linux上可以利用group指定组播组地址,或者利用remote指定对端单播地址。在实验的云环境中默认不支持组播,这里利用remote指定点对点的对端IP地址为172.31.0.107。