flask - Kubernetes 和 Gunicorn 上的 Flask 应用程序扩展
问题描述
我们有一个通过 gunicorn 服务的 Flask 应用程序,使用 eventlet worker。我们将应用程序部署在 kubernetes pod 中,其想法是根据工作负载扩展 pod 的数量。
gunicorn 中工人数量的推荐设置是2 - 4 x $NUM_CPUS
. 请参阅文档。我之前在专用物理硬件上部署了服务,这样的计算是有意义的。在 4 核机器上,有 16 名工人听起来不错,我们最终将其增加到 32 名工人。
这个计算是否仍然适用于使用异步工作者的 kubernetes pod,特别是:
- 单个节点上可能有多个 pod。
- 相同的服务将在多个 pod 中运行。
我应该如何设置 gunicorn 工人的数量?
- 将其设置为
-w 1
并让 kubernetes 通过 pod 处理扩展? - 将其设置
2-4 x $NUM_CPU
为 Kubernetes 节点上。在一个吊舱或多个吊舱上? - 完全不同的东西?
更新
我们决定采用第一个选项,这是我们目前的方法。将 gunicorn 作品的数量设置为 1,并通过增加 pod 的数量进行水平缩放。否则将会有太多的移动部件,而且我们不会充分利用 Kubernetes 的潜力。
解决方案
为了更好地了解该问题的原始作者在 2019 年选择的最终解决方案
将 gunicorn 工作的数量设置为 1 (-w 1),并通过增加 pod 的数量来水平扩展(使用 Kubernetes HPA)。
考虑到 Kubernetes 平台中工作负载相关功能的快速增长,它可能在不久的将来不适用,例如 Kubernetes 的一些发行版除了 HPA、Vertical Pod Autoscaling (VPA) 和 Multidimensional Pod autoscaling (MPA) 还提出,所以我建议以社区 wiki 帖子的形式继续这个话题。
推荐阅读
- rocket-chip - 默认缓存参数,如何更改,限制等
- python - 使用 click 设计一个 CLI,它支持具有无限参数的多个参数
- firebase - 将图像保存到 Firebase 存储桶没有链接上的身份验证
- fortran - 如何在while循环中更改fortran程序索引变量?
- tensorflow - Keras 在自定义损失函数中使用 class_weights 吗?
- r - 为什么我看到 R 向量类的“整数”而不是“向量”
- python - PyQt5 QfileDialog 专门将文件保存为 python 文件
- android - 我是否能够删除对 SQLite 中文件的引用以解决错误?
- regex - 删除记事本++中前1-3个空格中的数字
- swift - Swift / Xcode:如何为每个月的每一天播放不同的声音?