我应该为Flask,uWSGI和nginx分开容器吗?

我打算使用Kubernetes和Ingress进行负载平衡。 我正在尝试学习如何设置Flask,uWSGI和Nginx。 我看到这个教程,所有三个安装在同一个容器,我想知道我是否应该使用它。 https://ianlondon.github.io/blog/deploy-flask-dockernginx/

我猜测把它们作为单独的容器和单独的豆荚的好处在于,它们可以单独进行缩放。

而且,如果Flask和uwsgi甚至在不同的容器中? (或烧瓶和Gunicorn,因为uwsgi似乎非常相似Gunicorn)

Flask是一个Web框架,用它编写的任何应用程序都需要一个WSGI服务器来承载它。 虽然你可以使用Flask内置的开发者服务器,但是你不应该这样做,因为这不适合于生产系统。 因此,您需要使用WSGI服务器,如uWSGI,gunicorn或mod_wsgi(mod_wsgi-express)。 由于Web应用程序由WSGI服务器托管,因此它只能位于同一个容器中,但是对于Flask没有单独的进程,它在Web服务器进程中运行。

无论你需要一个单独的Web服务器,如Nginx,然后取决于。 在mod_wsgi的情况下,你不使用Apache Web服务器,因此直接受益。 当使用mod_wsgi-express时,它也已经被设置为以最佳的基本配置运行,并且它如何避免需要像使用uWSGI或者gunicorn时经常用nginx做的那样的单独的面向前端的web服务器。

对于集装箱化的系统,如果平台已经提供了一个用于负载均衡的路由层,就像Kubernetes中的入口一样,在混合中使用nginx可能会增加额外的复杂性,而这些复杂性是您不需要的,并且会降低性能。 这是因为您必须在同一个容器中运行nginx,或者在同一个容器中创建单独的容器,并使用共享的emptyDir卷类型来允许它们仍然通过UNIX套接字进行通信。 如果你不使用UNIX套接字,使用INET套接字,或者在一个完全不同的pod中运行nginx,那么当你为流量引入一个额外的跳跃时,这将是没有意义的,绑定使用UNIX套接字。 uWSGI服务器在与nginx结合使用时接受INET上的请求时表现不佳,而将nginx放在单独的pod中,可能位于不同的主机上,可能会使情况变得更糟。

在前面使用nginx的部分原因是,它可以保护你免受缓慢的客户端由于请求缓冲,以及其他潜在的问题。 当使用入口时,你已经有一个haproxy或nginx前端负载均衡器,可以在一定程度上保护你。 所以这真的要取决于你在做什么,是否有一点在混合引入额外的nginx代理。 将gunicorn或uWSGI直接放在负载平衡器后面可能会更简单。

建议如下。

  • 也看看mod_wsgi-express。 它是专门为集成化系统开发的,可以使它更容易,而且可以是比uWSGI和gunicorn更好的选择。

  • 使用真实世界的流量配置文件测试不同的WSGI服务器和配置,而不是真正的应用程序,而不是超出它的基准测试。 这是非常重要的,因为基于Kubernetes的系统的动态性,以及如何实现路由,意味着它可能会有更多的行为与更传统的系统可能会有很大的不同。