Hinzufügung von Checkpoint/Restore-Unterstützung zu Podman
Von Adrian Reber
Mit Hilfe von Checkpoint/Restore In Userspace (CRIU) konnte ich erste Checkpoint/Restore-Unterstützung zu Podman hinzufügen. Mit Checkpoint/Restore ist es nun möglich, einen Container nach einem Neustart genau an dem Zeitpunkt fortzusetzen, an dem er gesichert wurde.
Im Januar 2018 begann ich darüber nachzudenken, Checkpoint/Restore-Unterstützung zu Podman zu bringen. Nach einigen ersten Diskussionen begann ich tatsächlich, die notwendigen Codeänderungen zu betrachten. Da Podman runc verwendet, um Container auszuführen, war die erste Unterstützung für das Checkpointing von Containern ziemlich schnell implementiert. Das Wiederherstellen war etwas komplizierter, da es zusätzliche Änderungen an conmon erforderte.
Zu diesem Zeitpunkt war ich in der Lage, einen einfachen Container zu checkpointen und wiederherzustellen.
Um das Checkpointing und Wiederherstellen von Containern tatsächlich nützlich zu machen, muss der wiederhergestellte Container dieselbe IP-Adresse haben wie der gesicherte Container. Das war der Punkt, an dem die Implementierung etwas kompliziert wurde.
Obwohl ich an und mit verschiedenen Container-Runtime's Checkpoint/Restore-
Unterstützung gearbeitet hatte, hatte ich nie einen genaueren Blick auf die
Netzwerkeinrichtung geworfen. Es funktionierte immer. Mit Podman tat es das
anfangs nicht. Der größte Unterschied ist, soweit ich es jetzt verstehe, dass
Podman Container Network Interface (CNI)
verwendet, um das Netzwerk des Containers zu konfigurieren. CNI erstellt einen
Netzwerk-Namespace und nach der Konfiguration teilt es runc mit, diesen
Netzwerk-Namespace für den Container zu verwenden.
Der Unterschied bei dieser Einrichtung ist, dass andere Container-Runtimes sich nicht wirklich um den tatsächlichen Namen des Netzwerk-Namespace kümmerten und CRIU bei der Wiederherstellung einfach einen neuen Netzwerk-Namespace mit denselben Eigenschaften wie beim Checkpoint erstellte. Also wurde ein neuer Netzwerk-Namespace erstellt. Für Podman muss das anders sein. CRIU muss den Netzwerk-Namespace ignorieren/überspringen und um das korrekt zu handhaben, musste ich sowohl runc (Add support to checkpoint and restore into external network namespaces) als auch CRIU (criu: add support for external net namespaces ) anpassen.
Nachdem ich also Zeit mit runc und CRIU verbracht hatte, konnte ich zu Podman
zurückkehren und die notwendigen Änderungen
implementieren, die Anfang Oktober 2018 in Podman zusammengeführt wurden.
Mit all den Hintergrundinformationen aus dem Weg, nun endlich einige Beispiele, wie Checkpoint/Restore in Podman verwendet werden kann. In meinem Beispiel verwende ich einen Container, der Apache Tomcat mit einem leicht modifizierten HelloWorldExample ausführt. Das HelloWorldExample wurde modifiziert, um eine einzelne Ganzzahl zurückzugeben, die nach jeder Anfrage erhöht wird.
Das Folgende startet meinen Testcontainer: