2021-10-20为什么集群需要Overlay网络

news/2024/5/18 14:26:45 标签: udp, tcp/ip, 运维

对计算机网络或者Kubernetes网络稍有了解的工程师都应该听说过延展网络(Overlay Network),Overlay网络其实并不是一门新技术,它是指构建在另一个网络上的计算机网络,这是一种网络虚拟化技术的形式,近年来云计算虚拟化技术的演进促进了网络虚拟化技术的应用。

2020-05-14-15893911326242-overlay-network

因为Overlay网络是建立在另一个计算机网络之上的虚拟网络,所以它不能独立出现,Overlay底层依赖的网络就是Underlay网络,这两个概念也经常成对出现。

Underlay网络是专门用来承载用户IP流量的基础架构层,它与Overlay网络之间的关系有点类似物理机和虚拟机。Underlay网络和物理机都是真正存在的实体,它们分别对应着真实存在的网络设备和计算设备,而Overlay网络和虚拟机都是依托在下层实体使用软件虚拟出来的层级。

network-and-compute

在分析Overlay网络的作用之前,我们需要对它的常见实现有大概的了解,在实践中我们一般会使用虚拟局域网扩展技术(Virtual Extensible LAN,VxLAN)组建Overlay网络。在下图中,两个物理机可以通过三层的IP网络互相访问:

VxLAN-overlay-network

VxLAN使用虚拟隧道端点(Virtual Tunnel EndPoint、VTEP)设备对服务器发出和收到的数据包进行二次封装和解封。

上图中两个VTEP会相互连接并获得网络中的MAC地址、IP地址等信息,例如,服务器1中的VTEP需要知道想要访问绿色网络中的10.0.0.2虚拟机需要先访问IP地址为204.79.197.200的服务器2。这些配置可以被网络管理员手动配置、自动学习、也可以通过上层的管理器设置。当绿色的10.0.0.1虚拟机想要向绿色的10.0.0.2发送数据时,会经过以下几个步骤:

overlay-network-packet

  • 绿色的10.0.0.1会将IP数据包发送给VTEP;
  • 服务器1的VTEP收到10.0.0.1发送的数据包后;
    • 从收到的IP数据包中获取目的虚拟机的MAC地址;
    • 在本地的转发表中查找该MAC地址所在服务器的IP地址,即204.79.197.200;
    • 将绿色虚拟机所在的虚拟网络标识符(VxLAN Network Identifier,VNI)以及原始的IP数据包作为负载,构建新的UDP数据包;
    • 将新的UDP数据包发送到网络中;
  • 服务器2的VTEP收到UDP数据包后;
    • 去掉UDP数据包中的协议头;
    • 查看数据包中VNI;
    • 将IP数据包转发给目标的绿色服务器10.0.0.2;
  • 绿色的10.0.0.2会收到绿色服务器10.0.0.1发送的数据包;

在数据包的传输过程中,通信的双方都不知道底层网络做的这些转换,它们认为两者可以通过二层的网络互相访问,但是实际上经过了三层IP网络的中转,通过VTEP之间建立的隧道实现了连通。除了VxLAN之外,Overlay网络还有很多实现方案,不过也都大同小异。Overlay网络虽然能够利用底层网络在多数据中心之间组成二层网络,但是它的封包和拆包过程也会带来额外开销,所以为什么我们的集群需要Overlay网络呢,本文将介绍Overlay网络解决的三个问题:

  • 云计算中集群内的、跨集群的或者数据中心间的虚拟机和实例的迁移比较常见;
  • 单个集群中的虚拟机规模可能非常大,大量的MAC地址和ARP请求会为网络设备带来巨大的压力;
  • 传统的网络隔离技术VLAN只能建立4096个虚拟网络,公有云以及大规模的虚拟化集群需要更多的虚拟网络才能满足网络隔离的需求;

虚拟机迁移

Kubernetes目前已经是容器编排领域的事实标准了,虽然很多传统行业仍然在使用物理机部署服务,但是越来越多的计算任务在未来都会跑在虚拟机上。虚拟机迁移是将虚拟机从一个物理硬件设备移到另一个设备的过程,因为日常的更新维护,集群中的大规模虚拟机迁移是比较常见的事情,上千台物理机组成的大集群使得集群内的资源调度变得更加容易,我们可以通过虚拟机迁移来提高资源的利用率、容忍虚拟机的错误并提高节点的可移植性。

