Cos’è LXD? Gestione dei contenitori con Linux Container Daemon

LXD, “Linux Container Daemon”, è uno strumento di gestione per i container del sistema operativo Linux. È stato sviluppato da Canonical, l’azienda dietro Ubuntu Linux; Canonical ha proseguito lo sviluppo di LXD fino a oggi e gestisce il progetto.

LXD è una tecnologia affine a LXC, i “Linux Containers”. LXC è una tecnologia di virtualizzazione basata su contenitori a livello di sistema operativo. Tecnicamente, LXC combina gli spazi dei nomi isolati e i “cgroups” del kernel Linux per creare ambienti isolati per l’esecuzione del codice. Storicamente, LXC è stato anche la base per Docker, la tecnologia di virtualizzazione ampiamente utilizzata.

Uno degli obiettivi fondamentali nello sviluppo di LXD è stato quello di rendere la gestione dei contenitori LXC tanto pratica quanto lo è per le macchine virtuali. Tuttavia, rispetto all’utilizzo di una macchina virtuale, l’approccio basato su contenitori fornisce prestazioni più elevate.

Utilizzando LXD, i contenitori del sistema operativo Linux possono essere configurati e controllati tramite un set di comandi definito. LXD è quindi adatto per l’automazione della gestione di molteplici container e viene utilizzato nel cloud computing e nei data center.

Quali sono le caratteristiche di LXD?

  • Sicurezza: i contenitori funzionano in spazi di nomi (namespace) isolati e possono accedere solo a risorse definite.
  • Scalabilità: LXD consente di gestire singoli contenitori sul proprio portatile e migliaia in ambienti distribuiti.
  • Usabilità intuitiva: LXD fornisce un’API semplice e chiara e un client a riga di comando.
  • Basato su immagini Linux: LXD funziona con qualsiasi immagine Linux e quindi beneficia delle molte distribuzioni Linux esistenti.
  • Controllo sofisticato delle risorse: le restrizioni sono impostate per un contenitore per CPU, memoria, uso della rete, della memoria di massa e delle risorse del kernel.
  • Accesso all’hardware del sistema: se la configurazione lo consente, i contenitori possono accedere anche a dispositivi USB, GPU e supporti di archiviazione di massa.
  • Gestione della rete: con una configurazione apposita si possono creare bridge e tunnel di rete.
  • Gestione dello spazio di archiviazione di massa: LXD supporta vari back end, pool e volumi di spazio di archiviazione.

Quali sono i vantaggi e gli svantaggi di LXD?

Il vantaggio principale di LXD è quello di consentire la virtualizzazione di un sistema operativo Linux completo sulla base di contenitori. Così facendo, LXD combina il comfort delle macchine virtuali con le prestazioni dei contenitori.

A differenza della maggior parte dei casi d’uso basati su Docker, LXD non si concentra sulla virtualizzazione di una singola applicazione (“virtualizzazione delle applicazioni”). Piuttosto, un’immagine di sistema Linux serve come base di ogni contenitore LXD (“virtualizzazione del sistema”). Ciò risulta vantaggioso per l’amministratore, in quanto fornisce l’accesso a un gran numero di distribuzioni Linux liberamente disponibili e permette l’utilizzo di una vasta gamma di strumenti esistenti.

Tuttavia, LXD ha uno svantaggio rispetto ad altre tecnologie di virtualizzazione: poiché tutti i contenitori che girano su un host accedono allo stesso kernel Linux, il demone LXD è disponibile solo su Linux. Inoltre, LXD può virtualizzare Linux solo come sistema operativo guest, mentre il client a riga di comando funziona anche su sistemi operativi non Linux.

L’API REST del demone LXD è accessibile attraverso la rete. Ciò consente di spostare o copiare i contenitori tra le macchine. Inoltre, LXD supporta la creazione di cluster di macchine che combinano molte unità di calcolo individuali in un supercomputer virtuale.

Come funziona LXD?

Il componente principale di LXD è il demone privilegiato che dà il nome al sistema host di Linux. Il demone LXD fornisce un’API REST tramite un socket Linux locale. Il demone è accessibile anche attraverso la rete tramite le impostazioni di configurazione. In pratica, LXD accede a LXC sotto forma di back end attraverso la libreria liblxc e i suoi go binding.

Un client interagisce con il demone tramite l’API REST. L’API definisce un linguaggio con il quale si possono creare, controllare e modificare i contenitori. Il client più semplice è la riga di comando ufficiale. Il client a riga di comando fornisce comandi per molte operazioni comuni e accede internamente all’API REST.

