Was ist LXD? Container verwalten mit dem Linux Container Daemon

Bei LXD, dem „Linux Container Daemon“, handelt es sich um ein Management-Tool für Linux Betriebssystem-Container. Dieser wurde von Canonical, der Firma hinter Ubuntu Linux, entwickelt; Canonical setzt die Weiterentwicklung von LXD bis heute fort und leitet das Projekt an.

LXD ist eine Schwestertechnologie zu LXC, den „Linux Containers“. Bei LXC handelt es sich um eine containerbasierte Virtualisierungs-Technologie auf Ebene des Betriebssystems. Technisch kombiniert LXC isolierte Namensräume und die „cgroups“ des Linux-Kernels, um abgeschottete Umgebungen für die Ausführung von Code zu realisieren. Historisch war LXC auch die Grundlage für die weit verbreitete Virtualisierungs-Technologie Docker.

Eines der grundlegenden Ziele bei der Entwicklung von LXD war, die Verwaltung von LXC-Containern so komfortabel zu gestalten, wie mit virtuellen Maschinen üblich. Im Vergleich zum Einsatz einer virtuellen Maschine liefert der containerbasierte Ansatz jedoch eine höhere Performanz.

Mittels LXD lassen sich Linux-Betriebssystem-Container über einen definierten Satz von Befehlen konfigurieren und steuern. LXD eignet sich daher für die Automatisierung der massenhaften Container-Verwaltung und findet Verwendung in Cloud-Computing und Datencentern.

Was sind die Features von LXD?

  • Sicherheit: Die Container laufen in isolierten Namensräumen und können nur auf definierte Ressourcen zugreifen.
  • Skalierbarkeit: LXD erlaubt die Verwaltung von einzelnen Containern auf dem eigenen Laptop bis hin zu Tausenden von Containern in verteilten Umgebungen.
  • Intuitive Nutzbarkeit: LXD stellt eine einfache, klare API und einen entsprechenden Kommandozeilen-Client zur Verfügung.
  • Basiert auf Linux-Images: LXD funktioniert mit jeglichen Linux-Images und profitiert damit von der großen Anzahl existierender Linux-Distributionen.
  • Ausgefeilte Ressourcen-Kontrolle: Für einen Container werden Beschränkungen für CPU, Hauptspeicher, Netzwerk-Nutzung, Massenspeicher-Nutzung und Kernel-Ressourcen festgelegt.
  • Zugriff auf System-Hardware: Sofern die Konfiguration es zulässt, können Container u. a. auf USB-Geräte, GPU und Massenspeicher-Medien zugreifen.
  • Netzwerkmanagement: Per Konfiguration lassen sich Netzwerkbrücken und -tunnel erzeugen.
  • Massenspeicher-Management: LXD unterstützt verschiedene Speicher-Backends, Speicher-Pools und Speicher-Volumen.

Was sind die Vorteile und Nachteile von LXD?

Hauptsächlicher Vorteil ist, dass LXD die Virtualisierung eines kompletten Linux-Betriebssystems auf Container-Basis ermöglicht. Damit vereint LXD den Komfort virtueller Maschinen mit der Performanz von Containern.

Im Gegensatz zu den meisten Docker-basierten Anwendungsfällen liegt der Fokus bei LXD nicht auf der Virtualisierung einer einzelnen Anwendung („App-Virtualisierung“). Vielmehr dient ein Linux-System-Image als Grundlage eines jeden LXD-Containers („System-Virtualisierung“). Für den Administrator ist dies von Vorteil, da es den Zugriff auf eine große Anzahl frei verfügbarer Linux-Distributionen eröffnet und die Nutzung vielfältiger existierender Tools ermöglicht.

Einen Nachteil hat LXD jedoch gegenüber anderen Virtualisierungs-Technologien: Da alle auf einem Host laufenden Container auf denselben Linux-Kernel zugreifen, ist der LXD-Daemon nur unter Linux verfügbar. Ferner kann mit LXD einzig und allein Linux als Gast-Betriebssystem virtualisiert werden. Der Kommandozeilen-Client funktioniert jedoch auch auf Nicht-Linux-Betriebssystemen.

