Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Kubernetes上支持生产的Python应用程序_Python_Django_Flask_Kubernetes_Uwsgi - Fatal编程技术网

Kubernetes上支持生产的Python应用程序

Kubernetes上支持生产的Python应用程序,python,django,flask,kubernetes,uwsgi,Python,Django,Flask,Kubernetes,Uwsgi,在过去的两年里,我一直在向Kubernetes部署应用程序。在我的组织中,我们所有的应用程序(尤其是无状态的)都在Kubernetes中运行。我仍然有一个基本的问题,只是因为最近我们发现了一些与我们的少数python应用程序有关的问题 最初部署python应用程序(用Flask和Django编写)时,我们使用python app.py运行它。众所周知,由于GIL,python实际上不支持系统线程,一次只能处理一个请求,但如果一个请求占用大量CPU,它将无法处理更多的请求。这有时会导致health

在过去的两年里,我一直在向Kubernetes部署应用程序。在我的组织中,我们所有的应用程序(尤其是无状态的)都在Kubernetes中运行。我仍然有一个基本的问题,只是因为最近我们发现了一些与我们的少数python应用程序有关的问题

最初部署python应用程序(用Flask和Django编写)时,我们使用
python app.py
运行它。众所周知,由于GIL,python实际上不支持系统线程,一次只能处理一个请求,但如果一个请求占用大量CPU,它将无法处理更多的请求。这有时会导致health API不起作用。我们已经观察到,在这一时刻,如果有一个不是IO的单一请求并执行一些操作,我们将占用CPU,无法并行处理另一个请求。由于它只执行较少的操作,我们观察到CPU利用率也没有增加。这会影响HorizontalPodAutoscaler的工作方式,因为它无法缩放Pod

因此,我们开始在播客中使用
uWSGI
。因此,基本上
uWSGI
可以在引擎盖下运行多个pod,并行处理多个请求,并根据需要自动启动新流程。但是我们已经看到另一个问题,
uwsgi
在自动扩展过程以纠正服务请求方面缺乏速度,并导致
http503
错误,因此我们无法以100%的可用性为少数api提供服务

同时,我们的所有其他应用程序,以
nodejs
java
golang
编写,提供100%的可用性

我正在研究在Kubernetes中以100%(99.99)的可用性运行python应用程序的最佳方法,如下所示

  • 应用程序提供健康API和活力API
  • 在Kubernetes中运行的应用程序
  • 如果可能,无uwsgi(每个pod的单进程是docker的基本概念)
  • 如果使用uwsgi,我们是否可以为k8s环境应用任何特定配置

  • 我们使用Twisted的WSGI服务器,它有30个线程,对于我们的Django应用程序来说是可靠的。正如您所提到的,每个pod模型保持一个进程,这与Kubernetes的期望更为接近。是的,GIL意味着这30个线程中只有一个可以同时运行Python代码,但与大多数webapps一样,这些线程中的大多数在绝大多数时间都被I/O阻塞(通常等待数据库的响应)。然后在其上运行多个副本,以实现冗余,并在您需要的任何级别上为您提供真正的并发性(根据站点流量,我们通常使用4-8个副本,一些大型副本最多16个)。

    运行Flask应用程序的python部署也存在同样的问题。大多数api调用在几秒钟内处理完毕,但也有一些cpu密集型请求需要2分钟才能获取GIL。。。。pod继续接受请求,忽略配置的超时,忽略用户关闭的连接;然后,在1分钟的活性探测失败后,kubelet重新启动pod

    因此,一个fat请求可能会显著降低可用性

    我看到两种不同的解决方案: 1) 有一个单独的部署,只承载长时间运行的api调用;配置入口以在这两个部署之间路由请求; 2) 在主进程中使用多处理句柄活动性/就绪性探测,每个其他请求都必须在子进程中处理

    每个解决方案都有优点和缺点,也许我需要两者的结合。此外,如果我需要一个稳定的普罗米修斯度量流,我可能需要在应用层上创建一个代理服务器(同一个pod上还有一个容器)。还需要将入口配置为具有到python pod的单个上游连接,以便长时间运行的请求将排队,而短时间运行的请求将被并发处理(是的,python,并发,好笑话)。不确定它是否能与HPA很好地匹配

    所以,在kubernetes上运行生产就绪的python rest api服务器不是一件容易的事。Go和java为微服务应用程序提供了更好的生态系统

    PS 这是一篇很好的文章,它表明不需要在kubernetes中使用WSGI运行应用程序

    PPS 我正在考虑用普罗米修斯出口商做烧瓶。看起来比在单独的线程中运行python客户端要好;

    这是否意味着python不适合在kubernetes中运行。特别是对于医管局的微服务,不是吗?Ruby和JavaScript具有相同的并发限制,您只需要了解您的并发性和网络:)是的..同意,我不知道Ruby如何运行,但至少在JavaScript中,事件循环和内部线程池管理得相当好。在python中,没有线程,uwsgi或其他类型的进程管理器都是使用进程创建的,而不是线程。python中也有很多线程选项,同样,您只需知道自己想要什么并执行即可。