当虚拟机所在的宿主机因为维护或者其他原因宕机时,当前实例就需要迁移到其他的宿主机上,为了保证业务不中断,我们需要保证迁移过程中的IP地址不变,因为Overlay是在网络层实现二层网络,所以多个物理机之间只要网络层可达就能组建虚拟的局域网,虚拟机或者容器迁移后仍然处于同一个二层网络,也就不需要改变IP地址。

virtual-machine-migration

如上图所示,迁移后的虚拟机与其他的虚拟机虽然位于不同的数据中心,但是由于上述两个数据中心之间可以通过IP协议连通,所以迁移后的虚拟机仍然可以通过Overlay网络与原集群的虚拟机组成二层网络,集群内部的主机也完全不清楚、不关心底层的网络架构,它们只知道不同虚拟机之间是可以连通的。

虚拟机规模

我们在为什么MAC地址不需要全球唯一曾经介绍过二层网络的通信需要依赖MAC地址,一个传统的二层网络需要网络设备中存储从IP地址到MAC地址的转发表。

目前Kubernetes官方支持的最大集群为5000节点,如果这5000个节点中的每个节点都仅仅包含一个容器,这对于内部的网络设备其实没有太大的压力,但是在实际情况下5000节点的集群中都包含几万甚至几十万个容器,当某个容器向集群中发送ARP请求,集群中的全部容器都会收到ARP请求,这时会带来极高的网络负载。

在使用VxLAN搭建的Overlay网络中,网络会将虚拟机发送的数据重新封装成IP数据包,这样网络只需要知道不同VTEP的MAC地址,由此可以将MAC地址表项中的几十万条数据降低到几千条,ARP请求也只会在集群中的VTEP之间扩散,远端的VTEP将数据拆包后也仅会在本地广播,不会影响其他的VTEP,虽然这对于集群中的网络设备仍然有较高的要求,但是已经极大地降低了核心网络设备的压力。

overlay-network-and-arp

Overlay网络其实与软件定义网络(Software-defined networking、SDN)4密切相关,而SDN引入了数据平面和控制平面,其中数据平面负责转发数据,而控制平面负责计算并分发转发表。VxLAN的RFC7348中只定义了数据平面的内容,由该技术组成的网络可以通过传统的自学习模式学习网络中的MAC与ARP表项5,但是在大规模的集群中,我们仍然需要引入控制平面分发路由转发表。

网络隔离

大规模的数据中心往往都会对外提供云计算服务,同一个物理集群可能会被拆分成多个小块分配给不同的租户(Tenant),因为二层网络的数据帧可能会进行广播,所以出于安全的考虑这些不同的租户之间需要进行网络隔离,避免租户之间的流量互相影响甚至恶意攻击。传统的网络隔离会使用虚拟局域网技术(Virtual LAN、VLAN),VLAN会使用12比特表示虚拟网络ID,虚拟网络的上限是4096个。

vlan-header

4096个虚拟网络对于大规模的数据中心来说远远不够,VxLAN会使用24比特的VNI表示虚拟网络个数,总共可以表示16,777,216个虚拟网络,这也就能满足数据中心多租户网络隔离的需求了。

VxLAN-packet

更多的虚拟网络其实是VxLAN顺手带来的好处,它不应该成为使用VxLAN的决定性因素。VLAN协议的扩展协议IEEE802.1ad允许我们在以太网帧中加入两个802.1Q的协议头,两个VLAN ID组成的24比特也可以表示16,777,216个虚拟网络6,所以想要解决网络隔离不是使用VxLAN或者Overlay网络的充分条件。

总结

