Jak automatycznie aktualizować listę serwerów nadrzędnych nginx, gdy nazwa hosta aws ec2 zmienia się lub wzrasta?

16

Chcę ustawić automatyczne skalowanie w AWS. Nie chcę używać modułu równoważenia obciążenia elastycznego.

Automatyczne skalowanie w Amazon tworzy instancje EC2 płynnie podczas skoków popytu, aby utrzymać wydajność, i automatycznie zmniejsza się w czasie przerw w popycie, aby zminimalizować koszty.

Ponieważ te instancje EC2 są tworzone automatycznie, ich nazwy hostów są nieznane NGINX.

Wiem i mam już konfigurację wstępną w nginx do 10 instancji EC2.

Chcę, aby móc dodać / update / delete automatycznie nazwy serwerów do moich wystąpień przed nginx konfiguracja, gdy autoskalowanie dodaje / aktualizacje / usuwa EC2.

Luis Lobo Borobia
źródło
1
Musisz usunąć „automatyczne skalowanie” z pytania. Automatyczne skalowanie jest terminem AWS. Myślę, że masz na myśli to, że chcesz automatycznie skalować (poziomo), dodając więcej węzłów nadrzędnych do swojego nginx działającego jako LB, i pytasz, jak automatycznie modyfikować konfigurację nginx, gdy węzły nadrzędne są dodawane / usuwane / modyfikowane. Jeśli tak, proszę odpowiednio zmodyfikować swoje pytanie.
talonx,
cóż, właściwie wiem, co to jest automatyczne skalowanie i mam zamiar to powiedzieć. Chcę połączyć oba. Zaktualizuję pytanie.
Luis Lobo Borobia,
1
Pytanie jest teraz jaśniejsze w swojej intencji. Chciałem zagłosować, aby ponownie otworzyć, ale nie widzę opcji - chyba nie mam jeszcze wystarczającej liczby przedstawicieli.
talonx,
Dziękuję @talonx Mam nadzieję, że inni mogą głosować za odpowiedzią na moją odpowiedź
Luis Lobo Borobia,
1
Myślę, że możesz łączyć powiadomienia skalowania automatycznego AWS (dostarczane za pomocą SNS) - zakładając, że zwraca nazwę hosta nowo utworzonej / zakończonej instancji - i jednego z interfejsów API nginx innej firmy w celu aktualizacji i ponownego załadowania konfiguracji nginx. Przepraszam, że jestem niejasny - nie bardzo znam interfejs API automatycznego skalowania.
talonx,

Odpowiedzi:

7

Można to osiągnąć za pomocą Amazon SDK (już prawie z tym skończyłem, umieściłem go na github), korzystając z usług SNS, EC2 i Autoscaling.

Aby to osiągnąć, wykonałem następujące kroki:

  1. Włącz powiadomienia HTTP i zasubskrybuj mój serwer.
  2. Dodano hak cyklu życia z pulsem 1 minuty (aby odczekać 1 minutę przed zakończeniem) do mojej grupy automatycznego skalowania w celu zakończenia serwera
  3. Utworzono plik indeksu do parsowania wiadomości w celu wykrycia, jaki to rodzaj wiadomości (tj. Uruchom lub Zakończ)
  4. Po wybraniu rodzaju zdarzenia zapytałem EC2, aby uzyskać prywatny adres IP instancji
  5. W przypadku Uruchom poczekaj, aż nagłówek 200 zostanie odebrany, a następnie dodaj ip do konfiguracji nginx i załaduj ponownie
  6. W przypadku Terminate usuń adres IP z konfiguracji i załaduj ponownie nginx

Skrypt można znaleźć tutaj https://github.com/singhupendra/aws-autoscale

Upendra
źródło
Czy jest szansa, że ​​opublikowałeś to na github? Próbuję zrobić to samo i każda pomoc będzie mile widziana.
Aaron,
proszę użyć - github.com/singhupendra/aws-autoscale
Upendra
2