Die REST-API des LXD-Daemon lässt sich über das Netzwerk ansprechen. Somit können Container zwischen Maschinen bewegt oder kopiert werden. Ferner unterstützt LXD das Erzeugen von Maschinen-Clustern, die viele einzelne Recheneinheiten zu einem virtuellen Supercomputer bündeln.

Wie funktioniert LXD?

Die Kernkomponente von LXD ist der privilegierte, namensgebende Daemon, der auf dem Host-Linux-System läuft. Der LXD-Daemon stellt eine REST-API über einen lokalen Linux-Socket zur Verfügung. Per Konfigurationseinstellung lässt sich der Daemon auch über das Netzwerk ansprechen. Unter der Haube greift LXD über die Bibliothek liblxc und seine Go-Bindings auf LXC als Backend zurück.

Ein Client interagiert mit dem Daemon über die REST-API. Die API definiert eine Sprache, mit der Container erzeugt, gesteuert und verändert werden können. Der simpelste Client ist das offizielle Kommandozeilen-Tool. Der Kommandozeilen-Client stellt Befehle für viele häufige Operationen zur Verfügung und greift intern auf die REST-API zu.

Im Folgenden haben wir der Übersicht halber ein paar grundlegende LXD-Befehle für Sie zusammengestellt. Lassen Sie sich nicht verwirren: Der Name des LXD Kommandozeilen-Befehls lautet lxc, nicht lxd. Sie können die Befehle selbst ausprobieren, ohne den Kommandozeilen-Clienten auf Ihrem System installieren zu müssen. Nutzen Sie dafür einfach die webbasierte Oberfläche des linuxcontainers.org-Projekts.

# LXD-Befehle und Optionen anzeigen
lxc

# existierende Ubuntu-Images seitenweise anzeigen
lxc image list ubuntu: | less

# eine Ubuntu-18.04-Instanz als Container mit dem Namen "Ubuntu" starten
lxc launch images:ubuntu/18.04 ubuntu

# erzeugte Container auflisten
lxc list

# Konfiguration für den Container mit Namen "Ubuntu" anzeigen
lxc config show ubuntu 

# Informationen für den Container mit Namen "Ubuntu" anzeigen
lxc info ubuntu

Wo und wann kommt LXD zum Einsatz?

Prinzipiell lässt sich LXD auf jedem modernen Linux-System installieren. Zum einen erfolgt der Einsatz auf privaten Rechnern, zum anderen wird LXD auch in Cloud-Computing Plattformen und verteilten Datencentern genutzt. Dabei zielt LXD in erster Linie darauf ab, ein komplettes Linux-Betriebssystem zu virtualisieren, das langlebig in der Nutzung ist. Damit steht LXD im Gegensatz zu Docker; dort liegt der Fokus mehr auf kurzlebigen Containern, welche eine einzelne Anwendung kapseln. In den Worten des LXD-Entwicklers Stéphane Graber:

Zitat

„Those containers will typically be long running and based on a clean distribution image. Traditional configuration management tools and deployment tools can be used with LXD containers exactly as you would use them for a VM, cloud instance or physical machine.

In contrast, Docker focuses on ephemeral, stateless, minimal containers that won’t typically get upgraded or re-configured but instead just be replaced entirely. That makes Docker and similar projects much closer to a software distribution mechanism than a machine management tool.“

– Stéphane Graber, Quelle: https://stgraber.org/2016/03/11/lxd-2-0-introduction-to-lxd-112/

Übersetzung:
"Diese Container sind normalerweise langlebig und basieren auf einem Standard-Linux-Systemimage. Traditionelle Konfigurations-Management- und Deployment-Tools können mit LXD-Containern genauso genutzt werden, wie von virtuellen Maschinen, Cloud-Instanzen und physischen Maschinen gewohnt.

