云原生时代 Overlay 网络的应用

Posted 矢量SRE

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了云原生时代 Overlay 网络的应用相关的知识,希望对你有一定的参考价值。

在当下的技术圈,对 Kubernetes 网络模式稍有了解的朋友都应该听说过 Overylay网络,Overlay 网络其实并不是一门新技术,Overlay 网络其实是将已有的物理网络(Underlay网络)作为基础,在其上建立叠加的虚拟网络,实现网络资源的虚拟化。

近年来云计算,虚拟化,容器化技术的演进促进了网络虚拟化技术的应用。由于Overlay网络是建立在已有物理网络上的虚拟网络,具有独立的控制和转发平面,所以我们介绍 Overlay 网络的同时也一并说一哈 Underlay 网络。

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

云原生时代 Overlay 网络的应用


常见应用场景

虽然 Kubernetes 目前已经是容器编排领域的事实标准了,但是依然有很多传统行业仍然在使用物理机,虚拟机部署服务。而日常的更新维护中,集群中的大规模虚拟机迁移是比较常见的事情。比如我 2014 年为之前的公司建立的一个基于OpenStack的虚拟化平台,我们一般会利用虚拟机的迁移,来提高资源的利用率。

而 Overylay 在 Kubernetes 中容器跨主机网络通信中一样扮演者很重要的作用,其中比较主流的方案是基于 Flannel 的 VXLAN 后端实现,而 VXLAN 是 Overylay 网络的一种技术实现,那么下面我们一起来看一下他的具体实现。

Kubernetes中的Overlay实现

首先我们来简单了解一下 VXLAN(Virtual eXtensible LAN)技术的原理,由于VXLAN 可以完全在内核态实现封装和解封装数据包的工作,他是在现有的三层网络之上,覆盖一层虚拟的、由内核 VXLAN 模块负责维护的二层网络,使得连接在这个 VXLAN 二层网络上的虚拟机或者容器都可以像在同一个局域网(LAN)里那样自由通信。

当然现实情况是,可能虚拟机或者容器可能分布在不同机器上,或者不同区域的物理机房里。而为了打通两边的二层网络, VXLAN 会在宿主机上设置一个特殊的网络设备作为「隧道」的两端。这个设备就叫 VTEP。

而 VTEP 设备的作用就是进行封装和解封装二层数据帧(Ethernet frame);而且这个工作的执行流程,全部是在内核里完成的(因为 VXLAN 本身就是 Linux 内核中的一个模块)。

我们来看一下这幅图,它可以清晰表达出在 Kubernetes 中基于 Flannel 的 VXLAN 网络主机容器通信的过程:

上图中,Node1 的容器 1 访问 Node2 的容器 2 整个过程可以简单描述为以下几个步骤:

  • Node1 上的容器 1 从其 eth0 网卡将 IP 数据包通过 cni0,被路由到 flannel0。(其实就是 VETP )
  • 而 flannel0 从收到的数据包中获取目的 MAC 地址;
  • 然后在本地的转发表中查找该 MAC 地址所在服务器的 IP 地址;
  • 然后将虚拟网络标识符(VxLAN Network Identifier 即 VNI)以及原始的 IP 数据包作为 Payload ,构建新的 UDP 数据包;
  • 将新的 UDP 数据包通过 Node1 的 eth0 网卡发送到 Node2;
  • Node2 的 eth0 网卡将数据包发送给 Node2 的 flannel0;
  • flannel0 收到数据包后,去掉 UDP 数据包中的协议头;
  • 查看数据包中 VNI;
  • 将 IP 数据包转发给 Node2 上的容器2;

以上就是 Overlay 在Kubernetes 中的实现和工作原理了。


Overlay解决了哪些问题?

首先解决了网络规模的限制

其次解决了网络架构的限制

Overlay 把二层报文封装在 IP 报文之上,因此,只要网络支持 IP 路由可达就可以部署 Overlay 网络,而 IP 路由网络本身已经非常成熟,且在网络结构上没有特殊要求。而且路由网络本身具备良好的扩展能力,很强的故障自愈能力和负载均衡能力。采用 Overlay 技术后,我们在不用改变现有 Underlay 网络架构即可轻松支撑新型网络架构的部署,比如 Kubernetes 中 Flannel 的 VXLAN 的网络架构。

最后解决了网络隔离的限制

公有云服务商一定会面临这样一个问题:一个物理集群可能会被拆分成多个小块分配给不同的租户(Tenant),因为二层网络的数据帧可能会进行广播,所以出于安全的考虑这些不同的租户之间需要进行网络隔离,避免租户之间的流量互相影响甚至恶意攻击。比如之前阿里云在使用的--经典网络,就是二层网络,并未进行网络隔离,而是通过其他手段隔离,导致用户质疑其并未彻底有效的做隔离。


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


总结

以上内容便是 Overlay 网络的基本介绍以及 Overylay 网络的具体实现之一 VXLAN在 Kubernetes 中的工作原理解读。

需要注意的是,Overlay 网络只是一种在物理网络上的虚拟网络,使用该技术并不能直接解决集群中的规模性等问题,而 VXLAN 也不是组建 Overlay 网络的唯一技术实现,在不同场景中我们可以考虑使用不同的技术,例如:NVGRE、GRE 等。