Incus Container zwischen Hosts kopieren oder verschieben

Im folgenden erkläre ich kurz die Übertragung von Incus-Container zwischen zwei Incus-Hosts, die nicht in einem gemeinsamen Cluster hängen. Beide Hosts sind in meinem Fall mit ZFS-basiertem Containerstorage ausgerüstet. Siehe auch: Incus mit ZFS in einer VM betreiben und Container auf neuen Storagepool verschieben

API öffnen

Wenn ein Container zwischen zwei Hosts verschoben werden soll, muss zuerst ein Übertragungsweg zwischen den beiden Incus-Hosts geschaffen werden. Dazu wird auf dem Quellhost die API am Netzwerkinterface verfügbar gemacht:

incus config set core.https_address [2001:db8::1]:8443

Die IPv6-Adresse in eckigen Klammern muss selbstverständlich durch die IP-Adresse eures eigenen Interfaces ersetzt werden. Bei einer IPv4-Adresse wird auf die Klammern verzichtet.

Als nächstes wird ein Trust Token auf dem Quellserver erzeugt:

incus config trust add sourcehost

Auf dem Zielserver wird der Quellserver hinzugefügt:

incus remote add sourcehost 2001:db8::1

Dabei muss am Ende der Trust Token eingegeben werden, der zuvor vom Quellserver ausgegeben wurde. Sobald in der Konsole

Client certificate now trusted by server: sourcehost

erscheint, kann eine erste Übertragung des Containers vom Quellserver zum Zielserver stattfinden.

Daten übertragen

Das Root Filesystem des Containers kann auf zwei Arten und Weisen übertragen werden:

  • a) An einem Stück mit einer Downtime, die so lange dauert, wie die Datenübertragung. Empfohlen für kleine Container.
  • b) In mehreren Schritten über einen zweiten, inkrementellen Sync. Mit wenigen Sekunden bis Minuten Downtime. Empfohlen vor allem für größere Container mit 100+ GB. Funktioniert nur mit Dateisystemen wie ZFS, die Snapshots unterstützen.

a) Einfache Übertragung für kleinere Container

# (auf dem Quellserver)
incus stop mycontainer

# (auf dem Zielserver)
incus copy sourcehost:mycontainer mycontainer --stateless

Oder b): Inkrementelle Übertragung

Bei der inkrementellen Übertragung wird zuerst im Hintergrund der aktuelle Stand des Container übertragen. Die Anteile, die während der Übertragung verändert wurden (weil der Container noch in Betrieb war), werden in einem zweiten Schritt nachgeliefert. Dieser zweite Sync läuft dann aber wesentlich schneller, weil er nur ein Delta Überträgt und nicht alle Daten nochmal.

Snapshot auf dem Quellserver erstellen:

incus snapshot create mycontainer

(Der Container bleibt in Betrieb und wird noch nicht gestoppt)

Initiale Übertragung auf dem Zielserver starten:

incus copy sourcehost:mycontainer mycontainer --stateless

Nach der ersten Übertragung wird der Quellcontainer beendet und ein zweiter, finaler Sync angestoßen:

# (auf dem Quellserver)
incus stop mycontainer
incus snapshot create mycontainer

# (auf dem Zielserver)
incus copy sourcehost:mycontainer mycontainer --refresh

Schließlich wird der Container auf dem Zielserver gestartet:

incus config unset mycontainer volatile.apply_template
incus start mycontainer

API schließen

Zum Schluss kann die API auf dem Quellserver wieder dicht gemacht werden, falls sie nicht für andere Zwecke verwendet werden soll:

incus config unset core.https_address