虚拟私有云如何托管Yandex.Cloud,以及我们的用户如何帮助我们实现有用的功能

嗨,我叫Kostya Kramlikh,我是Yandex.Cloud中虚拟私有云部门的领先开发人员。我参与了一个虚拟网络,您可能会猜到,在本文中,我将讨论一般的虚拟私有云(VPC)设备,尤其是虚拟网络。您还将了解为什么我们(该服务的开发人员)感谢用户的反馈。但是首先是第一件事。



什么是VPC?


如今,对于服务的部署,存在各种各样的机会。我敢肯定,仍然有人将服务器保留在管理员的桌子下面,尽管我希望这样的故事越来越少。

现在,服务正试图进入公共云,而在这里,他们面临着VPC。VPC是公共云的一部分,它将用户,基础架构,平台和其他功能(无论身在何处,在我们的云中或其他地方)连接在一起。同时,VPC不允许不必要地将这些容量放在Internet上,它们仍保留在您的隔离网络中。

从外部看虚拟网络的外观




通过VPC,我们主要了解覆盖网络和网络服务,例如VPNaaS,NATaas,LBaas等。所有这些工作都在故障安全网络基础结构之上进行,关于此问题,Habré上已有一篇出色的文章

让我们更仔细地看一下虚拟网络及其设备。



考虑两个可访问区域。我们提供了一个虚拟网络-我们称为VPC。实际上,它定义了您的“灰色”地址的唯一性空间。在每个虚拟网络中,您可以完全控制可分配给计算资源的地址空间。

网络是全球性的。同时,它以称为子网的实体的形式投影到每个访问区域上。对于每个子网,您分配一定大小为16或更小的CIDR。每个可用区中可以有多个这样的实体,而它们之间始终存在透明的路由。这意味着同一VPC中的所有资源都可以彼此“通信”,即使它们位于不同的访问区域中也是如此。通过我们的内部渠道进行“通信”而不访问Internet,“认为”它们在同一个专用网络中。

上图显示了一种典型情况:在某个地方相交的两个VPC在地址处。两者都可能属于你。例如,一个用于开发,另一个用于测试。可能只存在不同的用户-在这种情况下,没关系。每个VPC上都卡有一个虚拟机。



使方案复杂化。您可以一次将一个虚拟机插入多个子网。不仅如此,而且在不同的虚拟网络中。



同时,如果您需要将汽车放在互联网上,则可以通过API或UI来完成。为此,您需要将内部地址“灰色”的NAT转换配置为“白色”(公共)。您无法选择“白色”地址;它是从我们的地址池中随机分配的。一旦停止使用外部IP,它将返回到池中。您只需为使用“白色”地址的时间付费。



也可以使用NAT实例使计算机访问Internet。在实例上,您可以通过静态路由表获取流量。我们提供了这样一个案例,因为用户需要它,并且我们对此有所了解。因此,在我们的图像目录中包含一个特殊配置的NAT图像。



但是,即使有现成的NAT映像,配置也可能很复杂。我们意识到,对于某些用户而言,这不是最方便的选择,因此最终,我们可以一键添加所需子网的NAT。此功能仍处于私有预览访问状态,在社区成员的帮助下已启用。

虚拟网络如何由内而外地工作





用户如何与虚拟网络交互?网络通过其API向外看。用户进入API并使用目标状态。通过API,用户可以看到如何安排和配置所有内容,同时可以看到实际状态与所需状态有多少不同的状态。这是用户的图片。里面到底是怎么回事

我们在Yandex数据库中记录所需的状态,然后配置VPC的不同部分。 Yandex.Cloud中的覆盖网络建立在OpenContrail的选定组件的基础上,该组件最近被称为Tungsten Fabric。网络服务在单个CloudGate平台上实施。在CloudGate中,我们还使用了许多开源组件:GoBGP(用于访问控制信息)和VPP(用于实现在数据路径的DPDK之上工作的软件路由器)。

Tungsten Fabric通过GoBGP与CloudGate通信。告诉在覆盖网络上发生了什么。反过来,CloudGate将覆盖网络彼此连接并连接到Internet。



现在,让我们看看虚拟网络如何解决可伸缩性和可用性。考虑一个简单的情况。有一个可用区,并在其中创建了两个VPC。我们部署了一个Tungsten Fabric实例,它吸收了数以万计的网络。网络与CloudGate通信。正如我们所说,CloudGate确保它们彼此之间以及与Internet的连接。



假设添加了第二个可访问区域。它应该完全独立于第一个失败。因此,在第二个访问区域中,我们必须交付一个单独的Tungsten Fabric实例。这将是一个单独的系统,处理叠加层,并且对第一个系统了解甚少。实际上,我们的虚拟网络是全球性的,这创建了我们的VPC API。这是他的任务。

如果访问区域B中有资源粘在VPC1中,则将VPC1投影到访问区域B中。如果访问区域B中没有来自VPC2的资源,我们将不会在该区域中实现VPC2。反过来,由于来自VPC3的资源仅存在于区域B中,因此VPC3不在区域A中。一切都很简单且合乎逻辑。

