vxlan 协议的介绍文章
主要介绍了 vxlan 协议的理论知识,从产生的背景到报文的格式等等,和所有的计算机知识一样,理论必须结合实践理解才能更深刻,这篇文章我们就讲讲在 linux 机器上怎么手动搭建 vxlan overlay 网络。
Linux 对 vxlan 协议的支持时间并不久,2012 年 Stephen Hemminger 才把相关的工作合并到 kernel 中,并最终出现在 kernel 3.7.0 版本。为了稳定性和很多的功能,你可以会看到某些软件推荐在 3.9.0 或者 3.10.0 以后版本的 kernel 上使用 vxlan。
NOTE
:如果可以,尽量使用比较新版本的 kernel,以免出现因为内核版本太低导致功能或者性能上的问题。
本文的实验环境:
MacBook Pro: 2.6 GHz Intel Core i5
virtualbox 5.1.8
vagrant 2.0.0
OS: ubuntu 16.04
Linux Kernel: 4.4.0-83-generic
我用 vagrant 启动了三台虚拟机,它们之间通信的 IP 地址(也就是 underlay 网络)为:
192.168.8.100
192.168.8.101
192.168.8.102
而要创建的 overlay 网络网段为
10.20.1.0/24
,实验目的就是 vxlan 能够通过 overlay IP 互相连通。
之前的介绍文章
。
对于每个容器/虚拟机,我们创建一个 network namespace,并通过一对 veth pair 把容器中的 eth0 网络连接到网桥上。同时 vtep 也会放到网桥上,以便能够对报文进行 vxlan 相关的处理。
首先我们创建 vtep interface,使用的是多播模式:
创建 vtep interface:
$ ip link add vxlan0 type vxlan \
id 42 \
dstport 4789 \
group 239.1.1.1 \
local 192.168.8.100 \
dev enp0s8
然后创建网桥
br0
,把 vtep interface 绑定到上面:
$ ip link add br0 type bridge
$ ip link set vxlan100 master bridge
$ ip link set vxlan100 up
$ ip link set br0 up
下面模拟把容器加入到网桥的操作,创建一个 network namespace,和一对 veth pair:
ip netns add container1
# 创建 veth pair,并把一端加到网桥上
ip link add veth0 type veth peer name veth1
ip link set dev veth0 master br0
ip link set dev veth0 up
# 配置容器内部的网络和 IP
ip link set dev veth1 netns container1
ip netns exec container1 ip link set lo up
ip netns exec container1 ip link set veth1 name eth0
ip netns exec container1 ip addr add 10.20.1.2/24 dev eth0
ip netns exec container1 ip link set eth0 up
为了方便操作,我把上面的过程写成了一个
脚本
。
使用这个脚本,下面的命令就能方便地创建另外一个容器:
$ ./set_container br0 container4 10.20.1.4/24
用同样的方法在另外一台主机上配置 vxlan 网络,添加 IP 为 10.20.1.3/24 的容器,并测试它们的连通性。
容器通信过程和前面的实验类似,只不过这里容器发出的 ARP 报文会被网桥转发给
vxlan0
,然后
vxlan0
添加 vxlan 头部通过多播来找到对方的 MAC 地址。
从逻辑上可以认为,在
vxlan1
的帮助下同一个 vxlan overlay 网络中的容器是连接到同一个网桥上的,示意图如下:
多播实现很简单,不需要中心化的控制。但是不是所有的网络都支持多播,而且需要事先规划多播组和 VNI 的对应关系,在 overlay 网络数量比较多时也会很麻烦,多播也会导致大量的无用报文在网络中出现。现在很多云计算的网络都会通过自动化的方式来发现 vtep 和 MAC 信息,也就是自动构建 vxlan 网络。下面的几个部分,我们来解开自动化 vxlan 网络的秘密。
Vincent Bernat -VXLAN & Linux
Linux Kernel Documentation: vxlan
Software Defined network using VXLAN
Docker Multi Host Networking: Overlay to the Rescue
Deep Dive into Docker Overlay Network Part 3