在 Kubernetes 中,我们还需要多进程/gunicorn 吗?

Posted

技术标签:

【中文标题】在 Kubernetes 中,我们还需要多进程/gunicorn 吗?【英文标题】:In Kubernetes, do we still need multiprocess/gunicorn? 【发布时间】:2019-08-26 17:43:38 【问题描述】:

在面向机器的部署中,通常人们会使用gunicorn 来启动一些工作人员来处理传入的请求。 (是的,worker_class 将进一步定义工作进程内的行为)

在 Kubernetes 集群中部署时,我们还需要gunicorn(或者准确地说,我们还需要多进程部署吗)?

基本上,每个正在运行的容器都是一个进程(在每个 pod 一个容器的配置中)。在服务后面运行的多个 pod 已经相当于 gunicorn 必须提供的功能。也就是说,依赖Kubernetes服务而不是gunicorn

还需要gunicorn吗?

是的,一个 pod 与一个进程并不完全相同(伴随容器的每个 pod 都有一些开销),但除此之外,我们可能会因为没有 gunicorn 而错过任何其他东西?

已编辑

澄清:是的,仍然需要gunicorn 或其他wsgi http 服务器来运行python 应用程序。我的问题实际上是关于 multiprocess 方面(如标题中的 multiprocess/gunicor)。

【问题讨论】:

我认为目前还没有最佳实践(而且很多人所说的都是由旧习惯引起的)。有趣的是,将 gunicorn 部署到 Kubernetes 使得很难发现内存问题。 OOM 杀手,杀死 pod 中的 gunicorn 子进程,这意味着如果 pod 内存不足,它永远不会真正死亡。主进程只是重新启动子进程。这是一个问题,因为没有任何记录。此外,gunicorn 的进程管理与拥有自己的健康检查的 Kubernetes 不一致。 我来到这里想知道 uvicorn 在 kubernetes 设置中是否足够,不需要uvicorn.org/deployment/#using-a-process-manager 中描述的进程管理器。 @Risadinha 这正是我的 OP 的目的。所以所有的放大/缩小、重启、就绪/活跃度探测、ssl 都已经被 k8s 处理了。目前我们正在与 1 名 uvicorn 工人一起运行 gunicorn。以后可能会完全掉落独角兽 【参考方案1】:

gunicorn 还需要吗?

真的不需要。 Kubernetes 可以像 gunicorn 一样使用 HPA 或 VPA 处理向上和向下扩展(pod/容器),并结合 cluster autoscaler 等其他东西。

事实上你不需要它,它不需要你不能使用 gunicorn。您可以在由resource limits 控制的 pod/容器中完美地拥有多个进程。请记住,Kubernetes 资源管理器最终将决定您的容器(在 pod 中运行)所请求的资源和资源上限。

【讨论】:

我不明白,我以为你需要 gunicorn 来为应用程序提供服务,没有它,flask 应用程序如何工作?烧瓶应用程序是什么样的?它看起来像我们在网上看到的基本开发应用程序(hello world)吗?此外,如果我们确实包含 gunicorn,我们是否只需将工作进程设置为 1? 您可以选择在没有 gunicorn 或 gunicorn 的情况下使用 hello world 之类的方法 1 进程,两者都有效。我只是看不到 gunicorn 的好处,除非单个进程比 hello world 方法更快 请勿在生产环境中使用 RUNSERVER。它没有经过安全审计或性能测试。 (这就是它会一直存在的方式。我们的业务是制作 Web 框架,而不是 Web 服务器,因此改进此服务器以使其能够处理生产环境超出了 Django 的范围。)请参阅:forum.djangoproject.com/t/which-http-server-for-k8s-gunicorn/…跨度> 【参考方案2】:

Gunicorn 用于服务于 WSGI(Web 服务器网关接口)应用程序,因此它是一个服务器,而不仅仅是多进程编排工具。手头上的 Kubernetes 是一个有助于管理基础设施的编排工具。它不会说 HTTP,也不了解 WSGI 规范。 换句话说,您不能在裸 Kubernetes pod 上运行 WSGI 应用程序,您仍然需要像 Gunicorn、uWSGI 等这样的 WSGI 服务器来为应用程序提供服务。

【讨论】:

嘿@Ken4scholars,感谢您的评论。我编辑了我的问题以澄清问题。 @MartinNowosad python manage.py runserver 午餐嵌入了 WSGI 服务器的 Django 开发服务器。所以你仍然有一个 WSGI 服务器。在生产中,不使用此服务器,因为它还没有为生产做好准备,并且缺少生产环境中所需的许多功能。这就是为什么在生产中使用 Gunicorn/uWSGI 或其他生产就绪的 WSGI 服务器。你不能只是启动一个 k8s pod,因为它不能与你的 Django 应用程序对话或说 HTTP。当然,您可以在开发服务器上运行 k8s,但由于上述原因,强烈不建议这样做。 @MartinNowosad 再次阅读了我的帖子和我的 cmets - 如果没有 WSGI 服务器,您无法用 k8s 替换 gunicorn。您经常提到的开发服务器也是 WSGI 服务器。我特别提到了 Gunicorn,因为它在帖子中,但我也说过没有 WSGI 服务器。也许尝试再次阅读该帖子。我认为推进这次谈话没有任何意义,所以这是我的最后评论。祝你有美好的一天【参考方案3】:

这真的取决于您的用例。如果一种解决方案比另一种更适合您,这里没有对错之分。

我们有一个类似的用例。 我们正在运行大约 30 个相同服务的副本。每个 pod 运行 1 个容器,该容器又运行 50 个重复服务。

我们本可以让 1500 个 Pod 运行一项服务,但我们测试了仅运行 30 个副本(每个副本运行 50 个服务)时,性能与所需资源相比要好得多。

我们唯一需要做的就是监控每个 pod 的 50 个服务,因此如果其中一个服务停止,它就会重新启动。如果它们都出现错误,我们会在 Pod 上运行健康检查,然后重新创建 Pod。

【讨论】:

【参考方案4】:

您可能需要考虑使用 tensorflow 模型服务器(请参阅 https://www.tensorflow.org/tfx/tutorials/serving/rest_simple)。

实际上,在执行模型预测时,我发现如果尝试并行运行多个预测(即多进程),则在相同 CPU/GPU 资源的情况下性能会更差。矩阵计算倾向于通过库使用低级并行性,并且尝试使用多个进程确实会导致我的经验变慢。正如其他人所评论的那样,为您的用例进行自己的性能测试始终是最好的方法。

【讨论】:

以上是关于在 Kubernetes 中,我们还需要多进程/gunicorn 吗?的主要内容,如果未能解决你的问题,请参考以下文章

Java多线程

如何落地TensorFlow on Kubernetes

如何落地TensorFlow on Kubernetes

Kubernetes 多节点上的 Kafka

node怎样模拟多进程?

多线程《三》join方法