VXLAN 全称是 Virtual eXtensible Local Area Network
,虚拟可扩展的局域网。它是一种 overlay 技术,经过三层的网络来搭建虚拟的二层网络。rfc7348 (参考资料1) 上的介绍是这样的:php
A framework for overlaying virtualized layer 2 networks over lay 3 networks.html
每个技术出来都有它要解决的问题,VXLAN 也不例外,那么咱们先看看 VXLAN 到底要解决哪些问题。git
传统二层+三层的网络在应对这些要求时变得力不从心,虽然不少改进型的技术好比堆叠、SVF、TRILL 等可以增长二层的范围,努力改进经典网络,可是要作到对网络改动小同时保证灵活性高却很是困难。github
为了解决这些问题,有不少方案被提出来,vxlan 就是其中之一。vxlan 是 VMware、Cisco 等一众大型企业共同推出的,目前标准文档在 RFC7348。markdown
vxlan 这类隧道网络的一个特色是对原有的网络架构影响小,原来的网络不须要作任何改动,在原来网络基础上架设一层新的网络。网络
vxlan 天然会引入一些新的概念,这部分就讲讲它们。下面这张图 是 vxlan 的工做模型,它建立在原来的 IP 网络(三层)上,只要是三层可达(可以经过 IP 互相通讯)的网络就能部署 vxlan。在每一个端点上都有一个 vtep 负责 vxlan 协议报文的封包和解包,也就是在虚拟报文上封装 vtep 通讯的报文头部。物理网络上能够建立多个 vxlan 网络,这些 vxlan 网络能够认为是一个隧道,不一样节点的虚拟机可以经过隧道直连。每一个 vxlan 网络由惟一的 VNI 标识,不一样的 vxlan 能够不相互影响。架构
如今来讲,这些概念仍是很是晦涩难理解的,咱们会在下面具体讲解 vxlan 网络的报文和通讯流程,但愿文章结束以后再回来看这些概念能明白它们的意思。运维
前面说过,vxlan 在三层网络上构建一个虚拟的二层网络出来,这一点可以在 vxlan 的报文上很明显地体现出来。分布式
下图是 vxlan 协议的报文,白色的部分是虚拟机发送报文(二层帧,包含了 MAC 头部、IP 头部和传输层头部的报文),前面加了 vxlan 头部用来专门保存 vxlan 相关的内容,在前面是标准的 UDP 协议头部(UDP 头部、IP 头部和 MAC 头部)用来在底层网路上传输报文。post
从这个报文中能够看到三个部分:
报文各个部分的意义以下:
能够看出 vxlan 协议比原始报文多 50 字节的内容,这会下降网络链路传输有效数据的比例。vxlan 头部最重要的是 VNID 字段,其余的保留字段主要是为了将来的扩展,目前留给不一样的厂商用这些字段添加本身的功能。
经过上节的内容,咱们大体了解 vxlan 报文的发送过程。虚拟机的报文经过 vtep 添加上 vxlan 以及外部的报文层,而后发送出去,对方 vtep 收到以后拆除 vxlan 头部而后根据 VNI 把原始报文发送到目的虚拟机。
上面的过程是双方已经知道全部通讯信息的过程,可是在第一次通讯以前还有不少问题有解决:
这三个问题能够归结为同一个问题:vxlan 网络怎么感知彼此的存在并选择正确的路径传输报文?
并且第一个问题也是不用回答的,由于 vtep 造成的组是虚构的概念,只有某些 vtep 可以正确地传递报文,它们就是在同一个组内。也就是说,咱们只要回答后面两个问题就行。
要回答这两个问题,咱们仍是回到 vxlan 协议报文上,看看一个完整的 vxlan 报文须要哪些信息。
总结一下,一个 vxlan 报文须要肯定两个地址信息:目的虚拟机的 MAC 地址和目的 vtep 的 IP 地址,若是 VNI 也是动态感知的,那么 vtep 就须要一个三元组:
内部 MAC <--> VNI <--> VTEP IP
根据实现的不一样,通常分为两种方式:多播和控制中心。多播的概念是同个 vxlan 网络的 vtep 加入到同一个多播网络,若是须要知道以上信息,就在组内发送多播来查询;控制中心的概念是在某个集中式的地方保存了全部虚拟机的上述信息,自动化告知 vtep 它须要的信息。
针对这两种方式,咱们下面就分别分析。
多播的概念和工做原理不是这里的重点,因此就不介绍了。简单来讲,每一个多播组对应一个多播 IP 地址,往这个多播 IP 地址发送的报文会发给多播组的全部主机。
为何要使用多播?由于 vxlan 的底层网络是三层的,广播地址没法穿越三层网络,要给 vxlan 网络全部 vtep 发送报文只能经过多播。
下图是在多播模式下,vxlan 的报文工做流程,位于左下方的 机器 A 要经过 vxlan 网络发送报文给右下方的机器 B。
vtep 创建的时候会经过配置加入到多播组(具体作法取决于实现),图中的多播组 IP 地址是 239.1.1.1
。
239.1.1.1
,支持多播的底层网络设备(交换机和路由器)会把报文发送给组内全部的成员在这个过程当中,只有一次多播,由于 vtep 有自动学习的能力,后续的报文都是经过单播直接发送的。能够看到,多播报文很是浪费,每次的多播其实只有一个报文是有效的,若是某个多播组的 vtep 数量不少,这个浪费是很是大的。可是多播组也有它的实现起来比较简单,不须要中心化的控制,只有底层网络支持多播,只有配置好多播组就能自动发现了。
单播报文的发送过程就是上述应答报文的逻辑,应该也很是容易理解了。还有一种通讯方式,那就是不一样 VNI 网络之间的通讯,这个须要用到 vxlan 网关(能够是物理网络设备,也能够是软件),它接收到一个 vxlan 网络报文以后解压,根据特定的逻辑添加上另一个 vxlan 头部转发出去。
由于并非全部的网络设备都支持多播,再加上多播方式带来的报文浪费,在实际生产中这种方式不多用到。
从多播的流程能够看出来,其实 vtep 发送报文最关键的就是知道对方虚拟机的 MAC 地址和虚拟机所在主机的 vtep IP 地址。若是可以事先知道这两个信息,直接告诉 vtep,那么就不须要多播了。
在虚拟机和容器的场景中,当虚拟机或者容器启动尚未进行网络通信时,咱们就能够知道它的 IP 和 MAC(多是用某种方式获取,也有多是事先控制这两个地址),分布式控制中心保存了这些信息。除此以外,控制中心还保存了每一个 vxlan 网络有哪些 vtep,这些 vtep 的地址是多少。有了这些信息,vtep 就能发送报文时直接查询并添加头部,不须要多播去满网络地问了。
通常状况下,在每一个 vtep 所在的节点都会有一个 agent,它会和控制中心通讯,获取 vtep 须要的信息以某种方式告诉 vtep。具体的作法取决于具体的实现,每种实现可能会更新不一样的信息给 vtep,好比 HER(Head End Replication)只是把多播组替换成多个单播报文,也就是把多播组全部的 VTEP IP 地址告诉 vtep,这样查询的时候不是发送多播,而是给组内每一个 vtep 发送一个单播报文;有些实现只是告诉 vtep 目的虚拟机的 MAC 地址信息;有些实现告诉 MAC 地址对应的 vtep IP 地址。
此外,何时告诉 vtep 这些信息也是有区别的。通常有两种方式:常见的是一旦知道了虚拟机的三元组信息就告诉 vtep(即便某个 vtep 用不到这个信息,由于它管理的虚拟机不会和这个地址通讯),通常这时候第一次通讯尚未发生;另一种方式是在第一次通讯时,当 vtep 须要这些信息的时候以某种方式通知 agent,而后 agent 这时候才告诉 vtep 信息。
分布式控制的 vxlan 是一种典型的 SDN 架构,也是目前使用最普遍的方式。由于它的实现多样,并且每种实现都有些许差距,这里不便来具体的例子来讲明,只要明白了上面的原理,不论是什么样的实现,都能很快上手。
vxlan 协议给虚拟网络带来了灵活性和扩展性,让云计算网络可以像计算、存储资源那样按需扩展,并灵活分布。和计算机领域全部技术同样,这也是一种 tradeoff,相对于经典网络来讲,vxlan 主要的问题是它的复杂性和额外的开销。
这一点可容易看出来,每一个 vxlan 报文都有额外的 50 字节开销,若是加上 vlan 字段,开销要到 54 字节。这对于小报文的传输是很是昂贵的操做,试想若是某个报文应用数据才几个字节,原来的网络头部加上 vxlan 报文头部都能有 100 字节的控制信息。
额外的报文也带来了额外的计算量,每一个 vxlan 报文的封包和解包操做都是必须的,若是用软件来实现这些步骤,额外的计算量也是不能够忽略的影响。
vxlan 另一个缺点是复杂度,虽然经典网络在应对云计算时捉紧见拙,可是经典网络模型已经发展了好久,全部的部署、监控、运维都比较成熟。若是使用 vxlan 网络,那么全部的这些都要从新学习,时间和人力成本必然会大大提升。