vxlan学习总结
大纲
- VXLAN 基础概念
- VXLAN 报文结构
- VXLAN 中的常见名词
- Liunx上配置VXLAN
- 点对点的VXLAN
- 多播模式VXLAN
- brigde + VXLAN
- 参考资料
VXLAN 基础概念
VXLAN(Virtual eXtensible Local Area Network,虚拟可扩展局域网),是一种虚拟化隧道通信技术。它是一种 Overlay(覆盖网络)技术,通过三层的网络来搭建虚拟的二层网络
VXLAN 是在底层物理网络(underlay)之上使用隧道技术,借助UDP 层构建的 Overlay 的逻辑网络,使逻辑网络与物理网络解耦,实现灵活的组网需求。它对原有的网络架构几乎没有影响,不需要对原网络做任何改动,即可架设一层新的网络
VXLAN 不仅支持一对一,也支持一对多,一个 VXLAN 设备能通过像网桥一样的学习方式学习到其他对端的 IP 地址,还可以直接配置静态转发表。
- Underlay 底层物理网络
- Overlay 覆盖网络
VXLAN 是 k8s CNI规范的基础 flannel等都是基于VXLAN实现大二层网络
https://www.kernel.org/doc/html/latest/networking/vxlan.html
VXLAN的优势
可以创建更多的子网
VLAN tag 总共有 4 个字节,其中有 12 bit 用来标识不同的二层网络(即 LAN ID),故而最多只能支持 2^12,即 4096 个子网的划分
对于超大型云服务数据中心来说 子网段太少了
VXLAN 的报文 Header 预留了 24 bit 来标识不同的二层网络(即 VNI,VXLAN Network Identifier),即 3 个字节,可以支持 2 24 2^{24} 224 个子网。
减少MAC地址的膨胀
对于同网段主机的通信而言,报文到底交换机后都会查询 MAC 地址表进行二层转发,对于超大型云服务数据中心来说,MAC地址的增加对交换机的影响巨大(交换机的内存是有限的,因而 MAC 地址表也是有限的)
VXLAN使用 VTEP将二层以太网帧封装在 UDP 中,一个 VTEP 可以被一个物理机上的所有 VM(或容器)共用,一个物理机对应一个 VTEP。从交换机的角度来看,只是不同的 VTEP 之间在传递 UDP 数据,只需要记录与物理机数量相当的 MAC 地址表条目就可以了
动态迁移
VXLAN 将二层以太网帧封装在 UDP 中(上面说过了),相当于在三层网络上构建了二层网络。这样不管你物理网络是二层还是三层,都不影响虚拟机(或容器)的网络通信,也就无所谓部署在哪台物理设备上了,可以随意迁移。(虚拟机迁移需要保证ip mac地址都不变)
VXLAN 报文结构
将原始的ip包(注意是包含链路层数据的包)加入vxlan头后 作为UDP包的内容发送,由于vxlan是内核支持,所以数据的解析都在内核中处理了不会再到用户层
VXLAN Header :
在原始二层帧的前面增加 8 字节的 VXLAN 的头部,其中最主要的是 VNID,占用 3 个字节(即 24 bit),类似 VLAN ID,可以具有 2^24个网段。
UDP Header :
在 VXLAN 和原始二层帧的前面使用 8 字节 UDP 头部进行封装(MAC IN UDP),目的端口号缺省使用 4789,源端口按流随机分配(通过 MAC,IP,四层端口号进行 hash 操作), 这样可以更好的做 ECMP。
在上面添加的二层封装之后,再添加底层网络的 IP 头部(20 字节)和 MAC 头部(14 字节),这里的 IP 和 MAC 是宿主机的 IP 地址和 MAC 地址
这里需要注意 MTU 的问题,传统网络 MTU 一般为 1500,这里加上 VXLAN 的封装多出的(36+14/18,对于 14 的情况为 access 口,省去了 4 字节的 VLAN Tag)50 或 54 字节,需要调整 MTU 为 1550 或 1554,防止频繁分包。
VXLAN 中的常见名词
- Underlay
底层物流网络
Underlay交换机(物理或虚拟)MTU 问题,传统网络 MTU 一般为 1500,这里加上 VXLAN 的封装多出的50 或 54 字节,需要调整 MTU 为 1550 或 1554,防止频繁分包。一般设置为1600+ 或者将物流网卡MTU设小与1500。
- Overlay
VTEP(VXLAN Tunnel Endpoints,VXLAN VTEP隧道端点)
VXLAN 网络的边缘设备,用来进行 VXLAN 报文的处理(封包和解包)。VTEP 可以是网络设备(比如交换机),也可以是一台机器(比如虚拟化集群中的宿主机)。
VNI(VXLAN Network Identifier,VXLAN 网络标识符)
VNI 是每个 VXLAN 段的标识,是个 24 位整数,一共有 2^24 = 16777216(一千多万),一般每个 VNI 对应一个租户,也就是说使用
VNI是每个VXLAN的标识,占24 bits,所以是个24位整数,因此最大值是224=16777216
VXLAN 搭建的公有云可以理论上可以支撑千万级别的租户。
VNI 重要 用来识别不同的子网
Tunnel(VXLAN 隧道)
隧道是一个逻辑上的概念,在 VXLAN 模型中并没有具体的物理实体向对应。隧道可以看做是一种虚拟通道,VXLAN 通信双方认为自己是在直接通信,并不知道底层网络的存在。从整体来说,每个 VXLAN 网络像是为通信的虚拟机搭建了一个单独的通信通道,也就是隧道。
VXLAN 的工作模型,它创建在原来的 IP 网络(三层)上,只要是三层可达(能够通过 IP 相互通信)的网络就能部署 VXLAN
VXLAN 网络的每个端点都有一个 VTEP 设备,负责 VXLAN 协议报文的解包和封包,也就是在虚拟报文上封装 VTEP 通信的报文头部
Liunx上配置VXLAN
vxlan 出现在 kernel 3.7.0 以上版本
man ip-link 查看当前系统是否支持vxlan
点对点的VXLAN
配置流程
A主机上
ip link add vxlan0 type vxlan id 100 remote 192.168.0.54 local 192.168.0.7 dstport 4789 dev enp0s3
ip link set vxlan0 up
ip addr add local 172.17.0.32/24 dev vxlan0
B主机上
ip link add vxlan0 type vxlan id 100 remote 192.168.0.7 local 192.168.0.54 dstport 4789 dev enp0s3
ip link set vxlan0 up
ip addr add local 172.17.0.67/24 dev vxlan0
配置解析:
- vxlan0 type vxlan: 表示创建名称为vxlan0的设备 及VXLAN中的VTEP
- id 100:表示VNI的值 有效范围是 (1~16777216 )(id一样的才能视为一个网段 才能互通)
- remote 为远端主机的 IP
- local 为你本地主机的 IP
- dstport 通信的端口,IANA 分配的端口是 4789。如果不指定,Linux 默认使用 8472
- dev 代表 VXLAN 数据从哪个接口传输。这里是enp0s3
在 VXLAN 中,一般将 VXLAN 接口(本例中即 vxlan0)叫做 VTEP。
一个 VXLAN 网络的 ping 报文要经历 ARP 寻址 + ICMP 响应 两个过程,一旦 VTEP 设备学习到了对方 ARP 地址,后续通信就可以免去 ARP 寻址的过程。
多播模式VXLAN
多播组主要通过 ARP 泛洪来学习 MAC 地址,即在 VXLAN 子网内广播 ARP 请求,然后对应节点进行响应。group 指定多播组的地址。
这样就不需要指定remote local 并且可以配置多个机器
配置流程
A主机上
ip link add vxlan0 type vxlan id 4100 group 224.1.1.1 dstport 4789 dev enp0s3
ip link set vxlan0 up
ip addr add local 172.17.0.32/24 dev vxlan0
B主机上
ip link add vxlan0 type vxlan id 4100 group 224.1.1.1 dstport 4789 dev enp0s3
ip link set vxlan0 up
ip addr add local 172.17.0.67/24 dev vxlan0
C主机上
ip link add vxlan0 type vxlan id 4100 group 224.1.1.1 dstport 4789 dev enp0s3
ip link set vxlan0 up
ip addr add local 172.17.0.11/24 dev vxlan0
brigde + VXLAN
使用linux 虚拟网桥 + VXLAN 实现多命名空间构建大二层网络
实现模拟在AB两个主机内创建多个网络命名空间 实现构建overlay网络环境
A主机上执行命令
#创建网桥br1并启动
brctl addbr br1
ip link set br1 up
# 创建vxlan VTEP隧道端点并启动
ip link add vxlan0 type vxlan id 4100 group 224.1.1.1 dstport 4789 dev enp0s3
ip link set vxlan0 up
# 将vxlan VTEP添加到网桥上
brctl addif br1 vxlan0
# 创建一对虚拟网卡 用于连接命名空间和网桥
ip link add tap1 type veth peer name veth1
ip link add tap2 type veth peer name veth2
# 创建命名空间
ip netns add ns1
ip netns add ns2
# 将网卡一端放入命名空间 设置网卡ip 并启动网卡
ip link set tap1 netns ns1
ip link set tap2 netns ns2
ip netns exec ns1 ip addr add local 172.17.0.3/16 dev tap1
ip netns exec ns1 ip link set tap1 up
ip netns exec ns2 ip addr add local 172.17.0.11/16 dev tap2
ip netns exec ns2 ip link set tap2 up
# 将网卡另一端放入网桥 并启动网卡
ip link set veth1 up
brctl addif br1 veth1
ip link set veth2 up
brctl addif br1 veth2
B主机上执行命令
#创建网桥br1并启动
brctl addbr br1
ip link set br1 up
# 创建vxlan VTEP隧道端点并启动
ip link add vxlan0 type vxlan id 4100 group 224.1.1.1 dstport 4789 dev enp0s3
ip link set vxlan0 up
# 将vxlan VTEP添加到网桥上
brctl addif br1 vxlan0
# 创建一对虚拟网卡 用于连接命名空间和网桥
ip link add tap3 type veth peer name veth3
ip link add tap4 type veth peer name veth4
# 创建命名空间
ip netns add ns3
ip netns add ns4
# 将网卡一端放入命名空间 设置网卡ip 并启动网卡
ip link set tap3 netns ns3
ip link set tap4 netns ns4
ip netns exec ns3 ip addr add local 172.17.0.15/16 dev tap3
ip netns exec ns3 ip link set tap3 up
ip netns exec ns4 ip addr add local 172.17.0.22/16 dev tap4
ip netns exec ns4 ip link set tap4 up
# 将网卡另一端放入网桥 并启动网卡
ip link set veth3 up
brctl addif br1 veth3
ip link set veth4 up
brctl addif br1 veth4
测试