Im Gegensatz dazu liegt der Fokus bei Docker auf vergänglichen, zustandslosen, minimalen Containern, die nicht neu konfiguriert, sondern bei Bedarf komplett ausgetauscht werden. Docker und vergleichbare Projekte ähneln damit eher einem Mechanismus zur Software-Verteilung als einem Werkzeug zum Management einer ganzen Maschine." (Übersetzt von IONOS)

Für die Steuerung einer geringen Anzahl an Containern eignet sich der mitgelieferte Kommandozeilen-Client. Dieser ist jedoch nicht dafür ausgelegt, eine große Anzahl an Containern auf einer Vielzahl verteilter Hosts zu verwalten. Für diese Anwendungsfälle kommen Anbindungen an die Plattformen OpenStack und OpenNebula zum Einsatz.

Was sind die Bestandteile von LXD?

Die Kernbestandteile von LXD sind der bereits erwähnte Daemon, die darüber zur Verfügung gestellte REST-API und der Kommandozeilen-Client. Im Folgenden betrachten wir die bei der Arbeit mit LXD primär zum Einsatz kommenden Entitäten.

Container

Der Container ist die grundlegende von LXD zur Verfügung gestellte Abstraktion. Ein LXD-Container umfasst die folgenden Eigenschaften:

  • Ein Linux-Dateisystem
  • Konfigurations-Einstellungen wie Ressourcen-Limits, Umgebungsvariablen, Sicherheits-Optionen etc.
  • Massenspeicher- und Netzwerkgeräte
  • Konfigurations-Profile, von denen der Container Einstellungen erbt
  • Generelle Eigenschaften wie Container-Architektur, Name sowie die Angabe, ob der Container kurzlebig oder langlaufend ist
  • Laufzeit-Zustand wie Netzwerk-Durchsatz, Speicher-Auslastung etc.

Snapshots

Wie bei anderen Virtualisierungs-Technologien üblich, lassen sich von einem Container so genannte Snapshots („Schnappschüsse“) erzeugen. Ein Snapshot ist identisch mit dem zugrundeliegenden Container. Snapshots sind „immutable“, können also nicht verändert werden. Sie lassen sich lediglich umbenennen und löschen. Von einem Snapshot lässt sich der exakte Zustand eines Containers wiederherstellen.

Images

Obwohl es sich bei LXD um eine containerbasierte Technologie handelt, kommt zur Erzeugung des Containers ein Linux-System-Image zum Einsatz. Per Definition entstammt jeder LXD-Container einem Image.

Bei den Images handelt es sich normalerweise um unmodifizierte Linux-Distributionen, wie sie auch für virtuelle Maschinen oder Cloud-Instanzen verwendet werden. Ein Image wird eindeutig über seinen SHA256-Hash identifiziert. Um die Zuordnung für menschliche Nutzer freundlicher zu gestalten, lässt sich ein Alias-Name für ein Image festlegen.

Linux-Images für die Nutzung mit LXD lassen sich von verschiedenen Quellen online beziehen. Die folgenden Image-Server sind in LXD vordefiniert:

  • ubuntu: Stellt stabile Ubuntu-Images zur Verfügung.
  • ubuntu-daily: Stellt tägliche Builds von Ubuntu Images zur Verfügung.
  • images: Stellt eine Vielzahl von Images anderer Linux-Distributionen bereit und wird von der Community selbst verwaltet.

Die vom LXD-Daemon heruntergeladenen Images werden automatisch in einem Cache vorgehalten, so dass diese bei wiederholter Nutzung ohne Zeitverzug zur Verfügung stehen. Sofern nicht anders konfiguriert, überprüft LXD die Version heruntergeladener Images und lädt bei Bedarf neue Versionen nach. Ähnlich dem Konzept der „Vagrant Box” lässt sich mit LXD ein bestehender Container als neues Image veröffentlichen.

Profile

