我正在为一家初创公司建立基础设施,该基础设施几乎不会有太多流量,但在需要时应该能够扩展。
我们倾向于使用 LB 进行设置,将流量分发到专用私有子网(超过 3 个可用区域)中的前端节点,这些节点又向其自己的专用私有子网上的后端节点发出请求,后端节点又向通过 atlas 和 vpc 对等管理的 mongodb 发出请求。
每个节点都需要互联网接入才能进行配置。后端节点还会向第三方服务发出请求,因此运行时也需要互联网接入。
我看到三种选择:
为每个可用区域中的每个私有子网设置一个 nat 网关。根据位置,每个可用区域每个子网的费用约为 30 美元。如果有 3 个可用区域和 2 个子网,则每月总计约为 180 美元,这实际上超过了我们计划在系统流量和负载不大的情况下用于 ec2 实例的费用。我们可能可以将其减少到每个可用区域中的所有私有子网仅使用 1 个 nat 网关,但这仍然约为 90 美元。
将 ec2 实例设置为 nat 网关,这可能会便宜一些,但需要维护和设置。
只需使用一个私有子网,为每个节点分配公共 IP,并通过路由表条目使用互联网网关。我认为使用专用私有子网没有多大意义,因为节点无论如何都应该能够通过网关相互连接。
最后一个选项很可能是最便宜的选项,因为一个弹性 IP 已经包含在 ec2 实例中,并且不需要专用网关。但是我想知道这样做是否有重大的缺点或风险?我们计划在有需要时(例如有大量流量)使用专用子网,但我们真的希望一开始就尽可能降低成本。
答案1
您似乎对 VPC 中的网络基础知识存在一些误解。
为每个可用区域中的每个私有子网设置一个 nat 网关。
从实际目的来看,这绝不是你真正需要做的事情。
单个 VPC 中所需的 NAT 网关的最大数量是每个 AZ 1 个。
NAT 网关是绝不放置在它们所服务的(任何)子网上。NAT 网关放置在公共子网上,该子网上有一个指向 Internet 网关的默认路由。然后,它们向其他子网,其中 NAT 网关被指定为这些子网的默认网关。
因此,AZ 中的私有子网数量与 NAT 网关数量无关。除非您需要每个 AZ 超过 45 Gbit/s 的互联网带宽,否则您不需要多个 NAT 网关。
接下来,从技术上讲,您只需要每个 VPC 一个 NAT 网关。NAT 网关是逻辑实体,而不是物理实体,因此没有已知的机制会导致“失败”(除了在初始创建时,当有可能定义失败时)。建议不要跨区域共享 NAT 网关的原因如下:
- 您需要为使用网关的跨区域流量付费。只要这笔费用低于网关的成本,这仍然是合理的。
- 对于使用 NAT 网关访问互联网的跨区域流量,您会看到延迟略有增加,通常为几毫秒。这是一种权衡,但可能微不足道。
- 托管网关的可用区的全面中断、故障、丢失或毁坏将导致所有可用区都无法使用该网关,但这种情况迄今为止显然从未发生过。
接下来,使用 EC2 实例作为 NAT 设备几乎不需要任何设置。NAT 实例的常规 AMI 在实例级别是零配置的。您也可以构建自己的 AMI。 EC2 实例恢复当底层硬件实际出现故障或虚拟机管理程序无响应(罕见但可能)时可以修复 NAT 实例。
我认为使用专用私有子网没有多大意义,因为节点无论如何都应该能够通过网关相互连接。
无论如何,这其实并不重要。专用子网或缺少子网对实例之间的通信方式没有实际影响——只会影响它们之间的通信方式相信它们正在通信。VPC 中每个子网上的“默认路由器”是一个虚构的设备,其存在是为了与 IP over Ethernet 的工作方式兼容。当安全组和网络 ACL 允许 VPC 中的两个实例进行通信时,它们的实际流量从一个实例传输到另一个实例的方式是相同的,无论这两个实例是否位于同一子网上。
跨子网时,实例会执行 ARP 操作以对默认网关发送流量,同时虚拟机管理程序会配合执行,但实际上会忽略所有这些操作,并将流量直接发送到另一个实例的虚拟机管理程序。在子网内,实例会为其对等体执行 ARP 操作,虚拟机管理程序会伪造该响应(ARP“who has”从未出现在目标实例上,但源实例会看到目标从未生成的响应),节点到节点的流量遵循与以前完全相同的路径。
多年来,我们都使用 EC2 实例作为 NAT 实例,因为那是唯一的选择——NAT 网关是一项相对较新的服务。如果您想节省成本,那就选择它。或者在除一个 AZ 之外的所有 AZ 中都使用它,并在该 AZ 中使用一个 NAT 网关。
为支持它们的服务(如 S3 和 DynamoDB)添加 VPC 端点,因为这些端点允许您无需 NAT 设备即可访问这些服务。
答案2
您可以将来自多个私有子网的出站流量路由到同一个 natgw 实例。
有时我会创建一个单独的公共“管理”子网,natgw(或类似资源)位于该子网中,并提供所有应该能够根据该 natgw 的路由访问互联网的私有子网。
这种布局更明显地表明该子网用于特殊用途,最终由其他几个独立的子网使用。通常我会为此类子网分配一个很小的 CIDR。