我是靠谱客的博主 怕孤单小馒头,最近开发中收集的这篇文章主要介绍《Kubernetes网络权威指南》读书笔记 | Linux隧道网络的代表:VXLAN,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

书籍来源:《Kubernetes网络权威指南:基础、原理与实践》

一边学习一边整理读书笔记,并与大家分享,侵权即删,谢谢支持!

附上汇总贴:《Kubernetes网络权威指南》读书笔记 | 汇总_COCOgsta的博客-CSDN博客


VXLAN(Virtual eXtensible LAN,虚拟可扩展的局域网),是一种虚拟化隧道通信技术。它是一种overlay(覆盖网络)技术,通过三层的网络搭建虚拟的二层网络。

VXLAN是不仅能适配虚拟机环境,还能用于容器环境。VXLAN的一个特点是对原有的网络架构影响小,不需要对原网络做任何改动,就可在原网络的基础上架设一层新的网络。

不同于其他隧道协议,VXLAN是一个一对多的网络。一个VXLAN设备能像网桥一样的学习到其他对端的IP地址,也可以直接配置静态转发表。

一个典型的数据中心VXLAN网络拓扑图如图1-20所示。

图1-20 VXLAN网络拓扑图

VXLAN不仅能用在基于虚拟机的虚拟化系统中,还被广泛应用于容器集群。

1.7.1 为什么需要VXLAN

VXLAN能突破VLAN的最多4096个子网的数量限制,以满足大规模云计算数据中心的需求。

1.7.2 VXLAN协议原理简介

只要是三层可达(能够通过IP互相通信)的网络就能部署VXLAN。每个端点部署VTEP设备,负责VXLAN协议报文的封包和解包。物理网络上可以创建多个VXLAN网络,并通过VNI标识,使得不同的VXLAN可以相互隔离。

图1-21 VXLAN的工作模型

VXLAN封包格式如图1-22所示。

图1-22 VXLAN封包格式

VXLAN的报文就是MAC in UDP,原来的二层以太网帧(包含MAC头部、IP头部和传输层头部的报文),被放在VXLAN包头里进行封装,再套到标准的UDP头部(UDP头部、IP头部和MAC头部),用来在底层网络上传输报文。

VXLAN报文比原始报文多出了50个字节,这降低了网络链路传输有效数据的比例,特别是对小包。

VXLAN的配置管理使用iproute2包,常用的ip命令就是iproute2的客户端工具。建议Linux内核版本在3.9以上。

1.7.3 VXLAN组网必要信息

VXLAN报文转发过程看似并不复杂,但前提是通信双方已经知道所有通信信息。第一次通信之前有以下问题待解决:

  • 哪些VTEP需要加到一个相同的VNI组?
  • 发送方如何知道对方的MAC地址?
  • 如何知道目的服务器在哪个节点上?

第一个问题:VTEP通常由网络管理员进行配置。

另外两个问题:使用多播和控制中心。多播就是同一个VXLAN网络的VTEP加入同一个多播网络。如果需要知道以上信息,就在组内发送多播来查询。控制中心的概念是在某个集中式的地方保存所有虚拟机的上述信息,自动告知VTEP它需要的信息即可。

1.7.4 VXLAN基本配置命令

VXLAN接口的基本管理如下。

  1. 创建VXLAN接口

这条命令会创建一个叫作VXLAN0的新接口,它使用在eth0上的多播组239.1.1.1通信。目的端口号是IANA规定的4789。

  1. 删除VXLAN接口

  1. 查看VXLAN接口信息

  1. VXLAN转发表

创建一条转发表项:

00:17:42:8a:b4:05即对端VTEP的MAC地址,192.19.0.2即对端VTEP的IP地址。

删除一条转发表项:

查看VXLAN接口的转发表:

1.7.5 VXLAN网络实践

我们将通过几个例子说明如何搭建基于VXLAN的overlay网络。

  1. 点对点的VXLAN

点对点VXLAN网络拓扑如图1-23所示。

图1-23 点对点VXLAN网络拓扑图

使用ip link命令创建VXLAN接口:

用ip -d link命令查看它的详细信息:

配置IP地址并启用:

检查路由表项多了下面的内容:

同时,vxlan0的FDB表项中的内容如下:

这个表项的意思是,原始报文经过vxlan0后会被内核添加上VXLAN头部,而外部UDP头的目的IP地址为192.168.1.3。

在另外一台机器上(192.168.1.3)也进行类似的配置。测试两个VTEP的连通性,如下所示:

  1. 多播模式的VXLAN

这个实验和前面一个非常相似,只不过主机之间不是点对点的连接,而是通过多播组成一个虚拟的整体。多播模式的VXLAN网络拓扑如图1-24所示。

图1-24 多播模式的VXLAN网络拓扑

和点对点模型相比就多了group参数,命令如下:

(图中117.1.1.1应为224.1.1.1)

配置IP地址并启用它:

这里最重要的参数是group 224.1.1.1,它表示将VTEP加入一个多播组,多播地址是224.1.1.1。

运行上面的命令之后,一样添加了以下路由信息:

不同的是FDB表项的内容:

(图中239.1.1.1应为224.1.1.1)

dst字段的值变成了多播地址224.1.1.1,意思是原始报文经过vxlan0后被内核添加上VXLAN头部,其外部UDP头的目的IP地址为多播地址224.1.1.1。

同理,对所有需要通信的节点进行上述配置,可以验证它们能否通过172.17.1.0/24网络互相通信。

配置完成之后,VTEP通过IGMP加入同一个多播组224.1.1.1。

