从Docker覆盖网络引出大二层网络

学习Docker覆盖网络的时候,自然免不了与数据中心大二层网络技术的关系,然后补了一下相关的知识。

从Docker覆盖网络谈起

对于不同网络中容器的安全、可靠通信问题十分关键。Docker通过覆盖网络技术,创建扁平、安全的二层网络连接不同物理网络的容器,连接到覆盖网络的容器可以直接通信。

如上图所示,两个属于不同物理网络的节点,通过连接到同一个Overlay覆盖网络可以直接完成通信。覆盖网络创建了虚拟二层网络10.0.0.0/24然后为这两个节点分配了IP地址。也就是说,在节点1上ping 10.0.0.4可以通,并且只需要经过1跳。

那么Overlay是怎么实现的。

VXLAN

VLAN

为了隔离二层网络的广播域,又能使网络中用户相互访问,我们使用划分VLAN的方式,构建虚拟局域网。同一个VLAN中的用户可以直接通信,同属于一个广播域。这些VLAN报文通过在MAC帧添加VLAN标记来进行传输。

问题就在于,VLAN支持用户数量太少了。

数据中心需要支持的虚拟机数量远远大于VLAN支持的数量。为了与依赖的网络硬件设备解耦,并支持大规模虚拟机网络管理,一些做虚拟化的IT厂商推出了一些SND技术,VXLAN就是。

VXLAN

VXLAN的实现是在需要接入覆盖网络的主机上,通过虚拟化的交换机、虚拟化的网络适配器来实现在三层网络上虚拟出一个二层网络。

  • 设计目的就在于:允许用户基于已经存在的三层网络创建虚拟的二层网络
  • 使用的主要技术是:基于UDP封装的隧道技术。VXLAN基于三层IP网络创建了隧道。在隧道两端,VXLAN隧道终端VTEP完成封装和解封装。

为了实现在三层网络上虚拟出二层覆盖网络,大致有下面几个步骤。

  1. 在主机上创建一个Sandbox网络命名空间,这相当于在主机上运行了一个独立的网络栈(可以看作以容器方式运行)。
  2. 在Sandbox中创建一个虚拟交换机(虚拟网桥)。
  3. 在主机中创建一个VXLAN隧道终端VTEP,并把它的一端接入到虚拟交换机上,另一端则接入主机的网络栈。接入主机网络栈后,VTEP就从主机所连接的基础网络中获取到主机的IP地址,并以UDP Socket的方式绑定到4789端口。
  4. 这样一来,不同主机上的两个VTEP通过VXLAN隧道连接在了一起,创建了一个覆盖网络。
  5. 经过以上步骤,这个覆盖网络中的主机向下是连通了,那向上怎么去传递数据呢?所以,主机继续创建虚拟以太网适配器(虚拟网卡),并将这个虚拟网卡接入虚拟交换机上,这样从交换机上来的数据帧就可以被转发。

下面来看一个完整的通过覆盖网络的数据传输过程:

  1. node1节点上的容器叫C1,node2的叫C2。
  2. C1去ping 10.0.0.4也就是C2。这个请求的流量,通过连接到虚拟交换机的虚拟网卡发出。但此时虚拟交换机并不知道从哪个接口转发出去。因为虚拟交换机中暂时没有与该IP对应的MAC地址。
  3. 所以虚拟交换机会向所有接口转发。连接到虚拟交换机的VXLAN隧道终端VTEP知道它自己应该接收并转发这个数据帧,所以它会返回自己的MAC地址,并且虚拟交换机中交换表就新增了这一条转发条目,以后发往该IP的数据帧都转发给VTEP。(实际上就是二层网络的ARP协议在主机中使用软件模拟)
  4. 为什么VTEP知道自己应该转发发往C2的10.0.0.4这个IP的数据帧呢?因为Docker启动容器时,会将自己的网络信息通过Gossip协议发送给相同Swarm集群的其他节点。
  5. 虚拟交换机把数据帧转发给VTEP,VTEP继续封装,加入VXLAN Header等信息,这样这条数据帧就可以在真实的基础网络中透明传输了。
  6. VTEP将数据帧放到UDP包中,设置端口4789和C2真实的目的地址,然后交给底层网络。
  7. 这条数据包在基础网络中透明传输,到达node2,把它交给UDP的4789端口处理,由于VTEP绑定了4789端口,所以进一步交给VTEP处理。
  8. VTEP解封装后,向上交给虚拟交换机,再转发到C2对应的虚拟网卡,这样C2就收到了这条数据。

