Aktualisieren Sie den Docker-Container ohne Ausfallzeit


17

Angenommen, ich habe einen Docker-Container mit einem Webserver (wie Apache 2). Jetzt möchte ich das Betriebssystem darunter aktualisieren. Diese SF-Antwort besagt, dass der beste Weg ist, das Basis-Image und mein Apache-Image neu zu erstellen. Die Bereitstellung des Abbilds bedeutet jedoch Ausfallzeiten, da ich den alten Container löschen muss, bevor ich den neuen erstellen kann, sodass nur ein Container an Port 80/443 gebunden ist.

Aber wie kann ich dieses Update ohne Ausfallzeiten bereitstellen? Soll ich einen Load Balancer und die Kommunikation zwischen Containern verwenden? Und wie aktualisiere ich den Load Balancer?

Antworten:


18

Das ideale Zielszenario

Ja, Sie sollten einen Lastenausgleich verwenden und jeweils eine Instanz aktualisieren. Ich bin nicht sicher, wo die Kommunikation zwischen Containern ankommt.

Stellen Sie sich als Beispiel einen Load Balancer vor, der Ihrer Site A dient. Benutzer stellen nur eine Verbindung zu ihr her und kennen sie nur als "A". Der Load Balancer weiß, dass es zwei oder mehr Backends gibt (B, C usw.), und es spielt keine Rolle, ob es sich um VMs oder Container handelt.

Anschließend möchten Sie die Backends aktualisieren, in diesem Fall Apache-Instanzen.

  1. Nehmen Sie B aus den in Frage kommenden Backends für den Load Balancer heraus, damit er keinen Datenverkehr mehr akzeptiert.
  2. Warten Sie, bis die aktuell aktiven Anforderungen bearbeitet und vorhandene Verbindungen geschlossen wurden.
  3. Aktualisieren Sie den Container oder die zugrunde liegende VM, die B bedient
  4. starte B neu, warte bis es geladen ist und beginne zu arbeiten
  5. Testen Sie B, um sicherzustellen, dass neue Anforderungen ordnungsgemäß verarbeitet werden
  6. Fügen Sie B wieder zum Load-Balancer-Backend-Pool hinzu, um den Datenverkehr wieder zu aktivieren

Führen Sie dann den gleichen Vorgang für C, D usw. aus.

Beachten Sie, dass es eine offene Anfrage für direkte Upgrades von Docker-Containern ab November 2013 gibt, diese jedoch anscheinend nicht sehr weit fortgeschritten ist. Daher sollten Sie die oben genannte Lösung in der Zwischenzeit durchführen.

Was ist für eine bestehende Live-Site zu tun?

Vermutlich fragen Sie dies, weil Sie bereits eine Live-Site in diesem Modell betreiben und diese ohne Ausfallzeiten aktualisieren möchten. Wir müssen also schrittweise zum oben genannten idealen Zielzustand gelangen.

Nehmen wir an, dass:

  • Sie haben einen DNS-Namen, der auf Ihren Container verweist
  • Ihr Container läuft auf einer IP-Adresse
  • Ihre Benutzer kennen die IP-Adresse des Containers nicht und sie ist nirgendwo fest codiert

Wenn diese Annahmen falsch sind, sollten Sie sie zuerst so korrigieren, dass dies korrekt ist.

Führen Sie dann die folgenden Schritte aus:

  1. Erstellen Sie einen Load Balancer mit einer neuen IP und verweisen Sie ihn auf den vorhandenen Container als einziges Backend
  2. Ändern Sie DNS so, dass es direkt auf den Load Balancer und nicht auf die Container-IP verweist
  3. Fügen Sie ein identisches Apache-Backend mit demselben VM + -Container-Setup hinzu
  4. Jetzt verfügen Sie über einen Load Balancer mit zwei Backends B und C. Befolgen Sie daher die Anweisungen im Abschnitt "Ideales Zielszenario", um sie nacheinander zu aktualisieren

So aktualisieren Sie einen Load Balancer

Der einfache (gehostete) Weg

Am einfachsten ist es, keinen eigenen Balancer zu betreiben. Wenn Sie beispielsweise eine Cloud-Plattform verwenden, die Load Balancing als Service bereitstellt, sollten Sie die Verwendung in Betracht ziehen. Wartung und Aktualisierung des Load Balancers sind dann kein Problem.

Der manuelle Weg

Wenn Sie Ihren eigenen Lastenausgleich ausführen, kann das Hinzufügen einer weiteren Indirektionsebene (dh DNS) hilfreich sein. Nehmen wir folgendes an:

  • dass wir einen Hostnamen haben, der in die IP unseres Load Balancers A aufgelöst wird, den wir aktualisieren möchten
  • Unser Load Balancer verfügt über einen Backend-Pool mit P1, P2 usw.

Wir gehen wie folgt vor:

  • Erstellen Sie einen neuen Load Balancer B mit der neuen Softwareversion
  • Fügen Sie alle Backend-Pool-Instanzen P1, P2 usw. zu unserem neuen Load Balancer B als Backends hinzu
  • Fügen Sie die IP-Adresse von B zusammen mit A zur DNS-Auflösung hinzu

    • Jetzt verwenden wir DNS effektiv als Load Balancer
    • Wenn die Einträge für A und B ungewichtet sind, sind sie effektiv 50-50
    • Beobachten Sie nun, wie sich B verhält, ob Fehler vorliegen usw.
    • Wenn etwas mit B nicht stimmt, machen Sie Folgendes rückgängig:

      1. Entfernen Sie B aus der DNS-Konfiguration
      2. Warten Sie, bis der Eintrag B im DNS verschwindet (dh bis TTL abläuft).
      3. lehne ab B
  • Angenommen, Sie haben den "Burn-In" -Test für B durchgeführt und alles ist in Ordnung
  • Aktualisieren Sie die Priorität und Gewichtung für B in DNS schrittweise
  • A vollständig aus DNS entfernen
  • Warten Sie, bis die DNS-TTL abgelaufen ist. A sollte keine Anfragen mehr bekommen
  • lehne ab A

und du bist fertig.

Details, Diagramme und Werkzeuge

Sehen Sie sich diese Artikel und Tools an, mit denen Sie den Prozess automatisieren können, aber die allgemeine Idee ist dieselbe:

Die Moral

"Alle Probleme in der Informatik können durch eine andere Indirektionsebene gelöst werden, mit Ausnahme natürlich des Problems zu vieler Indirektionen." - David Wheeler


Wie aktualisiere ich diesen Container, wenn sich der Load Balancer auch in einem Container befindet (bei Verwendung von CoreOS)?
das_j

@das_j Ich habe die Antwort bearbeitet, um eine Anleitung zum Aktualisieren eines Lastenausgleichs hinzuzufügen. Hinweis: Es geht um eine andere Ebene der Indirektion. :-)
Misha Brukman

1
Alles in allem klingt dies so, als würde man auch physische Server und physische Loadbalancer aktualisieren.
Stefan Lasiewski

@StefanLasiewski du hast absolut recht und ich habe den "container" hinweis in einer der überschriften entfernt. Für einen externen Benutzer ist weitgehend unsichtbar, ob eine App oder ein Load Balancer auf Bare-Metal-, Container- oder VM-Systemen ausgeführt wird.
Mischa Brukman
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.