I container Linux sono in circolazione da un po' di tempo, ma sono diventati ampiamente disponibili quando sono stati introdotti nel kernel Linux nel 2008. I container sono componenti di applicazioni leggere ed eseguibili che combinano il codice sorgente dell'app con le librerie del sistema operativo e le dipendenze necessarie per eseguire il codice in qualsiasi ambiente. Inoltre, offrono tecnologie di confezionamento e distribuzione delle applicazioni, sfruttando al contempo l'isolamento delle applicazioni con la flessibilità dei metodi di distribuzione basati su immagini.
I contenitori Linux utilizzano gruppi di controllo per la gestione delle risorse, spazi dei nomi per l'isolamento dei processi di sistema, SELinux Security per abilitare la tenancy sicura e ridurre le minacce o gli exploit alla sicurezza. Queste tecnologie forniscono un ambiente per produrre, eseguire, gestire e orchestrare i container.
L'articolo è una guida introduttiva agli elementi principali dell'architettura dei container Linux, al confronto tra i container e la virtualizzazione KVM, i container basati su immagini, i container docker e gli strumenti di orchestrazione dei container.
Architettura del contenitore
Un container Linux utilizza elementi chiave del kernel Linux come cgroups, SELinux e namespace. Gli spazi dei nomi garantiscono l'isolamento dei processi di sistema mentre i cgroup (gruppi di controllo), come suggerisce il nome, vengono utilizzati per controllare le risorse del sistema Linux. SELinux viene utilizzato per assicurare la separazione tra host e container e tra singoli container. Puoi utilizzare SELinux per abilitare la multi-tenancy sicura e ridurre il potenziale di minacce e exploit alla sicurezza. Dopo il kernel, abbiamo l'interfaccia di gestione che interagisce con altri componenti per sviluppare, gestire e orchestrare i container.
SELinux
La sicurezza è un componente critico di qualsiasi sistema o architettura Linux. SELinux dovrebbe essere la prima linea di difesa per un ambiente container sicuro. SELinux è un'architettura di sicurezza per sistemi Linux che offre agli amministratori di sistema un maggiore controllo sull'accesso all'architettura del tuo container. Puoi isolare i contenitori del sistema host e gli altri contenitori l'uno dall'altro.
Un ambiente container affidabile richiede che un amministratore di sistema crei criteri di sicurezza personalizzati. I sistemi Linux forniscono diversi strumenti come podman o udica per la generazione di policy di container SELinux. Alcuni criteri del contenitore controllano il modo in cui i contenitori accedono alle risorse host come unità di archiviazione, dispositivi e strumenti di rete. Tale criterio renderà più resistente l'ambiente del tuo container contro le minacce alla sicurezza e creerà un ambiente che mantenga la conformità alle normative.
L'architettura crea una separazione sicura che impedisce ai processi root all'interno del container di interferire con altri servizi in esecuzione all'esterno di un container. Ad esempio, un sistema assegna automaticamente a un container Docker un contesto SELinux specificato nella politica SELinux. Di conseguenza, SELinux sembra sempre essere disabilitato all'interno di un container anche se è in esecuzione in modalità di applicazione sul sistema operativo host o sul sistema.
Nota:la disattivazione o l'esecuzione di SELinux in modalità permissiva su una macchina host non separerà in modo sicuro i container .
Spazi dei nomi
Gli spazi dei nomi del kernel forniscono l'isolamento del processo per i contenitori Linux. Consentono la creazione dell'astrazione delle risorse di sistema in cui ciascuna appare come un'istanza separata per i processi all'interno di uno spazio dei nomi. In sostanza, i container possono utilizzare le risorse di sistema contemporaneamente senza creare conflitti. Gli spazi dei nomi includono la rete, il montaggio, gli spazi dei nomi UTS, gli spazi dei nomi IPC, gli spazi dei nomi PID.
- Gli spazi dei nomi di montaggio isolano i punti di montaggio del file system disponibili per un gruppo di processi. Altri servizi in uno spazio dei nomi di montaggio diverso possono avere viste alternative della gerarchia del file system. Ad esempio, ogni contenitore nel tuo ambiente può avere la propria directory /var.
- Spazi dei nomi UTS:isola il nome del nodo e gli identificatori di sistema dei nomi di dominio. Consente a ciascun container di avere un nome host e un nome di dominio NIS univoci.
- Gli spazi dei nomi di rete creano l'isolamento di controller di rete, firewall e tabelle IP di routing. In sostanza, puoi progettare un ambiente container per utilizzare stack di rete virtuale separati con dispositivi virtuali o fisici e persino assegnare loro indirizzi IP univoci o regole iptable.
- Gli spazi dei nomi PID consentono ai processi di sistema in contenitori diversi di utilizzare lo stesso PID. In sostanza, ogni container può avere un processo di inizializzazione univoco per gestire il ciclo di vita del container o inizializzare le attività di sistema. Ogni contenitore avrà la propria directory /proc univoca per monitorare i processi in esecuzione all'interno del contenitore. Nota che un container è a conoscenza solo dei suoi processi/servizi e non può vedere altri processi in esecuzione in diverse parti del sistema Linux. Tuttavia, un sistema operativo host è a conoscenza dei processi in esecuzione all'interno di un container.
- Spazi dei nomi IPC:isolano le risorse di comunicazione tra processi di sistema (System V, oggetti IPC, code di messaggi POSIX) per consentire a contenitori diversi di creare segmenti di memoria condivisa con lo stesso nome. Tuttavia, non possono interagire con i segmenti di memoria di altri contenitori o con la memoria condivisa.
- Spazi dei nomi utente:consente a un amministratore di sistema di specificare gli UID host dedicati a un container. Ad esempio, un processo di sistema può avere privilegi di root all'interno di un container ma allo stesso modo non essere privilegiato per operazioni al di fuori del container.
Gruppi di controllo
I cgroup del kernel consentono la gestione delle risorse di sistema tra diversi gruppi di processi. I Cgroup allocano il tempo della CPU, la larghezza di banda della rete o la memoria di sistema tra le attività definite dall'utente.
Contenitori VS virtualizzazione KVM
Sia i container che le tecnologie di virtualizzazione KVM presentano vantaggi e svantaggi che guidano il caso d'uso o l'ambiente da implementare. Per cominciare, le macchine virtuali KVM richiedono un proprio kernel mentre i container condividono il kernel host. Pertanto, uno dei principali vantaggi dei container è l'avvio di più container rispetto alle macchine virtuali che utilizzano le stesse risorse hardware.
Contenitori Linux
Vantaggi | Svantaggi |
---|---|
Progettato per gestire l'isolamento delle applicazioni containerizzate. | L'isolamento del contenitore non è allo stesso livello della virtualizzazione KVM. |
Le configurazioni o le modifiche dell'host a livello di sistema sono visibili in ogni contenitore. | Maggiore complessità nella gestione dei container. |
I contenitori sono leggeri e offrono una scalabilità più rapida della tua architettura. | Richiede ampie competenze di amministratore di sistema nella gestione dei registri, dati persistenti con la giusta autorizzazione di lettura e scrittura. |
Consente una rapida creazione e distribuzione di applicazioni. | |
Facilita la riduzione dei costi operativi e di archiviazione per quanto riguarda lo sviluppo e l'approvvigionamento delle immagini dei container. |
Campi di applicazione:
- Architettura dell'applicazione che richiede un'ampia scalabilità.
- Architettura di microservizi.
- Sviluppo di applicazioni locali.
Virtualizzazione KVM
Vantaggi | Svantaggi |
---|---|
KVM consente l'avvio completo di sistemi operativi come Linux, Unix, macOS e Windows. | Richiede un'amministrazione estesa dell'intero ambiente virtuale |
Una macchina virtuale guest è isolata dalle modifiche dell'host e dalle configurazioni di sistema. Puoi eseguire diverse versioni di un'applicazione sull'host e sulla macchina virtuale. | La configurazione di un nuovo ambiente virtuale può richiedere più tempo, anche con gli strumenti di automazione. |
L'esecuzione di kernel separati offre maggiore sicurezza e separazione. | Costi operativi più elevati associati alla macchina virtuale, all'amministrazione e allo sviluppo delle applicazioni |
Cancella allocazione delle risorse. |
Campi di applicazione:
- Ambienti di sistema che richiedono chiare risorse di dedizione.
- Sistemi che richiedono un kernel in esecuzione indipendente.
Contenitore basato su immagini
I contenitori basati su immagini creano pacchetti di applicazioni con stack di runtime individuali, rendendo i contenitori sottoposti a provisioning indipendenti dal sistema operativo host. In sostanza, puoi eseguire diverse istanze di un'applicazione, ciascuna su una piattaforma diversa. Per rendere possibile tale architettura, devi distribuire ed eseguire il container e il runtime dell'applicazione come immagine.
Un'architettura di sistema composta da contenitori basati su immagini consente di ospitare più istanze di un'applicazione con un sovraccarico e una flessibilità minimi. Consente la portabilità dei container che non dipendono da configurazioni specifiche dell'host. Le immagini possono esistere senza contenitori. Tuttavia, un contenitore deve eseguire un'immagine per esistere. In sostanza, i contenitori dipendono dalle immagini per creare un ambiente di runtime per eseguire un'applicazione.
Contenitore
Un contenitore viene creato in base a un'immagine che contiene i dati di configurazione necessari per creare un componente attivo che viene eseguito come un'applicazione. L'avvio di un contenitore crea un livello scrivibile sopra l'immagine specificata per memorizzare le modifiche alla configurazione.
Immagine
Un'immagine è un'istantanea statica dei dati di configurazione di un container in un momento specifico. È un livello di sola lettura in cui puoi definire tutte le modifiche alla configurazione nel livello più scrivibile in alto. Puoi salvarlo solo creando una nuova immagine. Ogni immagine dipende da una o più immagini principali.
Immagine piattaforma
Un'immagine della piattaforma non ha un genitore. È invece possibile utilizzarlo per definire l'ambiente di runtime, i pacchetti e le utilità necessari per l'avvio e l'esecuzione di un'applicazione containerizzata. Ad esempio, per lavorare con i contenitori Docker, estrai un'immagine della piattaforma di sola lettura. Eventuali modifiche definite si riflettono nelle immagini copiate impilate sopra l'immagine Docker iniziale. Successivamente, crea un livello dell'applicazione che contiene librerie e dipendenze aggiunte per l'applicazione containerizzata.
Un contenitore può essere molto grande o piccolo a seconda del numero di pacchetti e dipendenze inclusi nel livello dell'applicazione. Inoltre, è possibile un'ulteriore stratificazione dell'immagine con software e dipendenze di terze parti indipendenti. Pertanto, da un punto di vista operativo, possono esserci molti livelli dietro un'immagine. Tuttavia, i livelli vengono visualizzati solo come un contenitore per un utente.
Contenitori Docker
Docker è un ambiente virtuale containerizzato per sviluppare, mantenere, distribuire e orchestrare applicazioni e servizi. I container Docker offrono meno spese generali per la configurazione o l'impostazione di ambienti virtuali. I contenitori non hanno un kernel separato e vengono eseguiti direttamente dal sistema operativo host. Utilizza spazi dei nomi e gruppi di controllo per utilizzare le risorse del sistema operativo host in modo efficiente.
Un'istanza di un contenitore esegue un processo in isolamento senza influire sulle altre applicazioni. In sostanza, ogni app containerizzata ha file di configurazione univoci.
Un demone Docker consente ai contenitori di eseguire il ping indietro e alloca le risorse a un'app containerizzata a seconda di quanto deve essere eseguita. A differenza di un container Linux (LXC), un container docker è specializzato nella distribuzione di singole applicazioni containerizzate. Funziona in modo nativo su Linux ma supporta anche altri sistemi operativi come macOS e Windows.
Vantaggi chiave dei container Docker
- Portabilità:– Puoi distribuire un'app containerizzata in qualsiasi altro sistema su cui è in esecuzione un Docker Engine e la tua applicazione funzionerà esattamente come quando l'hai testata nel tuo ambiente di sviluppo. In qualità di sviluppatore, puoi condividere con sicurezza un'app Docker senza dover installare pacchetti o software aggiuntivi indipendentemente dal sistema operativo utilizzato dai tuoi team. Docker va di pari passo con il controllo delle versioni e puoi condividere facilmente le applicazioni containerizzate senza interrompere il codice.
- I container possono essere eseguiti ovunque e su qualsiasi sistema operativo supportato come Windows, VM, macOS, Linux, on-premise e nel cloud pubblico. La diffusa popolarità delle immagini Docker ha portato a un'ampia adozione da parte di provider cloud come Amazon Web Services (AWS), Google Compute Platform (GCP) e Microsoft Azure.
- Prestazioni:– I container non contengono un sistema operativo che crea un footprint molto più piccolo rispetto alle macchine virtuali e sono generalmente più veloci da creare e avviare.
- Agilità:– Le prestazioni e la portabilità dei container consentono a un team di creare un processo di sviluppo agile che migliora le strategie di integrazione continua e distribuzione continua (CI/CD) per fornire il software giusto al momento giusto.
- Isolamento:– Un container Docker con un'applicazione include anche le versioni pertinenti di eventuali dipendenze e software richiesti dall'applicazione. I container Docker sono indipendenti l'uno dall'altro e altri container/applicazioni che richiedono versioni diverse delle dipendenze software specificate possono esistere nella stessa architettura senza problemi. Ad esempio, garantisce che un'applicazione come Docker MariaDB utilizzi le sue risorse solo per mantenere prestazioni di sistema coerenti.
- Scalabilità:– Docker ti consente di creare nuovi contenitori e applicazioni su richiesta.
- Collaborazione:– Il processo di containerizzazione in Docker consente di segmentare un processo di sviluppo dell'applicazione. Consente agli sviluppatori di condividere, collaborare e risolvere rapidamente qualsiasi potenziale problema senza la necessità di una revisione massiccia, creando un processo di sviluppo conveniente e che fa risparmiare tempo.
Orchestrazione del contenitore
L'orchestrazione dei container è il processo di automazione della distribuzione, del provisioning, della gestione, della scalabilità, della sicurezza, del ciclo di vita, del bilanciamento del carico e del networking di servizi e carichi di lavoro containerizzati. Il vantaggio principale dell'orchestrazione è l'automazione. L'orchestrazione supporta un processo di sviluppo DevOps o agile che consente ai team di sviluppare e distribuire in cicli iterativi e rilasciare nuove funzionalità più rapidamente. Gli strumenti di orchestrazione più diffusi includono Kubernetes, Amazon ECR Docker Swarm e Apache Mesos.
L'orchestrazione del contenitore implica essenzialmente un processo in tre fasi in cui uno sviluppatore scrive un file di configurazione (YAML o JSON) che definisce uno stato di configurazione. Lo strumento di orchestrazione esegue quindi il file per ottenere lo stato di sistema desiderato. Il file YAML o JSON in genere definisce i seguenti componenti:
- Le immagini del contenitore che compongono un'applicazione e il registro delle immagini.
- Fornisce un container con risorse come lo spazio di archiviazione.
- In terzo luogo, definisce le configurazioni di rete tra i container.
- Specifica la versione dell'immagine.
Lo strumento di orchestrazione pianifica la distribuzione dei contenitori o delle repliche dei contenitori nell'host in base alla capacità della CPU disponibile, alla memoria o ad altri vincoli specificati nel file di configurazione. Dopo aver distribuito i contenitori, lo strumento di orchestrazione gestisce il ciclo di vita di un'app in base a un file di definizione del contenitore (Dockerfile). Ad esempio, puoi utilizzare un Dockerfile per gestire i seguenti aspetti:
- Gestire la scalabilità verso l'alto o verso il basso, l'allocazione delle risorse, il bilanciamento del carico.
- Mantieni la disponibilità e le prestazioni dei container in caso di interruzione o carenza di risorse di sistema.
- Raccogliere e archiviare i dati di registro per monitorare lo stato e le prestazioni delle applicazioni containerizzate.
Kubernetes
Kubernetes è una delle piattaforme di orchestrazione di container più popolari utilizzate per definire l'architettura e le operazioni delle applicazioni cloud-native in modo che gli sviluppatori possano concentrarsi sullo sviluppo del prodotto, sulla codifica e sull'innovazione. Kubernetes ti consente di creare applicazioni che si estendono su più container, pianificarle in un cluster, ridimensionarle e gestirne l'integrità e le prestazioni nel tempo. In sostanza, elimina i processi manuali coinvolti nella distribuzione e nella scalabilità delle applicazioni containerizzate.
Componenti chiave di Kubernetes
- Cluster:un piano di controllo con una o più macchine/nodi di calcolo.
- Piano di controllo:una raccolta di processi che controlla diversi nodi.
- Kubelet:funziona sui nodi e garantisce che i container possano essere avviati ed eseguiti in modo efficiente.
- Pod:un gruppo di contenitori distribuiti su un singolo nodo. Tutti i contenitori in un pod condividono un indirizzo IP, un nome host, un IPC e altre risorse.
Kubernetes è diventato lo standard del settore nell'orchestrazione dei container. Fornisce funzionalità di container estese, presenta una comunità di contributori dinamica, è altamente estensibile e portabile. Puoi eseguirlo in un'ampia gamma di ambienti come on-premise, pubblico o cloud e utilizzarlo efficacemente con altre tecnologie di container.
Conclusione
I container sono componenti dell'applicazione leggeri ed eseguibili costituiti da codice sorgente, librerie del sistema operativo e dipendenze necessarie per eseguire il codice in qualsiasi ambiente. I container sono diventati ampiamente disponibili nel 2013 quando è stata creata la piattaforma Docker. Di conseguenza, troverai spesso utenti nella comunità Linux che utilizzano container Docker e container in modo intercambiabile per fare riferimento alla stessa cosa.
Esistono diversi vantaggi nell'utilizzo dei contenitori Docker. Tuttavia, non tutte le applicazioni sono adatte per l'esecuzione in container. Come regola generale, le applicazioni con un'interfaccia utente grafica non sono adatte per l'uso con Docker. Pertanto, i microservizi containerizzati o le architetture serverless sono essenziali per le applicazioni cloud-native.
L'articolo ha fornito una guida introduttiva ai contenitori in Linux, alle immagini Docker e agli strumenti di orchestrazione dei contenitori come Kubernetes. Questa guida si baserà sull'utilizzo di container, Docker Engine e Kubernetes, in cui uno sviluppatore può imparare a sviluppare e condividere applicazioni containerizzate.