最近我在研究与Kubernetes相关的内容,这让我对overlay在Kubernetes应用中的知识产生了兴趣。虽然overlay并不是Kubernetes的专有名词,它实际上是一种比较古老的计算机网络技术,被用于构建基于另一个网络之上的计算机网络,也就是一种网络虚拟化技术。近年来,在云计算虚拟化技术中也广泛应用了网络虚拟化技术。
回到overlay网络,它是在另一个计算机网络上构建的虚拟网络,所以它依赖于underlay网络。underlay网络是承载用户IP流量的基础架构层,类似于物理机和虚拟机之间的关系。underlay网络和虚拟机是真实存在的实体,它们是指实际的网络设备和计算设备,而overlay网络和虚拟机是通过软件虚拟化技术创建的。
在构建overlay网络时,我们通常使用虚拟局域网拓展技术(Virtual Extensible LAN,VxLAN)。VxLAN使用虚拟隧道端点设备对服务器发送和接收的数据包进行二次封装和解封。
简单来说,在overlay网络中,通过VxLAN的虚拟隧道端点(VTEP)连接两台服务器,它们可以获得网络中的MAC地址、IP地址等信息。在数据包传输过程中,通信双方不需要知道底层网络是如何转换的,它们只需要知道它们可以通过二层网络相互访问,而实际上数据包经过了三层IP网络的中转。当然,VxLAN只是其中一种实现方式,还有其他类似的实现方式。
通过上面的内容,overlay的优缺点已经很明显了。虽然overlay可以利用底层网络在多个数据中心之间构建二层网络,但它的封包和解包过程会带来额外的开销。那么为什么集群中还需要overlay网络呢?
首先是频繁的虚拟机迁移。随着越来越多的计算任务运行在虚拟机上,虚拟机迁移成为了常见的操作,比如日常的更新维护和大规模虚拟机迁移。迁移可以提高资源利用率。当虚拟机所在的宿主机因维护或其他原因宕机时,当前实例需要迁移到其他宿主机上以保证业务不中断。在这个过程中,我们需要保持IP地址不变。由于overlay是在网络层实现二层网络,多个物理机之间只要网络层可达就可以组成虚拟的局域网。即使虚拟机或容器进行了迁移,它们仍然处于同一个二层网络,因此无需改变IP地址。对于集群内部的主机来说,它们不需要了解或关心底层网络架构,它们只知道不同虚拟机之间可以相互连接。
其次是大规模迁移带来的压力。二层网络的通信依赖于MAC地址。目前Kubernetes官方支持的最大集群规模是5000个节点,假设每个节点只包含一个容器,对内部网络设备来说,这并没有太大的压力。但实际上,5000个节点的集群往往包含数万甚至数十万个容器。当某个封包和解包过程会带来额外的开销。那么为什么集群中还需要使用overlay网络呢?
首先是频繁的虚拟机迁移。随着越来越多的计算任务运行在虚拟机上,虚拟机迁移成为了常见的操作,例如日常的更新维护和大规模虚拟机迁移。迁移可以提高资源利用率。当虚拟机所在的宿主机因维护或其他原因宕机时,当前实例需要迁移到其他宿主机上以保证业务不中断。在这个过程中,我们需要保持IP地址不变。由于overlay是在网络层实现二层网络,多个物理机之间只要网络层可达就可以组成虚拟的局域网。即使虚拟机或容器进行了迁移,它们仍然处于同一个二层网络,因此无需改变IP地址。对于集群内部的主机来说,它们不需要了解或关心底层网络架构,只需要知道不同虚拟机之间可以相互连接。
其次是大规模迁移带来的压力。二层网络的通信依赖于MAC地址。目前Kubernetes官方支持的最大集群规模是5000个节点,假设每个节点只包含一个容器,对内部网络设备来说,这并没有太大的压力。然而,实际上,5000个节点的集群往往包含数万甚至数十万个容器。当某个容器需要与集群中的其他容器通信时,内部网络设备需要维护大量的MAC地址表。这对于网络设备来说是一个挑战,并且可能导致性能下降。使用overlay网络可以解决这个问题,因为在overlay网络中,每个物理机只需要知道与它直接相连的虚拟隧道端点的MAC地址,而不需要了解整个集群的MAC地址。
虽然overlay网络带来了一些开销,但在Kubernetes集群中,它提供了灵活性和可扩展性,特别是对于大规模集群和频繁的虚拟机迁移场景。它隐藏了底层网络的细节,简化了集群管理,并提供了跨节点通信的便利性。在实际应用中,我们需要权衡overlay网络的开销和它带来的好处,选择最适合我们需求的网络方案。