2017-06-13 86 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在這種情況下可能毫無意義。 –

相關問題