总结多播模式下VXLAN通信的全过程:一个VXLAN网络的ping报文要经历ARP寻址+ICMP响应两个过程。

  1. VXLAN+ 桥接网络

在实际生产中,每台主机上都有几十台甚至上百台虚拟机或者容器需要通信,因此需要找到一种方法将这些通信实体组织起来,再经过隧道口VTEP转发出去:使用网桥把多个虚拟机或者容器放到同一个VXLAN网络中,VXLAN+网桥的网络拓扑如图1-25所示。

图1-25 VXLAN+网桥的网络拓扑

和上面的多播模式相比,这里只是多了一块网桥,连接同一个主机上的不同容器的veth pair。

创建VXLAN网卡,使用的是多播模式:

创建网桥bridge0,把VXLAN网卡vxlan0绑定到上面,并启动:

创建network namespace和一对veth pair,其中一端绑定到网桥,另一端放到network namespace并绑定IP地址172.17.1.2:

用同样的方法在另一台主机上配置VXLAN网络,绑定172.17.1.3到另外一个network namespace中的eth0。

整个通信过程和前面的实验类似,只不过容器发出的ARP报文会先经过网桥,再转发给vxlan0。

1.7.6 分布式控制中心

实际生产中VXLAN的多播模式很少被采用。如果能够事先知道MAC地址和VTEP IP信息,直接告诉发送方VTEP,就不需要多播了。

分布式控制中心架构会在每个VTEP所在的节点都运行一个agent,获取隧道通信需要的信息并以某种方式告诉VTEP。

1.7.7 自维护VTEP

创建VXLAN网卡时,不使用remote或group参数:

这个VTEP创建时没有指定多播地址,当第一个ARP请求报文发送时,我们可以手动添加默认的FDB表项,例如:

相当于手动维护了一个VTEP的多播组。

在所有节点的VTEP上更新对应的FDB表项,就能实现overlay网络的连通。使用一些自动化工具,定时更新FDB表项,就能动态地维护VTEP的拓扑结构。

这个方案存在一个问题:每次查找MAC地址要发送大量的无用报文,每次查询都发送N个报文,其中只有一个报文真正有用。

手动维护FDB表项

在创建VXLAN设备时添加了nolearning参数,这个参数告诉VTEP不要通过收到的报文学习FDB表项的内容,因为我们自己会进行维护:

添加FDB表项,告诉VTEP容器/虚拟机MAC地址与对应主机IP地址的映射关系:

如果知道了对方的MAC地址,则VTEP搜索FDB表项就知道应该发送到哪个对应的VTEP了。这个情况还是需要默认的表项(那些全零的表项),在不知道容器IP和MAC的对应关系时,通过默认方式发送ARP报文查询对方的MAC地址。

和上一个方法相比,这个方法只是把自动学习FDB表项换成了手动维护(当然,实际情况一般是由自动化程序来维护),第一次发送ARP请求还是会往VTEP组发送大量单播报文。

手动维护ARP表项

Linux提供了一个解决方案,使VTEP可以作为ARP代理,回复ARP请求。只要VTEP知道对应的IP地址和MAC地址的映射关系,在接收到容器发来的ARP请求时就可以直接做出应答。

这条命令和上面的相比多了proxy参数,这个参数告诉VTEP承担ARP代理的功能,即如果收到ARP请求并且知道结果就直接做出应答。

当然,还是要手动更新FDB表项来构建VTEP组:

还要为VTEP添加ARP表项。所有要通信容器的IP地址和MAC地址的映射关系都要加进去:

当容器要访问彼此,并且第一次发送ARP请求时,这个请求并不会发给所有的VTEP,而是由当前VTEP做出应答,大大减少了网络上的报文。

借助自动化的工具做到实时的表项(FDB和ARP)更新,这种方法能高效实现overlay网络的通信。

动态更新FDB和ARP表项

前一种方法还有一个问题:必须提前添加所有容器到ARP和FDB表项中,但并不是所有的容器都会互相通信,有些表项(尤其是ARP表项)是用不到的。

Linux提供了另外一种方法,使内核能够动态地通知节点要和哪个容器通信,应用程序可以订阅这些事件。如果内核发现需要的ARP或者FDB表项不存在,则会发送事件给订阅的应用程序,这样应用程序可以从内核拿到这些信息更新表项,做到更精确的控制。

要实现这种功能,创建VTEP的时候需要加上额外的参数:

这次多了两个参数l2miss和l3miss:

  • l2miss:如果设备找不到MAC地址需要的VTEP地址,就发送通知事件;
  • l3miss:如果设备找不到需要IP对应的MAC地址,就发送通知事件。

ip monitor命令能监听某个网卡的事件:

如果从本节点的容器ping另外一个节点的容器,就先发送L3miss:

l3miss说明了VTEP不知道它对应的MAC地址,因此要手动添加ARP记录,如下所示:

nud reachable参数的意思是,系统发现它无效一段时间后会自动删除,无须用户手动删除。

这时还是不能正常通信,内核出现了L2miss的通知事件:

这个事件的含义是不知道这个容器的MAC地址在哪个节点上,所以要手动添加FDB记录:

在通信的另一台机器上执行响应的操作,两者就能ping通。

最后

以上就是怕孤单小馒头为你收集整理的《Kubernetes网络权威指南》读书笔记 | Linux隧道网络的代表:VXLAN的全部内容,希望文章能够帮你解决《Kubernetes网络权威指南》读书笔记 | Linux隧道网络的代表:VXLAN所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(51)

评论列表共有 0 条评论

立即
投稿
返回
顶部