Ein LXD-Profil bündelt verschiedene Container-Konfigurationseinstellungen. Ein Profil lässt sich auf mehrere Container anwenden; ferner können mehrere Profile nacheinander auf einen Container angewandt werden. Abschließend wird die lokale Container-Konfiguration eingespielt. Während dieses Prozesses werden ggf. mehrmals definierte Konfigurationswerte überschrieben. So lassen sich einfach Familien von Containern erzeugen. Von Hause aus wird LXD mit zwei existierenden Profilen ausgeliefert:

  • Das default-Profil wird automatisch auf einen Container angewendet, sofern kein alternatives Profil festgelegt ist. Dieses Profil umfasst grundlegende Konfigurationseinstellungen, wie das eth0-Netzwerkgerät des Containers.
  • Das docker-Profil dient der Konfiguration eines LXD-Containers, der Docker-Container enthalten soll. Das Profil veranlasst den LXD-Container, notwendige Kernel-Module zu laden und Geräte-Einstellungen zu setzen. Ferner wird das Schachteln von Containern angeschaltet.

Remotes

Bei LXD handelt es sich um einen Netzwerk-Daemon: der Kommandozeilen-Client kann mit mehreren entfernten LXD-Servern und Image-Servern kommunizieren. Per Konfiguration lassen sich mehrere Server als Remotes definieren. So lassen sich bestehende Container zwischen LXD-Servern kopieren und bewegen; ferner erfolgt über die Remotes der Zugriff auf die Image-Server. Neben den im Abschnitt „Images” bereits vorgestellten Image-Servern kennt der Kommandozeilen-Client ab Werk noch das 'local'-Remote. Dieses dient zur Kommunikation mit dem lokalen LXD-Daemon über einen UNIX-Socket.

Was sind Alternativen zu LXD?

Heutzutage existiert ein großes Spektrum an Virtualisierungs-Technologien, die prinzipiell als Alternativen zu LXD eingesetzt werden können. Diese unterscheiden sich in Hinsicht auf verschiedene Kriterien und lassen sich grob in zwei große Gruppen einteilen: Neben den traditionellen VM-basierten Virtualisierungs-Tools haben sich containerbasierte Technologien durchgesetzt. LXD fällt hier aus dem Rahmen und nutzt einen hybriden Ansatz, bei der ein gesamtes Linux-Betriebssystem auf Container-Basis virtualisiert wird.

Manche Virtualisierungs-Tools setzen Linux als Host-System voraus, andere laufen auf allen verbreiteten Betriebssystemen. Gleichermaßen unterstützen manche Virtualisierungs-Umgebungen nur Linux als Gast-System, andere ganz verschiedene. Bei vielen containerbasierten Technologien liegt der Fokus primär auf der App-Virtualisierung, während virtuelle Maschinen immer auf einem kompletten Betriebssystem aufsetzen.

Da LXD auf LXC aufbaut, ist die Nutzung einer „nackten“ LXC-Installation als Alternative zu LXD möglich. Dann gestaltet sich der Einsatz jedoch ggf. weniger komfortabel. Da ohne LXD kein Daemon zum Einsatz kommt, lässt sich die Virtualisierung nicht über das Netzwerk steuern. Ferner fehlt dann die REST-API als einheitliche Schnittstelle.

Von den verbreiteten Virtualisierungs-Tools ist wohl containerd am ehesten mit LXD vergleichbar. So läuft containerd ebenfalls als Daemon, der eine API zur Verfügung stellt. Dies erlaubt wie bei LXD die Verwaltung der Container über das Netzwerk. Die Technologie ist in Docker integriert und wird häufig eingesetzt.

Generell ist es anzuraten, je nach spezifischen Anforderungen die passende Technologie zu wählen. Hier eine Übersicht häufig eingesetzter Virtualisierungs-Technologien:

Virtualisierer Typ Host-System Gast-System
LXD Container nur Linux nur Linux
LXC Container nur Linux nur Linux
containerd Container Linux, Windows verschiedene / App
Docker Container Linux, macOS, Windows verschiedene / App
Kubernetes Container Linux, macOS, Windows verschiedene / App
KVM virtuelle Maschine nur Linux Linux, Windows
VirtualBox / VMware virtuelle Maschine Linux, macOS, Windows verschiedene