云计算三大组成部分:计算、存储和网络。VXLAN属于云计算虚拟化网络的非常重要的一部分,现在大多数云计算虚拟化网络都是基于此协议实现数据中心互联和虚拟机迁移 ,在数量级很大的虚拟机上完成这些工作是一个非常大的挑战。主要面临以下挑战:
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协议通过UDP NVO3技术解决了网络扩展和迁移的问题,但是也会有一些缺点:
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映射。
在计算机网络中,L2 根据MAC表转发,如果是首次通信则通过发送ARP广播报文请求目的MAC地址再进行转发;L3 layer转发依赖的是FIB转发表,用于判断基于 IP 包的网络前缀,如何进行转发。通过转发方式,在VXLAN网络上转发的数据包分为两类。
在VXLAN网络中,BUM数据包可以通过复制方式转发,主要有ingress、centralized和multicast模式
不同的VLAN需要通过三层Gateway相互通信,三层Gateway也需要用于不同虚拟机的VXLANs之间通信。现在大多数常用的网关部署方式采用分布式网关部署的方式,在分布式 VXLAN 网关网络中,每个leaf节点作为一个 VTEP 和一个第三层 VXLAN 网关。 Spine节点不知道 VXLAN 隧道,只转发 VXLAN 数据包。
在该方案中需要一个control plane在三层网关之间传输主机路由,保证主机之间的通信。所以现在大多数的通过EVPN作为虚拟局域网的控制面。EVPN通过BGP/MPLS IP VPN机制定义BGP EVPN 路由,实现自动 VTEP 发现和主机地址学习。关于BGP EVPN和L3 DCI内容,在后续博客进行更新。
VXLAN实现有两种实现方式一种是通过Linux Kernel另外一种通过OpenvSwitch。
我通过vagrant创建了两台虚拟机box为CentOS 8,所以首先启动两台虚拟机:
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 |
---|
然后我们直接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 |
---|
之前在介绍单播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并实现该多播互通。
一台主机可以有成千上万个容器进行管理和通信,所以我们需要通过一种方式将成千上万的通信实体进行连接,通过bridge来连接多个vm,linux已经支持bridge、MacVLan和VXLAN多种网络驱动通信,现在跨主机的网络通信大多数采用的VXLAN Overlay的方式。docker网络下一篇文章再详细介绍,值得提一句的是,Docker网络架构主要分为:CNM、Libnetwork和驱动。CNM是顶层网络设计;Libnetwork是实现,主要实现了控制层和管理层;驱动主要实现了数据层。
NVO3技术还有其它协议:GENEVE和STT。
在三层网络上,在 IP 报头中使用类似 tcp 的报头。 使用 TCP 字段已经被提议为向下兼容提供 NICs 的现有实现来支持卸载逻辑,因此 STT 特别适用于目标终端系统的部署,例如物理服务器上的虚拟交换机。
头部 MAC 的外部为18字节; 使用 IPv4时的外部 IP 为20字节; GRE 的 VSID 的外部 IP 为16字节,支持的网卡比较少。
1.华为VXLAN白皮书
2.Comparison: VXLAN vs NVGRE vs STT vs LISP - Overlay Network Technologies
5.什么是VXLAN
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。