Per maggiore chiarezza, di seguito vi riportiamo alcuni comandi LXD di base. Non confondetevi: il nome della riga di comando LXD è lxc e non lxd. Potete provare i comandi senza dover installare la riga di comando sul vostro sistema, ma semplicemente usando l’interfaccia web del progetto linuxcontainers.org.

# Per visualizzare i comandi e le opzioni di LXD
lxc
# Per visualizzare le immagini esistenti di Ubuntu pagina per pagina
lxc image list ubuntu: | less
# Per avviare un’istanza di Ubuntu 18.04 come contenitore a cui è stato dato il nome “Ubuntu” 
lxc launch images:ubuntu/18.04 ubuntu
# Per elencare i contenitori creati
lxc list
# Per visualizzare la configurazione del contenitore a cui è stato dato il nome “Ubuntu”
lxc config show ubuntu 
# Per visualizzare le informazioni del contenitore a cui è stato dato il nome “Ubuntu” 
lxc info ubuntu

Quando e in quale contesto si utilizza LXD?

In linea di principio, LXD si può installare su qualsiasi sistema Linux moderno. Viene utilizzato sia su computer privati che su piattaforme di cloud computing e nei data center distribuiti. In questo modo, LXD mira principalmente a virtualizzare un sistema operativo Linux completo e duraturo nel tempo. LXD è di conseguenza in contrasto con Docker, che si concentra maggiormente su contenitori di breve durata che incapsulano una singola applicazione. Di seguito riportiamo le parole dello sviluppatore di LXD Stéphane Graber:

Citazione

“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, fonte: https://stgraber.org/2016/03/11/lxd-2-0-introduction-to-lxd-112/

Traduzione:

“Questi contenitori sono tipicamente longevi e basati su un’immagine standard del sistema Linux. I tradizionali strumenti di gestione della configurazione e di distribuzione possono essere utilizzati con i contenitori LXD, proprio come accade con macchine virtuali, istanze cloud e macchine fisiche.

Al contrario, Docker si concentra su contenitori effimeri, senza stato e minimali, che non vengono aggiornati o riconfigurati ma completamente sostituiti. Docker e progetti analoghi sono quindi più simili a un meccanismo di distribuzione di software che a uno strumento per la gestione delle macchine.” (Traduzione di IONOS)

Il client a riga di comando fornito è adatto per il controllo di pochi contenitori; non è perciò progettato per gestire molti container distribuiti su più host. In casi simili si utilizzano i collegamenti alle piattaforme OpenStack e OpenNebula.

Quali sono i componenti di LXD?

I componenti principali di LXD sono il già menzionato demone, l’API REST integrata e il client a riga di comando. Di seguito, esamineremo le entità primarie utilizzate quando si lavora con LXD.

Contenitori

Il contenitore (container in inglese) è l’astrazione di base fornita da LXD. Un contenitore LXD include le seguenti caratteristiche:

  • Un file system Linux
  • Impostazioni di configurazione come limiti delle risorse, variabili d’ambiente, opzioni di sicurezza, ecc.
  • Dispositivi di archiviazione di massa e di rete
  • Profili di configurazione da cui il contenitore eredita le impostazioni
  • Proprietà generali come l’architettura del contenitore, il nome e informazioni sulla durata del contenitore
  • Stato di esecuzione come il throughput di rete, l’utilizzo della memoria, ecc.

Istantanee

Come è comune con altre tecnologie di virtualizzazione, da un contenitore si possono creare snapshots (in italiano: “istantanee”). Uno snapshot è identico al contenitore sottostante. Le istantanee sono immutabili, quindi non si possono modificare; si possono solo rinominare e cancellare. Da uno snapshot è possibile ripristinare lo stato esatto di un contenitore.

Immagini

Sebbene LXD sia una tecnologia basata su contenitori, per crearli viene utilizzata un’immagine di sistema Linux. Per definizione, ogni contenitore LXD proviene da un’immagine.

Le immagini sono di solito distribuzioni Linux non modificate, in quanto vengono utilizzate anche per macchine virtuali o istanze cloud. Un’immagine è identificata in modo univoco dal relativo hash SHA256. Per consentire un’assegnazione più agevole per gli utenti in carne e ossa, è possibile definire un alias per un’immagine.

Le immagini Linux da utilizzare con LXD sono reperibili online da varie fonti. I seguenti server di immagini sono predefiniti in LXD:

  • ubuntu: fornisce immagini Ubuntu stabili.
  • ubuntu-daily: fornisce ogni giorno build di immagini di Ubuntu.
  • images: fornisce una varietà di immagini di altre distribuzioni Linux ed è gestito direttamente dalla community.