今天的数据中心包含多个集群以及海量的物理机,Overlay网络是虚拟机和底层网络设备之间的中间层,通过Overlay网络这一个中间层,我们可以解决虚拟机的迁移问题、降低二层核心网络设备的压力并提供更大规模的虚拟网络数量:

  • 在使用VxLAN构成二层网络中,虚拟机在不同集群、不同可用区和不同数据中心迁移后,仍然可以保证二层网络的可达性,这能够帮助我们保证线上业务的可用性、提升集群的资源利用率、容忍虚拟机和节点的故障;
  • 集群中虚拟机的规模可能是物理机是几十倍,与物理机构成的传统集群相比,虚拟机构成的集群包含的MAC地址数量可能多一两个数量级,网络设备很难承担如此大规模的二层网络请求,Overlay网络通过IP封包和控制平面可以减少集群中的MAC地址表项和ARP请求;
  • VxLAN的协议头使用24位的VNI表示虚拟网络,总共可以表示1600万的虚拟网络,我们可以为不同的虚拟网络单独分配网络带宽,满足多租户的网络隔离需求;

需要注意的是,Overlay网络只是一种在物理网络上的虚拟网络,使用该技术并不能直接解决集群中的规模性等问题,而VxLAN也不是组建Overlay网络的唯一方法,在不同场景中我们可以考虑使用不同的技术,例如:NVGRE、GRE等。到最后,我们还是来看一些比较开放的相关问题,有兴趣的读者可以仔细思考一下下面的问题:

  • VxLAN将原始数据包封装成UDP在网络上分发,那么NVGRE和STT分别使用哪些方法传输数据呢?
  • 在Kubernetes中部署Overlay网络应该使用什么技术或者软件?
  • 如果对文章中的内容有疑问或者想要了解更多软件工程上一些设计决策背后的原因,可以在博客下面留言,作者会及时回复本文相关的疑问并选择其中合适的主题作为后续的内容。

http://www.niftyadmin.cn/n/930210.html

相关文章

python生成时间序列(date_range)

介绍 自己写了一个用python内置模块实现的生成时间序列的函数 支持自动推断字符串到datetime的转换, 但对格式有一定要求, 其它格式可手动指定格式化方式, 格式化方式与python内置格式化格式完全一致 支持输出格式化 以下是方法的源代码(python环境3.5以上, 没做更多版本的支持…

Go代码规范

Go语言安全编码规范-翻译 英文地址 翻译:blood_zer0、Lingfighting 如果翻译的有问题:联系我(zer0zhang)。匆忙翻译肯定会有很多错误,欢迎大家一起讨论Go语言安全能力建设。 介绍 Go语言-Web应用程序安全编码实践是为了给任何使用Go进行编程…

Unable to start EmbeddedWebApplicationContext due to missing EmbeddedServletContainerFactory bean.

springbootshiro项目引用thymeleaf模板启动遇到了这个问题 Unable to start EmbeddedWebApplicationContext due to missing EmbeddedServletContainerFactory bean. 加入下面这个bean Bean public EmbeddedServletContainerFactory servletContainer() { TomcatEmbedde…

高级算法:动态规划(一)

一、暴力枚举 1、实现代码 def fib(n):f [1,1]for i in range(2,n1):f.append(f[-1]f[-2])print(f)return f(n)fib(5) 2、输出 "C:\Program Files\Python35\python.exe" E:/工作目录/python/test/DP.py [1, 1, 2, 3, 5, 8]Process finished with exit code 1二、动态…

CSS3----渐变

1-从上往下线性渐变: background: -webkit-linear-gradient(red,blue); background: -o-linear-gradient(red,blue); background: -moz-linear-gradient(red,blue); 2-从上往下线性渐变: background: -webkit-linear-gradient(left,red,blue); background: -o-linear-gradient(…

233

转载于:https://www.cnblogs.com/Guess2/p/9727082.html

Paloalto云原生容器安全实践

Prisma Cloud容器安全解决方案 Reference: https://www.bilibili.com/video/BV1Gf4y1k7AA/?spm_id_from333.788.recommend_more_video.2 date: 2021年04月06日 容器没有Kernel,与宿主机共用Kernel. 开源工具的问题:一个安全工具只解决一个安全方面的问…

SPA 遇到 bfcache 所引发的无解闪现

原文地址:monine.github.io/#/article/2… 最近又看 Blog 的装修不顺眼,花了些时间重新装修了一番,布局上没有做啥修改,主要是样式的调整和新增首页。过程中遇到一个难题,而且是无解的难题,如题&#xff0c…