Per LXD ist es möglich LXCs zu steuern, auch wenn diese auf einem anderen Host liegen.
Einrichtung der Remote-Steuerung
Auf dem Host, welcher remote steuerbar werden soll, erweitern wir die Konfiguration entsprechend und legen fest auf welche IP-Adresse und Port „gelauscht“ werden soll.
Dies geschieht mit:
lxc config set core.https_address "[::]:8443"
Hier wird festgelegt, dass auf allen verfügbaren Netzwerkinterfaces und dem Port 8443 gelauscht wird.
Nun legen wir noch ein Passwort fest, mit welchem sich andere Hosts authentifizieren können:
lxc config set core.trust_password geheimespasswort
Hier ist geheimespasswort das festgelegte Passwort.
Anschließend prüfen wir noch ob die Konfiguration erfolgreich eingetragen ist:
$ lxc config show
config:
core.https_address: '[::]:8443'
core.trust_password: true
Die verfügbaren Optionen und deren Erklärung findet man hier: lxd.readthedocs.io
Nun fügt man auf dem Host, von dem man aus den Remote-Host steuern will, diesen in die LXD-Konfiguration ein.
Allgemeine Syntax: lxc remote add <Hostalias> <IP>:<Port>
lxc remote add second 172.31.19.72:8443 --password=geheimespasswort
An dieser Stelle sollte einem dann der Fingerprint des Remote-Systems angezeigt werden, den man mit einem y bestätigt.
Um den angezeigten Fingerprint zu überprüfen, führt man auf dem Remote-System den Befehl
lxc info | grep fingerprint
aus.
Ab jetzt sollte der Remote-Host unter dem Alias second in der remote-Liste angezeigt werden:
$ lxc remote list
+-----------------+------------------------------------------+---------------+--------+--------+
| NAME | URL | PROTOCOL | PUBLIC | STATIC |
+-----------------+------------------------------------------+---------------+--------+--------+
| images | https://images.linuxcontainers.org | simplestreams | YES | NO |
+-----------------+------------------------------------------+---------------+--------+--------+
| local (default) | unix:// | lxd | NO | YES |
+-----------------+------------------------------------------+---------------+--------+--------+
| second | https://172.31.19.72:8443 | lxd | NO | NO |
+-----------------+------------------------------------------+---------------+--------+--------+
| ubuntu | https://cloud-images.ubuntu.com/releases | simplestreams | YES | YES |
+-----------------+------------------------------------------+---------------+--------+--------+
| ubuntu-daily | https://cloud-images.ubuntu.com/daily | simplestreams | YES | YES |
+-----------------+------------------------------------------+---------------+--------+--------+
Um den Status der Container auf dem Remote-Host zu überprüfen, verwendet man:
$ lxc list second:
+-----------------+---------+---------------------+----------------------------------------------+------------+-----------+
| NAME | STATE | IPV4 | IPV6 | TYPE | SNAPSHOTS |
+-----------------+---------+---------------------+----------------------------------------------+------------+-----------+
| debian10 | STOPPED | | | PERSISTENT | 1 |
+-----------------+---------+---------------------+----------------------------------------------+------------+-----------+
| opensuse | RUNNING | 10.51.45.167 (eth0) | fd3:f834:5c8a:b571:216:3eff:fe44:daf7 (eth0) | PERSISTENT | 0 |
+-----------------+---------+---------------------+----------------------------------------------+------------+-----------+
| ubuntu1804daily | RUNNING | 10.51.45.58 (eth0) | fd3:f834:5c8a:b571:216:3eff:fe70:4cd0 (eth0) | PERSISTENT | 1 |
+-----------------+---------+---------------------+----------------------------------------------+------------+-----------+
| web1 | RUNNING | 10.51.45.250 (eth0) | fd3:f834:5c8a:b571:216:3eff:fed3:4b9e (eth0) | PERSISTENT | 0 |
+-----------------+---------+---------------------+----------------------------------------------+------------+-----------+
| web2 | RUNNING | 10.51.45.72 (eth0) | fd3:f834:5c8a:b571:216:3eff:feb4:dc1e (eth0) | PERSISTENT | 0 |
+-----------------+---------+---------------------+----------------------------------------------+------------+-----------+
Remote-Steuerung von Containern
Nachdem nun alles soweit eingerichtet ist, kann man die Container auf dem Remote-Host genauso steuern als lägen diese auf dem lokalen Host.
Ein Beispiel:
$ lxc exec second:opensuse -- cat /etc/issue
Welcome to openSUSE Leap 42.3 - Kernel \r (\l).
$ lxc exec second:ubuntu1804daily -- cat /etc/issue
Ubuntu Bionic Beaver (development branch) \n \l
Wie man hier sieht, wird vor dem Containernamen noch der Alias des Remote-Hostes gesetzt.
Besonders praktisch ist es, wenn man eine Datei von seinem lokalen System in einen Container auf dem Remote-Host kopieren kann…
$ lxc file push test.txt second:ubuntu1804daily/tmp/
$ lxc exec second:ubuntu1804daily -- cat /tmp/test.txt
das ist ein test
Kopieren/Verschieben von Containern
Es ist auch Problemlos möglich einen Container vom Remote-Host auf das lokale System zu kopieren.
Allerdings muss der entsprechende Container dafür gestoppt sein.
Will man einen laufenden Container kopieren, erstellt man einfach einen Snapshot des betreffenden Containers und kopiert diesen:
$ lxc list
+------+-------+------+------+------+-----------+
| NAME | STATE | IPV4 | IPV6 | TYPE | SNAPSHOTS |
+------+-------+------+------+------+-----------+
$ lxc snapshot second:ubuntu1804daily ubuntusnap0
$ lxc copy second:ubuntu1804daily/ubuntusnap0 ubuntu
$ lxc list
+--------+---------+------+------+------------+-----------+
| NAME | STATE | IPV4 | IPV6 | TYPE | SNAPSHOTS |
+--------+---------+------+------+------------+-----------+
| ubuntu | STOPPED | | | PERSISTENT | 0 |
+--------+---------+------+------+------------+-----------+
Man kann die Container auch mit lxc move
auf den lokalen Host migrieren, dazu muss der entsprechende Container allerdings gestoppt sein.
$ lxc stop second:ubuntu1804daily
$ lxc move second:ubuntu1804daily ubuntu