2016-11-23 23 views
5

Konfiguruję serwer WWW Flask/uswgi. Nadal zastanawiam się nad mikro-usługową architekturą:Dockerizing nginx and Flask

Czy powinienem umieścić Nginx i Flask z uwsgi w jednym pojemniku, czy też umieścić je w dwóch różnych pojemnikach i połączyć?

Mam zamiar uruchomić te usługi w klastrze Kubernetes.

Dzięki

+0

[to-> wszystko w jednym pojemniku] (https://github.com/tiangolo/uwsgi-nginx-flask-docker) Versus [this -> flask i uwsgi w oddzielnym pojemniku] (http://louistiao.me/posts/re-implementing-the-kubernetes-guestbook-example-with-flask-and-nginx/) – Navid

Odpowiedz

4

Krótka odpowiedź:

chciałbym wdrożyć nginx i uwsgi application/kolby w postaci oddzielnych pojemnikach. Zapewnia to bardziej elastyczną architekturę, która pozwala łączyć więcej kont mikroservices z instancją nginx, ponieważ zwiększają się wymagania dotyczące większej liczby usług.

Objaśnienie:

Z dokowanym zwykle strategią jest podzielona usługę nginx i usługi uwsgi/kolbę w dwóch oddzielnych pojemnikach. Następnie możesz połączyć oba przy użyciu linków. Jest to wspólna filozofia architektury w świecie dokerów.Narzędzia takie jak docker-compose upraszczają zarządzanie wieloma kontenerami i tworzenie połączeń między nimi. Następujący plik konfiguracyjny doker-komponować pokazuje przykład tak:

version: '2' 
services: 

    app: 
    image: flask_app:latest 
    volumes: 
     - /etc/app.cfg:/etc/app.cfg:ro 
    expose: 
     - "8090" 

    http_proxy: 
    image: "nginx:stable" 
    expose: 
     - "80" 
    ports: 
     - "80:8090" 
    volumes: 
     - /etc/app_nginx/conf.d/:/etc/nginx/conf.d/:ro 
    links: 
     - app:app 

Oznacza to, że jeśli chcesz dodać więcej pojemników aplikacji można dołączyć je do tego samego pełnomocnika ngnix łatwo przez ich łączenie. Ponadto, jeśli chcesz uaktualnić jedną część infrastruktury, powiedzmy, uaktualnij nginx lub przestaw z Apache na nginx, budujesz ponownie tylko odpowiedni kontener i pozostawiasz resztę na miejscu.

Jeśli dodałeś obie usługi do pojedynczego kontenera (np. Uruchamiając proces nadzoru z pliku Dockerfile ENTRYPOINT), to umożliwiłoby to łatwiejszą komunikację między procesem nginx i uwsgi przy użyciu pliku skarpet, zamiast przez IP, ale nie sądzę, że to samo w sobie jest wystarczająco mocnym powodem, aby umieścić oba w tym samym pojemniku.

Weź również pod uwagę, czy w końcu skończysz z dwudziestoma mikroserwisami i każda uruchomi każdą własną instancję nginx, co oznacza, że ​​masz teraz dwadzieścia zestawów dzienników nginx (access.log/error.log) do śledzenia w dwudziestu kontenerach.

Jeśli korzystasz z architektury "mikroserwisów", oznacza to, że z czasem będziesz dodawać coraz więcej kontenerów. W takim ekosystemie uruchamianie nginx jako oddzielnego procesu dokowania i łączenie z nim mikroserwisów ułatwia rozwój zgodnie z rosnącymi wymaganiami.

Uwaga na temat wykrywania usług

Jeżeli pojemniki są uruchomione na tym samym komputerze, a następnie połączenie wszystkich pojemników jest łatwe. Jeśli kontenery są uruchomione na wielu hostach, używając roju Kubernetes lub Docker, może się to okazać nieco bardziej skomplikowane, ponieważ Ty (lub struktura klastra) musi być w stanie połączyć swój adres DNS z instancją nginx, a kontenery dokowane muszą być w stanie "znaleźć" siebie nawzajem - to dodaje trochę pojęciowego narzutu. Kubernetes pomaga to osiągnąć, grupując pojemniki w pojemniki, definiując usługi itp.

+0

Być może powinieneś rozważyć użycie sieci zamiast linków teraz. Ale to wciąż jest niesamowite :) Zgadzam się! – user2662833

1

filozofii Döcker jest za pomocą microservices w pojemnikach. Termin "Microservice Architecture" pojawił się w ciągu ostatnich kilku lat, aby opisać szczególny sposób projektowania aplikacji oprogramowania jako pakietów o numerach independently deployable services.

Mówiąc inaczej, możesz wdrożyć uwcgi w oddzielnym pojemniku i skorzystać z microservices architecture.

Niektóre zalety microservices architecture są:

  • Lepsza izolacja wina
  • Eliminuje długoterminowe zobowiązanie do jednego stosu technologicznego
  • ułatwia nowym deweloperem zrozumieć funkcjonalność serwisu
  • Łatwiejsze zarządzanie aktualizacjami
1

Jeśli używasz Ngi nx przed serwerem Flask/uwsgi, używasz Nginx jako serwera proxy: zajmuje się przekazywaniem ruchu do serwera, ostatecznie zajmując się szyfrowaniem TLS, może uwierzytelnieniem itp.

Punkt użycia proxy takie jak Nginx jest w stanie załadować saldo ruchu na serwer (y): serwer proxy Nginx odbiera żądania i rozdziela obciążenie między wiele serwerów.

Oznacza to, że potrzebujesz jednej instancji Nginx i jednej lub wielu instancji serwera Flask/usqgi jako serwerów "upstream".

Aby to osiągnąć, należy użyć oddzielnych pojemników.

Należy pamiętać, że jeśli korzystasz z dostawcy usług w chmurze, takiego jak AWS lub GKE, który zapewnia moduł równoważenia obciążenia, który przenosi ruch zewnętrzny do klastra Kubernetes, i jeśli używasz tylko Nginx do przekazywania ruchu (tj. dla TLS lub auth) prawdopodobnie nie potrzebujesz nawet proxy Nginx, ale możesz korzystać z usługi, która obsługuje serwer proxy. Dodanie Nginx daje ci większą kontrolę.