安徽建设银行网站,爱站网长尾关键词挖掘工具下载,佛山自助建站系统,从零开始学习网站建设VXLAN#xff08;Virtual eXtensible Local Area Network#xff0c;虚拟可扩展局域网#xff09;#xff0c;是一种虚拟化隧道通信技术。它是一种Overlay#xff08;覆盖网络#xff09;技术#xff0c;通过三层的网络来搭建虚拟的二层网络。
VXLAN介绍
VXLAN是在底层…VXLANVirtual eXtensible Local Area Network虚拟可扩展局域网是一种虚拟化隧道通信技术。它是一种Overlay覆盖网络技术通过三层的网络来搭建虚拟的二层网络。
VXLAN介绍
VXLAN是在底层物理网络underlay之上使用隧道技术借助UDP层构建的Overlay的逻辑网络使逻辑网络与物理网络解耦实现灵活的组网需求。它对原有的网络架构几乎没有影响不需要对原网络做任何改动即可架设一层新的网络。也正是因为这个特性很多容器的网络才会选择VXLAN作为通信网络。
VXLAN不仅支持一对一也支持一对多一个VXLAN设备能通过像网桥一样的学习方式学习到其他对端的IP地址还可以直接配置静态转发表。
VXLAN基本概念 VNIVXLAN Network IdentifierVXLAN网络标识符VXLAN通过VXLAN ID来标识其长度为24比特。一般每个VNI对应一个租户也就是说使用VXLAN理论上可以支撑千万级别的租户。 VTEPVXLAN Tunnel End PointVXLAN隧道端点VXLAN网络的边缘设备用来进行VXLAN报文的处理封包和解包。VXLAN的相关处理都在VTEP上进行例如识别以太网数据帧所属的VXLAN、基于VXLAN对数据帧进行二层转发、封装/解封装报文等。VTEP可以是一台独立的物理设备也可以是虚拟机所在服务器的虚拟交换机。 VXLAN Tunnel两个VTEP之间点到点的逻辑隧道。VTEP为数据帧封装VXLAN头、UDP头、IP头后通过VXLAN隧道将封装后的报文转发给远端VTEP远端VTEP对其进行解封装。隧道是一个逻辑上的概念在VXLAN模型中并没有具体的物理实体向对应。隧道可以看做是一种虚拟通道VXLAN通信双方认为自己是在直接通信并不知道底层网络的存在。从整体来说每个VXLAN网络像是为通信的虚拟机搭建了一个单独的通信通道也就是隧道。 上图所示为VXLAN的工作模型它创建在原来的IP网络三层上只要是三层可达能够通过IP相互通信的网络就能部署 VXLAN。在VXLAN网络的每个端点都有一个VTEP设备负责VXLAN协议报文的解包和封包也就是在虚拟报文上封装VTEP通信的报文头部。
物理网络上可以创建多个VXLAN网络可以将这些VXLAN网络看成一个隧道不同节点上的虚拟机/容器能够通过隧道直连。通过VNI标识不同的VXLAN网络使得不同的VXLAN可以相互隔离。
VXLAN的报文格式 VXLAN Header在原始二层帧的前面增加8字节的VXLAN的头部其中最主要的是VNID占用3个字节即24bit类似VLAN ID可以具有2^24个网段。
UDP Header在VXLAN和原始二层帧的前面使用8字节UDP头部进行封装MAC IN UDP目的端口号缺省使用4789源端口按流随机分配通过MACIP四层端口号进行hash操作这样可以更好的做ECMP。
在上面添加的二层封装之后再添加底层网络的IP头部20 字节和MAC头部14 字节这里的IP和MAC是宿主机的IP地址和 MAC地址。
VXLAN通讯过程
总的来说VXLAN报文的转发过程就是原始报文经过VTEP被VTEP添加上VXLAN头部以及外层的UDP头部再发送出去对端 VTEP接收到VXLAN报文后拆除外层UDP头部并根据VXLAN头部的VNI把原始报文发送到目的服务器。但这里有一个问题第一次通信前双方如何知道所有的通信信息这些信息包括
哪些VTEP需要加到一个相同的VNI组发送方虚拟机怎么知道对方的MAC地址VTEP怎么知道目的虚拟机在哪一台宿主机上
这三个问题可以归结为同一个问题VXLAN网络怎么感知彼此的存在并选择正确的路径传输报文
第一个问题简单VTEP通常由网络管理员来配置。要回答后面两个问题还得回到VXLAN协议的报文上看看一个完整的VXLAN报文需要哪些信息
内层报文通信双方的IP地址已经明确只需要VXLAN填充对方的MAC地址因此需要一个机制来实现ARP功能。VXLAN头部只需要知道VNI。一般直接配置在VTEP上要么提前规划要么根据内层报文自动生成。UDP头部需要知道源端口和目的端口源端口由系统自动生成目的端口默认是4789。IP头部需要知道对端VTEP的IP地址这个是最关键的部分。
实际上VTEP也会有自己的转发表转发表通过泛洪和学习机制来维护对于目标MAC地址在转发表中不存在的未知单播广播流量都会被泛洪给除源VTEP外所有的VTEP目标VTEP响应数据包后源VTEP会从数据包中学习到MACVNI和VTEP的映射关系并添加到转发表中后续当再有数据包转发到这个MAC地址时VTEP会从转发表中直接获取到目标VTEP地址从而发送单播数据到目标VTEP。
点对点的VXLAN通信
点对点的VXLAN通信在这个实验中使用两台虚拟机构成一个VXLAN网络每台机器的网卡作为vtep通过设置的ip互相通信。
主机规划
node1172.20.160.13/20node2172.20.161.221/20
实验结构图如下图所示。 对于两台主机的网卡之间的通信如果不使用vxlan就需要设置路由表此时两个网卡的ip不能是同一个网段。接下来进行点对点的vxlan的通信。
在node1上创建一个名字为vxlan-ethd类型为vxlan的网卡后面是vxlan-ethd网卡需要的参数
id 1指定VNI的值这个值可以在1到2^24之间dstportvtep通信的端口remote 172.20.161.221对方vtep的地址类似于点对点协议local 172.20.160.13当前节点vtep要使用的IP地址
$ sudo ip link add vxlan-ethd type vxlan id 1 dstport 4789 remote 172.20.161.221 local 172.20.160.13启动vxlan-ethd网卡并为其分配IP
$ sudo ip link set vxlan-ethd up
$ sudo ip addr add 10.0.1.1/24 dev vxlan-ethd在node2上也进行同样的操作
$ sudo ip link add vxlan-ethd type vxlan id 1 dstport 4789 remote 172.20.160.13 local 172.20.161.221
$ sudo ip link set vxlan-ethd up
$ sudo ip addr add 10.0.1.2/24 dev vxlan-ethd接下来这两个位于不同虚拟机上的网卡就可以通过vxlan隧道进行通信了在node1中尝试访问node2的10.0.1.2
$ ping -I 10.0.1.1 10.0.1.2 -c 3
PING 10.0.1.2 (10.0.1.2) from 10.0.1.1 : 56(84) bytes of data.
64 bytes from 10.0.1.2: icmp_seq1 ttl64 time0.899 ms
64 bytes from 10.0.1.2: icmp_seq2 ttl64 time0.934 ms
64 bytes from 10.0.1.2: icmp_seq3 ttl64 time1.53 ms--- 10.0.1.2 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2022ms
rtt min/avg/max/mdev 0.899/1.124/1.539/0.293 ms跨主机的容器通信
上面最简单的点对点VXLAN实验只是个简单的演示没有太多实际工程意义本节用容器通信来演示一个更加完整的场景。
场景描述在node1和node2上各部署一个docker容器默认情况下一个容器宿主机上的容器能够直接用私网IP地址通信因为它们利用一个网桥接在一起。而不同宿主机上的容器无法直接用私网IP地址通信。使用自建的vxlan网络接口来打通不同宿主机上容器让它们可以直接利用内网IP通信。
准备容器
在node1上创建app1容器指定IP为172.18.0.2
$ sudo docker network create --subnet 172.18.0.0/16 my-network
04a3be456f01099cb18818fa50804cc69a359ee77ba8d8d3e3bb12cf06e52434$ sudo docker container run -d --rm --name app1 --network my-network --ip 172.18.0.2 busybox ping 8.8.8.8
c7fbfe06fb871d88d3fc9224636c25da78d61cf8aaa98b87df65403e771437be在node2上创建app2容器指定IP为172.18.0.3
$ sudo docker network create --subnet 172.18.0.0/16 my-network
09fb688212d956ebbb5e775f8d8847d9cf2705c7ed96127dc411648383ba839f$ sudo docker container run -d --rm --name app2 --network my-network --ip 172.18.0.3 busybox ping 8.8.8.8
745c98439680ecc9ef97b02aabda3dcc8fb19bd76f73b2e79d9134f858b17fbd在node1中的容器app1上访问node2中的容器app2和预期一致是无法ping通的
$ sudo docker container exec -it app1 ping -c 3 172.18.0.3
PING 172.18.0.3 (172.18.0.3): 56 data bytes--- 172.18.0.3 ping statistics ---
3 packets transmitted, 0 packets received, 100% packet loss创建VXLAN接口接入docker网桥
在两个容器宿主机上各创建一个VXLAN接口并且将VXLAN接口接入docker网桥的端口上如下图 有了VXLAN接口的连接后从node1上容器app1发出的包到达docker网桥后可以从网桥的VXLAN接口出去从而报文在VETP(VXLAN接口)处被封装成VXLAN报文再从物理网络上到达对端VETP所在的主机node2。对端VTEP能正确解包VXLAN报文的话随后即可将报文通过node2上的docker网桥送到上层的docker容器app2中。
在node1上配置如下
$ sudo ip link add vxlan_docker type vxlan id 200 remote 172.20.161.221 dstport 4789 dev eth0$ sudo ip link set vxlan_docker up$ sudo brctl addif br-04a3be456f01 vxlan_docker在node2上配置如下
$ sudo ip link add vxlan_docker type vxlan id 200 remote 172.20.160.13 dstport 4789 dev eth0$ sudo ip link set vxlan_docker up$ sudo brctl addif br-09fb688212d9 vxlan_docker此时再在node1中的容器app1上访问node2中的容器app2结果如下ping可以通。
$ sudo docker container exec -it app1 ping -c 3 172.18.0.3
PING 172.18.0.3 (172.18.0.3): 56 data bytes
64 bytes from 172.18.0.3: seq0 ttl64 time1.841 ms
64 bytes from 172.18.0.3: seq1 ttl64 time0.562 ms
64 bytes from 172.18.0.3: seq2 ttl64 time1.615 ms--- 172.18.0.3 ping statistics ---
3 packets transmitted, 3 packets received, 0% packet loss
round-trip min/avg/max 0.562/1.339/1.841 msFDB表
FDBForwarding Database entry即转发表是Linux网桥维护的一个二层转发表用于保存远端虚拟机/容器的MAC地址远端VTEP IP以及VNI的映射关系可以通过bridge fdb命令来对FDB表进行操作
$ sudo bridge fdb
02:42:ac:12:00:03 dev vxlan_docker master br-e4fbde69f952
ca:d7:ea:37:0a:b2 dev vxlan_docker vlan 1 master br-e4fbde69f952 permanent
ca:d7:ea:37:0a:b2 dev vxlan_docker master br-e4fbde69f952 permanent
00:00:00:00:00:00 dev vxlan_docker dst 172.20.161.221 via eth0 self permanent
02:42:ac:12:00:03 dev vxlan_docker dst 172.20.161.221 self
33:33:00:00:00:01 dev br-e4fbde69f952 self permanent
01:00:5e:00:00:01 dev br-e4fbde69f952 self permanent
02:42:f7:03:fb:17 dev br-e4fbde69f952 vlan 1 master br-e4fbde69f952 permanent
02:42:f7:03:fb:17 dev br-e4fbde69f952 master br-e4fbde69f952 permanent