Netzwerk aus LXD-Containern

Wie organisiert man seine digitale Arbeit? Dieser Beitrag zeigt, wie eine Arbeitsumgebung aus isolierten LXD-Containern erstellt wird, die auf einem Desktop-Rechner oder Server lebt und im gesamten Netzwerk verfügbar ist.

LXC-Container sind die Grundlage für diverse Virtualisierungen. LXD-Container sind eine Weiterentwicklung. LXD stellt eine einheitliche Bedienoberfläche für Container aller Art bereit.

In ihrer einfachsten Form isolieren LXD-Container Prozesse durch Verwendung unterschiedlicher Namensräume. Systemressourcen werden gemeinsam genutzt. Das macht die Container sehr ressoucenschonend.

Container bieten sich als Organisationselemente für einen Desktop-Arbeitsplatz an. Sie eignen sich vorzüglich für die Bearbeitung eigenständiger Prozesse. So macht es z.B. Sinn, die Arbeitsumgebung für Bildverarbeitung komplett von der für die Buchhaltung zu trennen.

LXC-Container werden von allen Linux-Distributionen unterstützt, können aber auch in Windows und Mac-Systemen verwendet werden. Die Entwicklung erfolgt hauptsächlich auf Ubuntu-Maschinen, die Programmpakete werden als Snap-verteilt. Es macht Sinn, Ubuntu als Betriebssystem für die Container zu verwenden.

Ziel

Es soll eine effiziente Arbeitsumgebung für heterogene Tätigkeitsanforderungen eingerichtet werden, die ortsungebunden eingesetzt werden kann.
Für jeden Tätigkeitsbereich soll eine optimierte Arbeitsumgebung existieren. Falls die Aufgaben delegiert werden, wird ein Snapshot des Containers übergeben.

Softwareeinrichtung (Linux)

LXD wird via Snap installiert und per Kommandozeile initiiert

sudo snap install lxd
sudo lxd init

Die Steuerung der Instanzen geschieht mit lxc {xxxx}-Befehlen. lxc help zeigt die Liste verfügbarer Befehle. Für die Administration der Containerlandschaft existiert ein knapper LXD-Befehlssatz: lxd init, lxd recover und lxd shutdown.

Customizing

Die Containersteuerung mit lxc ist gut dokumentiert und benutzerfreundlich. Häufig gebrauchte Operationen können mit einem Alias versehen werden. Um beispielsweise das Terminal eines Ubuntu-Containers mit lxc open {instanz} zu öffnen kann folgender Alias eingerichtet werden:

lxc alias add  open  'exec @ARGS@ -- sudo --login --user ubuntu'

# Beispiel
$ lxc open iruby
(base) iruby:~$ pwd
/home/ubuntu

Ubuntu-Container haben einen passwortlosen Standardbenutzer ubuntu. Mit dem Alias erhält man eine Bash-Kommandozeile im Home-Verzeichnis /home/ubuntu. Der Container verhält sich wie ein ganz normaler Ubuntu-Rechner.

Erstellen einer Instanz

Mit nur drei Kommandozeilen-Befehlen erstellt man eine Instanz mit einem modernen Ubuntu-Betriebssystem in einer isolierten Arbeitsumgebung.

lxc launch --profile default ubuntu-minimal:j {Name des Containers}
lxc start {Name des Containers}
lxc open {Name des Containers}

Der Rechner ist automatisch im Netzwerk integriert. Nun kann begonnen werden, die notwendigen Softwarepakete einzurichten.

Netzwerktopologie

LXD richtet bei der Initialisierung eine Netzwerkbrücke ein (Standard: lxdbr0). Darüber kommunizieren die Container miteinander und mit der Außenwelt. Die Container belegen in der Standard-Konfiguration einen 10.xx.xx.xx Adressraum.

lxc list
+-------+---------+---------------------+-----------------------------------------------+
| NAME  |  STATE  |        IPV4         |                     IPV6                      |
+-------+---------+---------------------+-----------------------------------------------+
+-------+---------+---------------------+-----------------------------------------------+
| hb    | RUNNING | 10.21.13.66 (eth0)  | fd42:38f4:b188:49d7:216:3eff:fe9c:d836 (eth0) |
+-------+---------+---------------------+-----------------------------------------------+
| rails | STOPPED |                     |                                               |
+-------+---------+---------------------+-----------------------------------------------+
| sindy | RUNNING | 10.21.13.48 (eth0)  | fd42:38f4:b188:49d7:216:3eff:fe74:242a (eth0) |
+-------+---------+---------------------+-----------------------------------------------+
| t6    | RUNNING | 10.21.13.220 (eth0) | fd42:38f4:b188:49d7:216:3eff:fe13:4b3b (eth0) |
+-------+---------+---------------------+-----------------------------------------------+

Die Container können vom Host über lxc open {name} erreicht werden. Netzwerknutzer können auf die Instanzen zugreifen, nachdem sie den Host als Remote eingebunden haben ( lxc add remote [ip des Hosts]).

In der Standardeinstellung können die Container untereinander und mit dem Host-Rechner kommunizieren. Andere Geräte im Netzwerk haben (ausser über die Steuerung via lxc-Befehlen) keinen Zugriff. Lxc-Container verhalten sich exakt wie Docker-Instanzen.

Nutzung im Netzwerk

Mit nur wenigen Zeilen lassen sich die Container im gesamten Netzwerk ansprechen.

Angenommen, es gibt einen Router, der DHCP Netzwerkadressen im 172.28.50.xx Adressraum vergibt. Der Host sei direkt an diesen Router angeschlossen.

Dann genügt es, die Bridge via Netplan mitzuteilen, den DHCP-Server zu benutzen.

network:
  version: 2
  ethernets:
    enp4s0:
      dhcp4: false
  bridges:
    lxdbr0:
      dhcp4: true
      interfaces:
       - enp4s0
     parameters:
       stp: false

enp4s0 ist die Bezeichnung der Netzwerkschnittstelle des Hosts. Nach einem Neustart vergibt der Router neue IP-Adressen und die Container sind über ihren Namen im gesamten Netzwerk ansprechbar.

lxc list
+-----------------+---------+----------------------+------+-----------+-----------+
|      NAME       |  STATE  |         IPV4         | IPV6 |   TYPE    | SNAPSHOTS |
+-----------------+---------+----------------------+------+-----------+-----------+
| hierdevel       | RUNNING | 172.28.50.124 (eth0) |      | CONTAINER | 0         |
|                 |         | 172.17.0.1 (docker0) |      |           |           |
+-----------------+---------+----------------------+------+-----------+-----------+
| iruby           | RUNNING | 172.28.50.123 (eth0) |      | CONTAINER | 0         |
+-----------------+---------+----------------------+------+-----------+-----------+
| marius          | RUNNING | 172.28.50.127 (eth0) |      | CONTAINER | 1         |
+-----------------+---------+----------------------+------+-----------+-----------+

An- und Abschalten des LXD-Dienstes

Einzelne Container können mit

lxc stop {containername}

ausgeschaltet werden.

Das Netzwerk und die LXD-Services sind weiterhin verfügbar. Ein Hacker kann die Dienste mit normalen User-Rechten starten und benutzen.

Das ist nicht mehr möglich, wenn der LXD-Dienst selbst deaktiviert wurde:

$ sudo snap stop lxd.daemon
Stopped.

$ sudo snap start lxd.daemon
Started.

Die Deaktivierung erfolgt über die Snap-API und benötigt Administrator-Rechte.

Literatur