Node.js 在 Kubernetes 上横向扩展

Node.js scaling out on Kubernetes

我使用 Docker 在 node.js 上构建了一个应用程序,但我不确定如何在 Kubernetes 集群上扩展它,以便充分利用我的集群硬件。

从性能的角度来看,以下哪个更好:

将我的节点应用程序集群化,运行 根据需要添加尽可能多的容器

只需要 运行 个容器,无需集群?

当我说聚类时,我的意思是 https://nodejs.org/api/cluster.html

我的应用程序是一个简单的 CRUD Api,由 mongoDB 支持。我们估计它将有 1000 个并发用户。我们的集群有 3 个节点。

NodeJS cluster 机制有助于让 NodeJS 更有效地使用大于单个内核,因此根据您的代码,它可能对您有益,但它高度依赖于您的代码和各种依赖项以及如何好吧,他们可以(或不能)使用集群。

作为一般做法,如果您可以将容器分解为可以在 kubernetes 中 运行 作为 pods 的很好的并行工作,那么我建议将以下过程作为一个过程来查看什么对你有用:

  1. 设置一个包含您的代码的 pod,然后 运行 对其进行负载测试。使用 Kubernetes 从 cAdvisor 获得的数据来描述您的 pod 喜欢拥有多少资源(cpu 和内存)。
  2. 根据您在上面看到的设置 cpu 和内存的资源限制。
  3. 运行 负载测试以验证您的单个 pod 在规模方面的处理能力

从那里,您有一个基线,您可以在其中使用 Kubernetes 横向扩展它,以验证您想要实现的 1000 个用户并发基线。 在 2017 年的 Kubecon 上有一个很好的关于这个过程的演讲,叫做 Load Testing Kubernetes: How to optimize your cluster resource allocation in production

一旦有了基线,就可以 运行 利用代码中的集群创建原型,然后与非集群版本进行比较。如果你这样做,我会仔细检查你为 CPU 设置的任何限制是否大于 1 个核心,否则你将在 NodeJS 运行 时间之外自我限制以访问多个核心,这将破坏使用集群的目的。

根据您在代码中所做的事情,启用集群可能需要大量的重新工作,因为它想利用自己的工作者概念,并且不清楚您使用的是什么框架以及是否他们将合理地融入该结构。