Live Migration von Linux-Containern mit LXD

titelbild-linux
Möchte man Linux-Container (LXC) von einem Host auf einen anderen verschieben, so bedeutet dies in der Regel, den Container zu stoppen, zu exportieren und mittels rsync/scp/etc. auf den anderen Host zu bewegen. Dort müsste er importiert und schließlich wieder gestartet werden. Ein Vorgang, der nicht nur zeitaufwändig ist, sondern auch einiges an (fehleranfälliger) Tipparbeit erfordert. Mit dem Container-Manager LXD von Canonical [1] lässt sich dieser Vorgang zum einen deutlich vereinfachen, zum anderen bietet LXD im Zusammenspiel mit CRIU [2] sogar die Möglichkeit, Linux-Container im laufenden Betrieb "live" zu verschieben!

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.

 Links

By accepting you will be accessing a service provided by a third-party external to https://blog.ordix.de/