Le immagini scaricate dal demone LXD vengono automaticamente memorizzate nella cache in modo che siano disponibili per un uso ripetuto senza ritardi. Se non diversamente configurato, LXD controlla la versione delle immagini scaricate e ricarica le nuove versioni, se necessario. Analogamente a quanto avviene con il software Vagrant, è possibile utilizzare LXD per pubblicare un contenitore esistente come nuova immagine.

Profili

Un profilo LXD raggruppa varie impostazioni di configurazione del contenitore. Si può applicare un profilo a più contenitori e più profili a un contenitore. Infine, viene importata la configurazione del contenitore locale. Durante questo processo, i valori di configurazione definiti più volte possono essere sovrascritti. In questo modo è facile creare famiglie di contenitori. LXD viene fornito con due profili già esistenti:

  • Il profilo predefinito default è applicato automaticamente a un contenitore, a meno che non sia specificato un profilo alternativo. Questo profilo include impostazioni di configurazione di base, come il dispositivo di rete eth0.
  • Il profilo docker viene utilizzato per configurare un contenitore LXD che include i container Docker. Questo profilo fa sì che il contenitore LXD carichi i moduli del kernel necessari e configuri le impostazioni del dispositivo. Inoltre, viene attivata la nidificazione dei contenitori.

Remotes

LXD è un demone di rete: il client a riga di comando può comunicare con diversi server LXD e server di immagini remoti. Con una configurazione apposita, diversi server si possono definire come remotes (in italiano: “remoti”). In questo modo, si possono copiare e spostare i contenitori esistenti tra server LXD; inoltre, è possibile accedere ai server di immagini tramite remotes. Oltre ai server di immagini già introdotti nel paragrafo “Immagini”, il client a riga di comando dispone già del remote ‘local’, utilizzato per comunicare con il demone locale LXD tramite un socket UNIX.

Quali sono le alternative a LXD?

Oggi esiste un’ampia gamma di tecnologie di virtualizzazione che si possono utilizzare principalmente come alternative a LXD. Queste si differenziano per vari criteri e si possono suddividere approssimativamente in due grandi gruppi: oltre ai tradizionali strumenti di virtualizzazione basati su macchine virtuali (VM), si sono affermate anche le tecnologie basate sui container. LXD si distingue in questo caso e utilizza un approccio ibrido in cui un intero sistema operativo Linux è virtualizzato sulla base di container.

Alcuni strumenti di virtualizzazione richiedono Linux come sistema host, mentre altri funzionano su tutti i principali sistemi operativi. Allo stesso modo, alcuni ambienti di virtualizzazione supportano solo Linux come sistema guest, mentre altri ne supportano, a loro volta, altri completamente diversi. Molte tecnologie basate su container si concentrano principalmente sulla virtualizzazione delle applicazioni, mentre le macchine virtuali sono sempre basate su un sistema operativo completo.

Poiché LXD è basato su LXC, è possibile utilizzare un’installazione LXC “vuota” in alternativa a LXD. In questo caso, tuttavia, potrebbe derivarne un uso meno confortevole. Dato che non viene utilizzato nessun demone senza LXD, la virtualizzazione non può essere controllata attraverso la rete. Inoltre, manca l’API REST come interfaccia uniforme.

Tra i popolari strumenti di virtualizzazione, containerd è probabilmente il più paragonabile a LXD. Così containerd funziona anche come demone che fornisce un’API. Come nel caso di LXD, ciò permette di gestire contenitori attraverso la rete. La tecnologia è integrata in Docker ed è ampiamente utilizzata.

In generale, è consigliabile scegliere la tecnologia appropriata a seconda delle esigenze specifiche. Di seguito una panoramica delle tecnologie di virtualizzazione più utilizzate:

Virtualizzazione Tipo Sistema host Sistema guest
LXD container solo Linux solo Linux
LXC container solo Linux solo Linux
containerd container Linux, Windows vari/app
Docker container Linux, macOS, Windows vari/app
Kubernetes container Linux, macOS, Windows vari/app
KVM macchina virtuale solo Linux Linux, Windows
VirtualBox / VMware macchina virtuale Linux, macOS, Windows vari
Per offrirti una migliore esperienza di navigazione online questo sito web usa dei cookie, propri e di terze parti. Continuando a navigare sul sito acconsenti all’utilizzo dei cookie. Scopri di più sull’uso dei cookie e sulla possibilità di modificarne le impostazioni o negare il consenso.