Kubernetes - 在同一个节点上部署多个运行相同应用的Pod

4
我们正在将基础架构迁移到Kubernetes。我正在谈论其中的一个部分,它包含了一个API,比如说针对客户(我们有很多其他资源也是这种情况)。假设我们有十亿个客户,每个客户都有一些数据等等,并且我们决定他们应该有一个专门的API,拥有自己的数据库、服务器、域名等等。
Kubernetes 有节点和 Pod 的概念。所以我们说:“好吧,我们把节点 X 和它所有的资源都专门用于这个特定的 API”。现在问题来了:
为什么要使用多个 Pod,每个 Pod 都包含相同的 nginx + fpm 和代码,并将其限制为部分流量和资源,并添加内部负载均衡、自动扩展等等,而不是只有一个 Pod,利用全部节点资源?
由于每个 Pod 都会增加一些额外的内存消耗,这对我来说似乎是一种浪费。唯一的好处是,如果某些东西出了问题,只有某部分会停止工作(因此在这种情况下可能有2个 Pod 最优?)。
显然,在需要时会扩展节点。
注:我不是在讨论有多个包含不同内容的 Pod 的情况,我在讨论那个特定的情况。
注2:数据库已经放在了它自己的 Pod 外面。
Google 在这个主题上让我失望了。我发现数百篇带有“如何配置”的文章,但是没有一篇涉及到为什么要这样做的。
1个回答

2
为什么我要使用多个包含相同nginx + fpm和代码的Pod,并将其限制在一部分流量和资源上,再添加内部负载平衡、自动扩展等,而不是只有一个Pod,利用所有节点资源呢?
由于每个Pod都会增加一些额外的内存消耗,这对我来说似乎是一种浪费。唯一的好处是如果出现故障,只有一部分会出现问题(因此在这种情况下可能最佳的方案是2个Pod)。
这归结为一个问题,我应该如何扩展我的应用程序:垂直扩展(更大的实例)还是水平扩展(更多实例)。
首先,尽量避免仅使用单个实例,因为如果您升级Node,则可能需要更多的冗余。如果您可以接受有时出现一些停机时间,则单个实例可能是一个不错的选择。

垂直扩展应用程序

通过将实例更改为更大的实例来垂直缩放应用程序,有时是一个可行的选择,特别是当应用程序无法水平扩展时,例如使用领导选举模式的应用程序 - 通常会监听特定事件并做出反应。然而,您可以垂直扩展应用程序的幅度是有限的。

水平扩展应用程序

对于无状态应用程序,通过添加更多实例通常是更容易和更便宜的方式来水平扩展应用程序。通常,您需要超过一个实例,因为您希望容忍节点进行维护时发生故障。这对于大规模应用程序也是可能的,可以扩展到非常多的实例 - 成本呈线性比例增长。但是,并非每个应用程序都可以水平扩展,例如分布式数据库(复制)通常无法良好地水平扩展,除非您分片数据。您甚至可以使用Horizontal Pod Autoscaler根据应用程序的繁忙程度自动调整实例数量。

权衡取舍

如上所述,水平扩展通常更容易且更受欢迎。但是需要权衡 - 当您的流量较低时,您可能不想运行数千个实例 - 实例具有一些资源开销成本,也需要维护。为了保证 可用性,您应该运行至少2个pod,并确保它们不在同一节点上运行。如果您有一个区域性集群,则要确保它们不在同一可用区上运行 - 出于可用性原因。当您的流量较低时,请考虑使用2-3个pod,并使用 水平 Pod 自动缩放器 在需要时自动扩展更多实例。最终,这是一个数字游戏 - 资源需要花费金钱 - 但您也希望为客户提供良好的服务。

+1 为您的努力加分,但并没有真正回答我的问题(或者我没有理解到精髓?)。我们显然希望进行水平扩展,并且有可能进行垂直扩展,但不明白在同一节点(实例)上使用多个 pod 如何有助于实现这一目标。我可以每个节点只有一个 pod,仍然可以通过添加一个新节点(带有一个新的 pod)来进行水平扩展,也可以通过滚动/带有额外的批量部署在新实例类型上进行垂直扩展,该实例类型每个节点也只有一个 pod。请注意:我并未说总共只有 1 个 pod,而是每个节点只有 1 个 pod。所有情况都可以实现零停机时间。 - zozo
但是我不明白在同一节点(实例)上使用多个Pod如何有助于解决这个问题。例如,两个或四个Pod可以处理比单个Pod更多的流量-这是水平扩展。我不建议将它们运行在同一节点上-相反,请确保它们在不同的节点上运行-这将增加您的可用性-如果一个节点崩溃了。 - Jonas
1
好的,我理解可能会有些困惑。我的问题不是为什么我通常需要更多的 pods。我的问题是,如果我计划将该节点专门用于单个任务,为什么应该在同一节点上拥有更多的 pods。在没有其他“生命”的情况下在同一节点上添加更多的 pods,直到节点已满,虽然可以被认为是水平扩展,但似乎并不实用(为什么不让一个 pod 运行所有资源?结果是相同的)。在这种情况下,添加 1 个节点就是水平扩展。此外,我在问题中指定了 nginx + fpm(因此您已经从 fpm 拥有线程和进程控制)。 - zozo
实际上,您已经说过“我不建议在同一节点上运行它们”。我的问题是,是否有用将1个节点扩展到10000个节点(水平扩展),每个节点都有1个pod?与1个节点扩展到10000个节点,每个节点都有10个pod执行相同的操作(也是水平扩展),在nginx + fpm的情况下呢?(由于您可以使用pod来管理各种服务,因此在nodejs环境中拥有更多的pod可能很有用,但这不是重点,这就是为什么我提到了我计划在其中拥有什么)。 - zozo
我已经更新了我的回答,包括权衡考虑。如果我计划将该节点专用于单个任务 - 尽量避免将工作负载固定在特定节点上,至少使用一组节点以确保可用性。如果您的工作负载可以使用任何节点,则更容易管理,并且可以使用节点自动缩放器在有许多Pod时自动添加节点。 - Jonas

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接