首页 > 解决方案 > Kubernetes 和 Gunicorn 上的 Flask 应用程序扩展

问题描述

我们有一个通过 gunicorn 服务的 Flask 应用程序,使用 eventlet worker。我们将应用程序部署在 kubernetes pod 中,其想法是根据工作负载扩展 pod 的数量。

gunicorn 中工人数量的推荐设置是2 - 4 x $NUM_CPUS. 请参阅文档。我之前在专用物理硬件上部署了服务,这样的计算是有意义的。在 4 核机器上,有 16 名工人听起来不错,我们最终将其增加到 32 名工人。

这个计算是否仍然适用于使用异步工作者的 kubernetes pod,特别是:

  1. 单个节点上可能有多个 pod。
  2. 相同的服务将在多个 pod 中运行。

我应该如何设置 gunicorn 工人的数量?

  1. 将其设置为-w 1并让 kubernetes 通过 pod 处理扩展?
  2. 将其设置2-4 x $NUM_CPU为 Kubernetes 节点上。在一个吊舱或多个吊舱上?
  3. 完全不同的东西?

更新

我们决定采用第一个选项,这是我们目前的方法。将 gunicorn 作品的数量设置为 1,并通过增加 pod 的数量进行水平缩放。否则将会有太多的移动部件,而且我们不会充分利用 Kubernetes 的潜力。

标签: flaskkubernetesgunicornscalingeventlet

解决方案


为了更好地了解该问题的原始作者在 2019 年选择的最终解决方案

将 gunicorn 工作的数量设置为 1 (-w 1),并通过增加 pod 的数量来水平扩展(使用 Kubernetes HPA)。

考虑到 Kubernetes 平台中工作负载相关功能的快速增长,它可能在不久的将来不适用,例如 Kubernetes 的一些发行版除了 HPA、Vertical Pod Autoscaling (VPA) 和 Multidimensional Pod autoscaling (MPA) 还提出,所以我建议以社区 wiki 帖子的形式继续这个话题。


推荐阅读