《Kubernetes网络权威指南》读书笔记 | Linux隧道网络的代表:VXLAN
Posted COCOgsta
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了《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接口的基本管理如下。
- 创建VXLAN接口
这条命令会创建一个叫作VXLAN0的新接口,它使用在eth0上的多播组239.1.1.1通信。目的端口号是IANA规定的4789。
- 删除VXLAN接口
- 查看VXLAN接口信息
- VXLAN转发表
创建一条转发表项:
00:17:42:8a:b4:05即对端VTEP的MAC地址,192.19.0.2即对端VTEP的IP地址。
删除一条转发表项:
查看VXLAN接口的转发表:
1.7.5 VXLAN网络实践
我们将通过几个例子说明如何搭建基于VXLAN的overlay网络。
- 点对点的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的连通性,如下所示:
- 多播模式的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响应两个过程。
- 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网络权威指南》读书笔记 | iptables
《Kubernetes网络权威指南》读书笔记 | 打通CNI与Kubernetes:Kubernetes网络驱动
《Kubernetes网络权威指南》读书笔记 | Kubernetes网络策略:为你的应用保驾护航
《Kubernetes网络权威指南》读书笔记 | 最常用的Docker网络技巧