Ultimamente si fa un gran parlare di Flatcar Linux. In realtà è una distribuzione che esiste da molto tempo (anno 2018) e che raccoglie l’eredità di CoreOS, raccogliendone la filosofia, evolvendola e introducendo nuove funzionalità. Noi la utilizziamo da molto lato cloud proprio perché Flatcar, il cui nome completo è Flatcar Container Linux, nasce espressamente per le macchine virtuali e l’utilizzo su sistemi server.
Sorprende un po’ che sia diventata così popolare, almeno a livello mainstream: sebbene nella documentazione ufficiale si riportino anche i link per il download dei file ISO, Flatcar Linux resta infatti un sistema operativo concepito per supportare container e microservizi.
Cos’è Flatcar Linux e a cosa serve
Flatcar Linux è un sistema operativo minimale, leggero e focalizzato sulla sicurezza, sprovvisto di interfaccia grafica e progettato per eseguire carichi di lavoro containerizzati in modo efficiente e affidabile. Rientra inoltre a pieno titolo tra le distribuzioni Linux immutabili: il server basato su Flatcar, una volta configurato, non è più modificabile da niente e da nessuno. Qualsiasi cambiamento richiede la creazione e il deployment di una nuova istanza.
Per dirne una, la posizione /usr
è impostata in sola lettura, impedendo modifiche dirette al sistema operativo. Ciò garantisce una maggiore coerenza e riduce significativamente la superficie di attacco.
D’altra parte, però, Flatcar Linux adotta un meccanismo di aggiornamento automatico che garantisce sempre l’utilizzo di un sistema aggiornato con le ultime patch di sicurezza e miglioramenti, senza intervento manuale.
Perché un sistema operativo per Container?
L’adozione massiccia dei container software negli ultimi anni ha evidenziato la necessità di sistemi operativi specificamente pensati per ospitarli. I sistemi operativi tradizionali spesso includono una vasta gamma di pacchetti e servizi che non sono necessari per l’esecuzione di carichi di lavoro containerizzati, aumentando potenzialmente il consumo di risorse e la superficie di attacco.
Un sistema operativo per container mira a risolvere queste problematiche fornendo un ambiente minimale, sicuro e ottimizzato per l’esecuzione di runtime container come Docker e containerd.
Per comprendere appieno la filosofia di Flatcar, è cruciale familiarizzare con il concetto di “cattle, not pets“. In un’infrastruttura tradizionale, i server sono spesso trattati come “pets“: sono assegnati loro dei nomi, configurazioni specifiche e, in caso di problemi, si tenta di risolvere l’anomalia direttamente sulla macchina.
Al contrario, in uno scenario “cattle“, i server sono entità intercambiabili, progettate per svolgere un compito specifico. In questa situazione, se un server manifesta un problema, la soluzione non è tanto ripararlo, quanto sostituirlo con una nuova istanza. Questa filosofia si sposa perfettamente con il concetto di infrastruttura immutabile.
La storia di Flatcar Linux in breve
Come accennato in precedenza, Flatcar Container Linux è nato nel 2018 come fork del progetto CoreOS Container Linux. E ciò dopo l’acquisizione di quest’ultimo da parte di Red Hat.
Il team di Kinvolk desiderava continuare con l’ideologia di CoreOS e decise di creare un fork, evolvendolo nel corso degli anni. Nel 2021, Kinvolk – realtà tedesca – è stata acquisita da Microsoft, che ha continuato a sviluppare e supportare il progetto Flatcar.
Flatcar Linux è così diventata una delle distribuzioni Linux direttamente supportate da Microsoft Azure (questa pagina parla chiaro…), ottimizzata per l’esecuzione in questo ambiente cloud. Ciò ha contribuito a rendere ancora più facile l’uso di Flatcar nelle infrastrutture cloud-native.
La distribuzione assicura comunque un ampio supporto per diverse piattaforme cloud: basta dare un’occhiata a questa pagina per rendersene conto. È disponibile sui marketplace dei principali provider come AWS, Azure e Google Cloud ma anche presso realtà che non sono propriamente hyperscaler. Il supporto è inoltre continuamente esteso, con l’aggiunta di nuovi provider ogni anno.
Deployment e provisioning con Ignition
Dato che Flatcar è minimale e non include strumenti di gestione della configurazione come Python o Ansible per impostazione predefinita, si utilizza uno strumento chiamato Ignition per la configurazione iniziale. Ignition è un tool eseguito solo al primo avvio di un’istanza di Flatcar. Il suo scopo è configurare la macchina, impostare file system, creare utenti, configurare servizi e preparare il sistema per l’esecuzione dei carichi di lavoro containerizzati.
La configurazione di Ignition è dichiarativa: significa che si descrive lo stato desiderato del sistema e il tool si preoccupa di raggiungere tale stato. Se qualcosa va storto durante il processo di configurazione, l’esecuzione si interrompe e potrebbe essere necessario intervenire per correggere la configurazione. Lo schema seguito è insomma “all-or-nothing“.
Le configurazioni di Ignition sono registrate in formato JSON. Tuttavia, per semplificare la creazione e la gestione delle configurazioni, è disponibile uno strumento chiamato Butane che ha il compito di scrivere le configurazioni in formato YAML, più leggibile e facile da scrivere per molti utenti. In seguito avviene la “traduzione” in formato JSON, comprensibile da Ignition.
Come usare Flatcar Linux
Abbiamo detto che Flatcar Linux non è una distribuzione “per tutti” bensì una soluzione immutabile progettata principalmente per l’utilizzo in ambienti cloud, ad esempio all’interno di macchine virtuali. Facendo riferimento a questa pagina, si trovano le istruzioni per installare Flatcar Linux appoggiandosi ai vari provider cloud oppure in ambienti virtualizzati con QEMU, libVirt, VirtualBox, Vagrant, Hyper-V, KubeVirt: in alcuni casi il supporto è ufficiale, in altri arriva grazie al lavoro della comunità.
Come accennato in apertura, comunque, nulla vieta di scaricare l’immagine ISO (paragrafo Bare Metal) è utilizzarla per effettuare un’installazione tradizionale su macchine fisiche e virtuali.
Docker e systemd-sysext in Flatcar Linux
Al di là delle tante chiacchiere sull’argomento Flatcar Linux, ciò che è importante sapere è che la distribuzione “arriva” con Docker e containerd già preinstallati: basta digitare systemd-sysext
per verificarlo.
Docker e containerd sono strumenti strettamente correlati, ma con ruoli distinti nel mondo della containerizzazione. Docker è una piattaforma completa che semplifica la creazione, gestione e distribuzione di container, fornendo un’interfaccia utente intuitiva (CLI e API) e funzionalità avanzate come orchestrazione, gestione delle reti e registri di immagini. L’uso di Docker su Flatcar è del tutto analogo a quanto accade in altre distribuzioni Linux, ma trae vantaggio dalla natura immutabile e automatizzabile del sistema.
containerd, invece, è un runtime leggero che gestisce il ciclo di vita dei container (creazione, avvio, arresto e distruzione), interagendo direttamente con il kernel del sistema operativo per implementare varie funzionalità cruciali.
Ad esempio, per eseguire un container NGINX:
docker run -d -p 80:80 --name webserver nginx
Il container è isolato dal sistema host e può essere gestito con i soliti comandi Docker (docker ps
, docker logs
, e così via…). Come vedete nell’immagine NGINX risponde subito a una richiesta HTTP inviata al container (in questo caso da un sistema Windows collegato in rete locale).
Flatcar supporta anche l’integrazione con orchestratori come Kubernetes e Nomad: può essere usato come nodo worker o come sistema base per microservizi distribuiti.
Problema: come estendere un sistema immutabile in modo modulare?
Come abbiamo scritto in precedenza, l’immagine /usr
in Flatcar Linux non può essere modificata direttamente. Questo significa che non è possibile installare nuovi pacchetti nel modo tradizionale, ad esempio con package manager quali apt
o dnf
.
In questi scenari entra in gioco il già citato systemd-sysext
, uno strumento incluso in systemd che consente di montare estensioni modulari nel filesystem immutabile in maniera temporanea o permanente, senza alterare l’immagine base.
In questa pagina di supporto trovate molti spunti rispetto alle estensioni installabili manualmente a livello di sistema.
Esempi di system extension disponibili includono Python, Tailscale, K3s, Docker e driver NVIDIA. La creazione e la manutenzione delle system extension sono in parte gestite dal team di Flatcar e in parte dalla comunità.
Processo di aggiornamento e strategie di reboot
Una volta scaricato un aggiornamento, il sistema si adopera per applicarlo. In caso di problemi con il nuovo aggiornamento, Flatcar è progettato per effettuare un rollback alla versione precedente funzionante, garantendo la continuità dei carichi di lavoro.
Sebbene l’aggiornamento automatico sia la modalità predefinita e raccomandata, è possibile interrompere o controllare il processo di aggiornamento tramite la configurazione di Ignition.
Tuttavia, è importante notare che Flatcar è un sistema operativo in continua evoluzione: fermare gli aggiornamenti per periodi prolungati potrebbe portare a problemi di sicurezza o compatibilità in futuro. Non è possibile effettuare il backport di una versione precedente: il sistema si muove sempre in avanti.
Flatcar Linux implementa inoltre diverse strategie di reboot configurabili, garantendo che il riavvio per l’applicazione degli aggiornamenti avvenga in modo controllato e possibilmente coordinato.
Conclusioni
Flatcar Linux rappresenta una soluzione matura e affidabile per l’esecuzione e la gestione di attività basate su container. La sua enfasi sull’immutabilità, la sicurezza e gli aggiornamenti automatici lo rende una scelta ideale per ambienti di produzione moderni.
Il nome Flatcar deriva dal termine inglese che indica un vagone ferroviario piatto, privo di pareti o tetto, utilizzato per trasportare carichi pesanti e standardizzati, come container o macchinari industriali. È una metafora coerente con la filosofia della distribuzione, concepita per essere minimale e stabile, adatta per “caricare” (deployare) container in modo efficiente, sicuro e standardizzato.
Il riferimento al “vagone piatto” riflette l’idea di un sistema operativo essenziale, costruito per essere solido, immutabile e per “trasportare” i workload (i container) ovunque, su qualunque infrastruttura cloud o fisica.
Il continuo sviluppo, il forte coinvolgimento della comunità, la compatibilità con una vastissima schiera di piattaforme, testimoniano l’impegno per rendere Flatcar un elemento chiave nell’ecosistema cloud-native.