在Kubernetes和Gunicorn上扩展Flask应用程序

17
我们有一个使用事件驱动工作者(eventlet worker)通过gunicorn提供服务的Flask应用程序。我们将该应用程序部署在Kubernetes pod中,以根据工作负载自动扩缩容pod的数量。
在gunicorn中,推荐的工作者(worker)数量设置为2-4 x $NUM_CPUS。参见文档。过去我曾在专用的物理硬件上部署过此类服务,这种计算方式是合理的。在一台4核机器上,拥有16个工作者(worker)听起来还不错,我们最终将其增加到了32个工作者(worker)。
在Kubernetes pod中使用异步工作者(async worker),是否仍适用这种计算方式呢?特别是因为:
  1. 单个节点(node)上可能会有多个pod。
  2. 相同的服务将在多个pod中运行。
如何设置gunicorn工作者(worker)的数量?
  1. 将其设置为-w 1,并让Kubernetes通过pod进行水平扩展/缩放?
  2. 在Kubernetes节点上将其设置为2-4 x $NUM_CPUs。在一个pod上还是多个pod上?
  3. 完全使用其他方法?

更新

我们决定采用第一种方法,即当前的方法。将gunicorn工作者(worker)数量设置为1,并通过增加pod的数量进行水平扩展/缩放。否则,将存在太多的移动部件,我们也无法充分利用Kubernetes的潜力。


您也可以使用调度器拓扑特性来设置每个节点的工作 Pod 数量,以避免资源过度提交:https://kubernetes.io/docs/concepts/workloads/pods/pod-topology-spread-constraints/ - VAS
2个回答

2

为了更好地展示原作者在2019年选择的最终解决方案,

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

但需要注意的是,由于Kubernetes平台中与工作负载相关的功能快速增长,例如一些Kubernetes发行版除了HPA外,还提供了Vertical Pod Autoscaling(VPA)和Multidimensional Pod autoscaling(MPA),因此我建议以社区wiki帖子的形式继续讨论这个问题。


-3

我不是开发人员,这似乎不是一项简单的任务,但请考虑遵循优化Gunicorn配置以获得更好性能的最佳实践

此外,在Kubernetes中有不同的机制来扩展您的部署,例如基于CPU利用率的HPA和(Python如何与Gunicorn和Kubernetes一起扩展?

您还可以使用{{link4:Pod和容器的资源请求和限制}}。

根据{{link5:Gunicorn文档}}

不要根据您预计拥有的客户数量来扩展工作人员的数量。Gunicorn只需要4-12个工作进程即可处理每秒数百或数千个请求。 在处理请求时,Gunicorn依赖操作系统提供所有负载平衡。通常我们建议(2 x $num_cores)+1作为起始工作进程的数量。虽然不是过于科学,但这个公式基于这样一个假设:对于给定的核心,一个工作进程将从套接字读取或写入,而另一个工作进程将处理请求。
#更新: 根据您的方法,您可以选择不同的解决方案(部署、守护进程),通过处理为容器和Pod分配CPU资源,您可以实现上述所有语句中的内容在Kubernetes中。
使用具有资源(限制、请求)的部署可以让您根据硬件限制将应用程序调整大小为单个节点上的多个Pod,但根据您的“应用程序负载”,它可能不足够好的解决方案。
CPU请求和限制与容器相关联,但将Pod视为具有CPU请求和限制是有用的。 Pod的CPU请求是Pod中所有容器的CPU请求之和。同样,Pod的CPU限制是Pod中所有容器的CPU限制之和。
注意:
CPU资源以CPU单位衡量。在Kubernetes中,一个CPU相当于:例如1个GCP Core。
正如帖子中提到的第二种方法(将应用程序扩展到多个节点)也是一个不错的选择。在这种情况下,您可以考虑使用Statefulset或部署,另外在GKE上使用“集群自动缩放器”,当您尝试创建新的无法在集群内运行的Pod时,您可以实现更可扩展的解决方案。在这种情况下,集群自动缩放器会自动添加其他资源。
另一方面,您可以考虑使用不同的其他解决方案,例如Cerebral,它使您有可能创建用户定义的策略,以增加或减少集群内节点池的大小。
GKE 的集群自动缩放器根据您想要运行的工作负载的需求自动调整集群大小。启用自动缩放后,如果您创建了新的 Pod 但没有足够的容量来运行它们,GKE 将自动向您的集群添加一个新节点;相反,如果集群中的某个节点利用率不足且其 Pod 可以在其他节点上运行,则 GKE 可以删除该节点。
请记住,这个问题非常普遍,对于这个主题没有一个好的答案。您应该根据您的要求、负载、活动、容量、成本等考虑所有的优缺点。
希望这可以帮助到您。

1
我熟悉Gunicorn的扩展和Kubernetes的水平自动缩放。问题是当这两种技术相交时会发生什么,这并不是任何文档所涉及到的。 - CadentOrange
答案已根据帖子内部的考虑更新了关于Kubernetes解决方案的内容。请分享您的发现。 - Mark

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