Dziękuję @talonx, przeprowadziłem badania, Amazon Autoscale ma interfejs API do sprawdzania aktualnego statusu grupy automatycznego skalowania i wylicza jej członków. Zwraca identyfikator instancji ( http://docs.aws.amazon.com/AutoScaling/latest/DeveloperGuide/api_requests.html#query-example ), a następnie można użyć narzędzi opisujących, aby uzyskać nazwę serwera ( http: // docs .aws.amazon.com / AWSEC2 / latest / CommandLineReference / ApiReference-cmd-DescribeInstances.html ) i na koniec odtwórz plik dołączany wcześniej. Mogłem wyczuć powiadomienia skalowania automatycznego, aby uruchomić proces, który wykonuje te zadania.

Nadal go nie wdrożyłem, ale jest to dobra droga.

Można także korzystać z Autocaling w SNS http://docs.aws.amazon.com/AutoScaling/latest/DeveloperGuide/ASGettingNotifications.html

Luis Lobo Borobia
źródło
Zasadniczo to zrobiłem. Napisałem skrypt ruby, który działa co N minut. Za pomocą zestawu AWS SDK wysyła zapytania do członków ASG, a za pomocą szablonu ERB generuje nową konfigurację. Jeśli nowa konfiguracja jest inna niż bieżąca, kopiuje ją na swoje miejsce i mówi demonowi (w moim przypadku haproxy), aby przeładował swoją konfigurację. Zauważ, że instancje pozostają w ASG trochę po ich zakończeniu, więc upewnij się, że instance.status ==: działa. Zauważ też, że jeśli minie N minut po uruchomieniu instancji, aby obsłużyć żądania, nie używaj go do momentu, gdy teraz> instance.launch_time + N.
Mark Wagner
Dziękuję @ MarkWagner. Czy jest jakaś możliwość udostępnienia gdzieś tego skryptu? Gist, github? Dzięki!
Luis Lobo Borobia
Czy miałeś jakieś szczęście z tym skryptem? Czy istnieje przykład na github lub gdzie indziej?
Aaron,
Nie, ale teraz nginx-plus (wersja płatna) pozwala na więcej.
Luis Lobo Borobia,
1

I nie wdrożyły jeszcze ten sam, ale szukam w użyciu On-the-fly rekonfiguracji z nginx Plus . Myślę, że albo AMI, albo zarządzanie konfiguracją (Puppet, Salt itp.), Które konfiguruje instancję Auto Scaling Group, może osiągnąć interfejs API rekonfiguracji NGiNX (być może poprzez wewnętrzną nazwę domeny Route53, więc żadne ustalone IP nie należy użyć) i dodać się do klastra nadrzędnego dla zwrotnego serwera proxy. Następnie wbudowana kontrola stanu NGiNX przejmie kontrolę nad [dodaną] instancją i upuści ją na wypadek, gdyby stała się niedostępna. Wydaje się to najczystszym rozwiązaniem i nie ma opóźnienia w dodawaniu instancji i prawie żadnego opóźnienia w jej upuszczeniu, ponieważ NGiNX Plus oferuje poza pasmową kontrolę stanu.

Podejście to pozwala uniknąć konieczności konfigurowania systemu automatycznego wykrywania (Consul, Serf itp.), Który w przypadku mniejszych konfiguracji często wydaje się być dużym obciążeniem zarówno pod względem konfiguracji / administracji, jak i wymaganych instancji EC2. Na przykład konsul wymaga co najmniej trzech instancji, aby był stabilny. Serf może być może uruchamiałby same instancje ASG, ale nadal jest narzut związany z ich utrzymaniem, a jeśli ASG zmniejszy się do jednego lub dwóch instancji, stracisz kworum.

Wreszcie można to połączyć z automatycznym powiadamianiem o zmianach w Grupie automatycznego skalowania, być może na serwerach serwerowych NGiNX, które są wykorzystywane do równoważenia obciążenia. Słuchacz wywołany przez takie powiadomienie (może to być również to, o czym wspomniała Upendra) może następnie natychmiast dodać nową instancję do NGiNX za pośrednictwem interfejsu API modyfikacji w locie. Oprócz kosztów NGiNX Plus, zastanawia nas to, dlaczego ktokolwiek miałby używać Elastic Load Balancer z jego licznymi problemami.

Edycja 07.12.2015: ngx_openresty jest Wyważarka po lua ( patrz wątek GitHub ) oferty A Innym możliwym rozwiązaniem open source gorąco dodawania / usuwania serwerami z Nginx wlotowej grupy. Sam jeszcze z tym nie eksperymentowałem, ale chciałem tutaj wspomnieć o każdym, kto natknie się na ten post.

Ville
źródło