为什么数据中心需要使用大二层网络?

数据中心为用户管理了大量的虚拟机,为了对物理机进行维护、升级,就有了迁移虚拟机的需求。重要的是,对虚拟机的迁移在用户看来应该是透明无感知的。这就要求在迁移的过程中,虚拟机需要正常提供服务,它的网络属性如IP需要保持不变。

如果使用传统的二三层网络结构(如VLAN划分的2层网络),地址数量限制了虚拟机动态迁移只能在一个较小的局部范围中。为了实现大规模、跨地域数据中心的虚拟机动态迁移,就需要构建大二层网络,实现虚拟机的无障碍动态迁移。

二层网络和三层网络对比

来源:

https://nc.haut.edu.cn/info/1034/4213.htm

https://zhuanlan.zhihu.com/p/108713008

在网络结构中,有二层网络和三层网络两种选择。在这里的二层、三层是按照逻辑拓扑结构进行的分类,并不是说ISO七层模型中的数据链路层和网络层,而是指核心层,汇聚层和接入层,这三层都部署的就是三层网络结构,二层网络结构没有汇聚层

只有核心层和接入层的二层网络结构模式运行简便,交换机根据MAC地址表进行数据包的转发,有则转发,无则泛洪,即将数据包广播发送到所有端口,如果目的终端收到给出回应,那么交换机就可以将该MAC地址添加到地址表中,这是交换机对MAC地址进行建立的过程。

但这样频繁的对未知的MAC目标的数据包进行广播,在大规模的网络架构中形成的网络风暴是非常庞大的,这也很大程度上限制了二层网络规模的扩大,因此二层网络的组网能力非常有限,所以一般只是用来搭建小局域网

与二层网络结构不同的是,三层网络结构可以组建大型的网络

核心层是整个网络的支撑脊梁和数据传输通道,重要性不言而喻,因此在整个三层网络结构中,核心层的设备要求是最高的,必须配备高性能的数据冗余转接设备和防止负载过剩的均衡负载的设备,以降低各核心层交换机所需承载的数据量。(网络的高速交换主干)

汇聚层是连接网络的核心层和各个接入的应用层,在两层之间承担“媒介传输”的作用。汇聚层应该具备以下功能:实施安全功能(划分 VLAN和配置 ACL)、工作组整体接入功能、虚拟网络过滤功能。因此,汇聚层设备应采用三层交换机。(提供基于策略的连接)

接入层的面向对象主要是终端客户,为终端客户提供接入功能。(将工作站接入网络)

二层网络仅仅通过MAC寻址即可实现通讯,但仅仅是同一个冲突域内;三层网络则需要通过IP路由实现跨网段的通讯,可以跨多个冲突域。

大二层网络

来源:

https://blog.csdn.net/xinjixun3641/article/details/84334384

大二层网络基本上都是针对数据中心场景的,因为它实际上就是为了解决数据中心的服务器虚拟化之后的虚拟机动态迁移这一特定需求而出现的。其实学校网络也是一个相当于数据中心的网络,因为他需要对整个校园提供上网服务,例如WIFI漫游等。

为了实现虚拟机的大范围甚至跨地域的动态迁移,就要求把VM迁移可能涉及的所有服务器都纳入同一个二层网络域,这样才能实现VM的大范围无障碍迁移。这就是大二层网络!

一个真正意义的大二层网络至少要能容纳1万以上的主机,才能叫做大二层网络。

传统的二层网络为啥大不起来?其实说起来也简单,二层网络的核心问题就是环路问题以及由此产生的广播风暴问题

传统的二层技术为啥不能支持大二层?基于VLAN+xSTP技术的二层网络,可能容纳的主机数量通常都不会超过1K

自认为是幻象波普星的来客
Built with Hugo
主题 StackJimmy 设计