Container kalt oder in Betrieb verschieben
Will man einen Container „kalt", also im heruntergefahrenen Zustand verschieben, sind dazu drei Befehle nötig:
lxc stop CONTAINER
lxc move CONTAINER REMOTEHOST:CONTAINER
lxcstart REMOTEHOST:CONTAINER
Ist auf beiden Hosts CRIU installiert, kann der Container auch ohne Serviceunterbrechung verschoben werden. Stoppen und Starten entfallen dann bei einer Live-Migration. CRIU kümmert sich im Hintergrund um das Erstellen der „statefulcheckpoints" (Snapshots) auf dem Quell-Host und um den Restore derselben auf dem Ziel-Host. LXD erledigt die Authentifizierung und den Transport der Pakete. Der ganze Vorgang ist dann mit einem einfachen lxc move CONTAINER REMOTEHOST:CONTAINER erledigt (Push). Man kann die Migration aber auch vom Ziel-Host aus anstoßen (Pull):
lxc move REMOTEHOST:CONTAINER CONTAINER
Drei Voraussetzungen
Aber wie funktioniert das ganze? Zuerst einmal müssen folgende Voraussetzungen erfüllt sein:
- LXD und CRIU sind auf beiden Hosts installiert
- Beiden Hosts ist der jeweils andere als „Remote" bekannt (lxc remote add NAME IP)
- Port 8443 darf nicht durch Firewalls oder ähnliches blockiert sein
Startet man nun den „move", werden zwischen dem Quell- und dem Ziel-Host drei „Streams" aufgebaut: der Control Stream, der CRIU-"Container Process State" Stream und der Filesystem Stream. Über den Control-Stream werden allgemeine Informationen über den Container und den Migrations-Vorgang ausgetauscht. Über den CRIU-Stream laufen die Memory-Dumps des laufenden Containers, die von CRIU erstellt werden. Dabei wird eine Serie von Dumps erstellt und die Deltas bis zum finalen Dump an den Ziel-Host übertragen. Der Filesystem-Stream überträgt dann schließlich noch die Daten des Container-Images. Auf dem Ziel-Host wird dann von LXD und CRIU wieder Stück für Stück eine laufende Container-Instanz erstellt.
Fazit
Der ganze Vorgang läuft im besten Fall ohne spürbare Serviceunterbrechung ab. Diverse Tests meinerseits mit einfachen Containern liefen immer problemlos durch. Es mag aber durchaus gewisse Szenarien mit komplexen Containern geben, bei denen CRIU an seine Grenzen gelangt und eine „heiße" Live-Migration fehlschlägt. In so einem Fall kann CRIU mit seiner Stateful-Checkpoint-Technologie den Container auf dem Quellhost auch einfrieren (lxc stop CONTAINER --stateful). Der eingefrorene Container wird dann „manuell" wie oben beschrieben auf den Ziel-Host übertragen und dort wieder gestartet. Nachdem der Container auf dem Ziel-Host gestartet ist, läuft der Checkpoint weiter.
Weitere Informationen, Beispiele und ausführliche Dokumentationen zum Thema finden sich auf den Seiten des LXD-Projekts und CRIU, siehe Links.
Sie haben Interesse an einer Weiterbildung oder Fragen zum Thema? Sprechen Sie uns an oder besuchen Sie einen unserer Kurse aus unserem Seminarshop:
Zu unseren Seminaren