Zaktualizuj kontener Docker bez przestojów

17

Powiedzmy, że mam kontener Docker z serwerem WWW (takim jak Apache 2). Teraz chcę zaktualizować system operacyjny. Ta odpowiedź SF mówi, że najlepszym sposobem jest odbudowanie obrazu podstawowego i mojego obrazu Apache. Ale wdrożenie obrazu oznacza przestój, ponieważ muszę usunąć stary kontener, zanim będę mógł utworzyć nowy, więc jest tylko jeden kontener, który wiąże się z portem 80/443.

Ale jak mogę wdrożyć tę aktualizację przy zerowym przestoju? Czy powinienem używać modułu równoważenia obciążenia i komunikacji między kontenerami? Jak zaktualizować moduł równoważenia obciążenia?

das_j
źródło

Odpowiedzi:

18

Idealny scenariusz docelowy

Tak, należy użyć modułu równoważenia obciążenia i aktualizować jedno wystąpienie na raz. Nie jestem pewien, gdzie pojawia się komunikacja między kontenerami.

Na przykład wyobraź sobie, że masz moduł równoważenia obciążenia, który obsługuje witrynę A. Użytkownicy łączą się z nim tylko jako „A” i znają go tylko jako „A”. Moduł równoważenia obciążenia wie, że istnieją dwa lub więcej backendów (B, C itp.) I to, czy są to maszyny wirtualne, czy kontenery, nie ma znaczenia.

Następnie chcesz zaktualizować backendy, które w tym przypadku są instancjami Apache.

  1. usunąć B z kwalifikujących się backendów dla modułu równoważenia obciążenia, aby nie akceptował już żadnego ruchu.
  2. poczekaj na obsłużenie aktualnie aktywnych żądań i zamknięcie istniejących połączeń.
  3. zaktualizuj kontener lub maszynę wirtualną, która obsługuje B
  4. uruchom ponownie B, poczekaj, aż się załaduje i zacznij działać
  5. przetestuj B, aby upewnić się, że poprawnie obsługuje nowe żądania
  6. dodaj B z powrotem do puli zaplecza modułu równoważenia obciążenia, aby ponownie włączyć ruch

Następnie wykonaj ten sam proces dla C, D itp.

Pamiętaj, że od listopada 2013 r. Istnieje otwarta prośba o uaktualnienia w miejscu kontenerów Docker , ale wydaje się, że nie ma dużego postępu, więc powyższe rozwiązanie jest tym, co powinieneś zrobić w międzyczasie.

Co zrobić w przypadku istniejącej witryny na żywo

Prawdopodobnie pytasz o to, ponieważ już prowadzisz działającą witrynę w tym modelu i chcesz ją uaktualnić bez przestojów. Musimy więc osiągnąć powyższy idealny stan docelowy, ale stopniowo.

Załóżmy, że:

  • masz nazwę DNS wskazującą na swój kontener
  • twój kontener działa na jakimś adresie IP
  • Twoi użytkownicy nie znają adresu IP kontenera i nie jest nigdzie zakodowany

Jeśli te założenia są fałszywe, najpierw należy to naprawić, aby było prawidłowe.

Następnie wykonaj następujące kroki:

  1. Utwórz moduł równoważenia obciążenia w nowym adresie IP i skieruj go na istniejący kontener jako jedyny backend
  2. zmień DNS, aby wskazywał bezpośrednio moduł równoważenia obciążenia zamiast adresu IP kontenera
  3. dodaj identyczny backend Apache z tą samą konfiguracją kontenera VM +
  4. teraz masz moduł równoważenia obciążenia z dwoma backendami B i C, więc postępuj zgodnie ze wskazówkami w sekcji „idealny scenariusz docelowy”, aby aktualizować je pojedynczo

Jak zaktualizować moduł równoważenia obciążenia

Łatwy (hostowany) sposób

Najłatwiejszą opcją jest nie uruchamianie własnego balansera. Na przykład, jeśli używasz platformy chmurowej, która zapewnia równoważenie obciążenia jako usługi, rozważ skorzystanie z niej, a następnie konserwacja i aktualizacja modułu równoważenia obciążenia nie będzie problemem.

Sposób ręczny

Jeśli prowadzisz własny moduł równoważenia obciążenia, pomocne będzie dodanie kolejnej warstwy pośredniej (tj. DNS). Załóżmy, że:

  • że mamy nazwę hosta rozstrzygającą adres IP naszego modułu równoważenia obciążenia A, który chcielibyśmy zaktualizować
  • nasz moduł równoważenia obciążenia ma pulę zaplecza P1, P2 itp.

Postępujemy w następujący sposób:

  • utwórz nowy moduł równoważenia obciążenia B za pomocą nowej wersji oprogramowania
  • dodaj wszystkie instancje puli zaplecza P1, P2 itp. do naszego nowego modułu równoważenia obciążenia B jako zaplecze
  • dodaj adres IP B do rozdzielczości DNS wraz z A.

    • teraz skutecznie wykorzystujemy DNS jako moduł równoważenia obciążenia
    • jeśli wpisy dla A i B są nieważone, to w rzeczywistości wynoszą 50-50
    • obserwuj teraz, jak działa B, czy są jakieś błędy itp.
    • jeśli coś jest nie tak z B, cofnij w następujący sposób:

      1. usuń B z konfiguracji DNS
      2. poczekaj na zniknięcie wpisu B w DNS (tj. poczekaj na wygaśnięcie TTL )
      3. ściszyć B
  • Załóżmy, że wykonałeś test „wypalenia” dla B i wszystko jest w porządku
  • stopniowo aktualizuj priorytet i wagę B w DNS
  • całkowicie usuń A z DNS
  • poczekaj na wygaśnięcie DNS TTL; Nie powinno się już otrzymywać żadnych próśb
  • odrzucić A

i jesteś skończony.

Szczegóły, diagramy i oprzyrządowanie

Zobacz te opisy i narzędzia, które mogą pomóc zautomatyzować proces, ale ogólna idea jest taka sama:

Morał

„Wszystkie problemy w informatyce można rozwiązać przez inny poziom pośredni, z wyjątkiem oczywiście problemu zbyt wielu pośrednich”. - David Wheeler

Misha Brukman
źródło
Ale kiedy moduł równoważenia obciążenia również znajduje się w kontenerze (w przypadku korzystania z CoreOS), jak mogę zaktualizować ten kontener?
das_j
@das_j Zredagowałem odpowiedź, aby dodać howto również do aktualizacji modułu równoważenia obciążenia. Wskazówka: chodzi o inny poziom pośredni. :-)
Misha Brukman
1
W sumie brzmi to tak, jakbyśmy aktualizowali również fizyczne serwery i fizyczne moduły równoważące obciążenie.
Stefan Lasiewski
@StefanLasiewski masz absolutną rację i usunąłem notatkę „pojemniki” w jednym z nagłówków. Dla zewnętrznego użytkownika to, czy aplikacja lub moduł równoważenia obciążenia działa na czystym metalu, kontenerze lub maszynie wirtualnej, jest w dużej mierze niewidoczna.
Misha Brukman