让我们再深入一点,看看Y.Cloud中如何布置特定主机。我要注意的主要事情是所有主机的排列方式都相同。我们这样做的目的是,只有必要的最低限度的服务才能在硬件上旋转,其余所有工作都在虚拟机上进行。我们基于基础架构服务构建更高级别的服务,并且还使用云解决了一些工程问题,例如,作为持续集成的一部分。



如果查看特定的主机,我们将看到主机操作系统中有三个组件在旋转:
  • 计算是负责在主机上分配计算资源的部分。
  • VRouter是Tungsten Fabric的一部分,该组织组织覆盖层,即,通过底层通过隧道传输数据包。
  • 虚拟磁盘是存储虚拟化的一部分。

此外,还在虚拟机中启动了服务:云基础架构服务,平台服务和客户功能。客户功能和平台服务始终通过VRouter覆盖。

基础结构服务可以插入叠加层,但是基本上它们希望在底层层上工作。它们通过SR-IOV卡在底层中。实际上,我们将卡切成虚拟网卡(虚拟功能),然后将它们推入基础架构虚拟机,以免降低性能。例如,同一CloudGate作为此类基础架构虚拟机之一启动。

既然我们已经描述了虚拟网络的全局任务以及云的基本组件的安排,那么让我们看看虚拟网络的不同部分之间如何精确地相互作用。

我们将系统分为三层:
  • 配置平面-设置系统的目标状态。这是用户通过API配置的内容。
  • 控制平面-提供用户定义的语义,也就是说,它将数据平面的状态带到用户在配置平面中描述的状态。
  • 数据平面-直接处理用户数据包。



就像我在上面说的,这一切都始于用户或内部平台服务使用API​​并描述了特定的目标状态。

此状态将立即记录在Yandex数据库中,通过API返回异步操作的ID,并启动我们的内部机制以返回用户想要的状态。配置任务转到SDN控制器,并告诉Tungsten Fabric在覆盖层中要做什么。例如,它们保留端口,虚拟网络等。



Tungsten Fabric上的配置平面将所需状态发送到控制平面。通过它,Config Plane与主机进行通信,告知在不久的将来它将打开哪些主机。



现在,让我们看看系统在主机上的外观。在虚拟机中,某个特定的网络适配器卡在VRouter中。 VRouter是一个Tungsten Fabric核心模块,用于查看数据包。如果某个程序包已经存在流程,则模块将对其进行处理。如果没有流,则该模块执行所谓的punting,即将数据包发送到用户模式进程。该过程将解析数据包,并对其本身做出响应(例如,响应DHCP和DNS),或者告诉VRouter如何处理它。之后,VRouter可以处理数据包。

此外,同一虚拟网络中虚拟机之间的流量透明地运行,它不会定向到CloudGate。部署了虚拟机的主机之间直接相互通信。他们通过隧道传输流量并将其通过底层转发给对方。



控制平面与另一个路由器一样,在BGP访问区域之间相互通信。它们会告诉将它们放在哪台计算机上,以便一个区域中的虚拟机可以直接与其他虚拟机交互。



此外,Control Plane与CloudGate进行通信。它类似地报告在何处举起虚拟机以及举报哪些虚拟机。这使您可以将外部流量和流量从平衡器定向到它们。

离开VPC的流量在数据路径中流向CloudGate,VPP被我们的插件快速咀嚼。接下来,流量在其他VPC上触发,或者在通过CloudGate的控制平面配置的边缘路由器上向外触发。

近期计划


如果用几句话概括以上所有内容,那么可以说Yandex.Cloud中的VPC解决了两个重要任务:

  • 提供不同客户之间的隔离。
  • 将资源,基础架构,平台服务,其他云和内部部署组合到单个网络中。

为了很好地解决这些问题,您需要提供内部架构级别的可伸缩性和容错能力(VPC可以做到)。

VPC正在逐步获得功能,我们正在意识到新的机遇,我们正在努力改善用户便利性。多亏了我们社区的成员,一些想法得到了表达并被列为优先事项。

现在,我们大致掌握了以下近期计划清单:

  • VPN即服务。
  • Private DNS – DNS-.
  • DNS .
  • .
  • «» IP- .

根据用户的要求,此列表中包括平衡器和为已创建的虚拟机切换IP地址的功能。坦率地说,如果没有明确的反馈,我们将在稍后使用这些功能。因此,我们已经在从事有关地址的任务。

最初,只能在创建计算机时添加“白色” IP地址。如果用户忘记这样做,则必须重新创建虚拟机。同样的事情,并在必要时删除外部IP。不久将有可能在不重新创建机器的情况下打开和关闭公共IP。

随时表达您的想法并支持其他用户的建议您可以帮助我们使云变得更好,并更快地获得重要和有用的功能!

Source: https://habr.com/ru/post/undefined/


All Articles