2017-06-13 87 views
4

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

我猜他们作为独立的容器和单独的豆荚的好处是,他们可以然后所有规模单独?

但是,也应该烧瓶和uwsgi甚至在不同的容器? (或者Flask和Gunicorn,因为uwsgi看起来与Gunicorn非常相似)

+1

你的烧瓶app和uwsgi/gunicorn必须放在同一个容器中,nginx放在单独的容器中。 – johnharris85

回答

7

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

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

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

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

建议如下。

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

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

+0

谢谢格雷厄姆的全面回应。我也不想使用nginx,因为它好像Ingress已经可以做负载平衡了。但是我一直只看到Ingress + nginx的教程。我的理解是,这里使用的nginx只是为了正确地提供静态文件,而不是用于其负载平衡功能,因为Ingress已经这样做了吗?退一步 - 我的理解是正确的,nginx是一个web服务器,可以处理多个传入连接并将它们全部导向WSGI(这将成为跨多个python运行的应用服务器?) – gunit

+1

当使用uWSGI时,nginx服务主要目的处理静态文件并从慢速客户端中分离出uWSGI。由于uWSGI通常位于同一主机上,并且使用UNIX套接字传递请求,因此它不会严格执行负载平衡,因为这会落入内核,哪个进程醒来并接受UNIX套接字的下一个请求。由于uWSGI有办法提供静态文件,所以nginx在这种情况下可能毫无意义。 –

相关问题