La virtualizzazione è l’uso di un computer per emulare un altro computer. Più precisamente indica un processo in base al quale il software viene utilizzato per creare un livello di astrazione sull’hardware del computer che consente di suddividere gli elementi hardware di un singolo computer in più computer virtuali (siano essi PC, client o server).
Il termine virtuale deriva dall’ottica, in cui le immagini riflesse negli specchi o nei punti focali delle lenti venivano considerate come la copia capovolta dell’oggetto riflesso. Nel campo dell’informatica, il termine virtuale è stato adottato sin dall’inizio degli anni ’60 per riferirsi ai sistemi che simulavano macchine o dispositivi. Molto probabilmente il primo utilizzo del concetto di virtualizzazione nell’informatica sembra essere stato nel progetto M44 / 44X presso presso l’IBM Yorktown Research Center.
Ma è dalla fine degli anni 90 che il sistema di virtualizzazione comincia ad essere sfruttato in modo più esteso, anche dovuto al fatto che i moderni personal computer diventavano sempre più piccoli e performanti e che il costo della tecnologia diventava sempre più abbordabile rispetto agli anni passati.
Nascono corsi le prime macchine virtuali, in grado di gestire ed emulare, attraverso un “motore” software chiamato hypervisor, degli “ambienti” isolati (cioè indipendenti dal sistema operativo dell’host) con sistemi operativi diversi, condividendo le risorse di una singola macchina a seconda di come è configurato a livello software. Il principale vantaggio per l’utente finale è quello di avere la disponibilità di diversi sistemi operativi emulati gestiti completamente all’interno di una finestra di un software di virtualizzazione.
Gli innegabili vantaggi nel mondo dei server (server bare metal) perchè attraverso l’hypervisor, le singole risorse vengono distribuite su più macchine virtuali tra loro indipendenti ottimizzando l’efficienza circa l’uso delle risorse disponibili.
L’avvento del cloud: cosa cambia?
Cosa succede però se ciascun utente a cui è assegnata una VM si limita ad utilizzare una singola applicazione? Raramente un’applicazione consuma tutte le risorse messe a disposizione della VM. Di conseguenza, le restanti risorse, configurate in fase di pianificazione e distribuzione della capacità della VM, non verranno utilizzate. Ciò porta a un grosso svantaggio delle VM: pianificazione imprecisa e notevole spreco di risorse, anche se la virtualizzazione è stata sviluppata specificamente per ottimizzare l’utilizzo e la distribuzione delle risorse hardware all’interno di un data center. Purtroppo, ogni VM include un’immagine separata di un sistema operativo, che aggiunge overhead in memoria e spazio di archiviazione.
Per ovviare a questi problemi si è pensato allora di virtualizzare a livello della singola applicazione, anziché virtualizzare a livello hardware. Nascono cosi i Container.
I container sono un modo più leggero per gestire la virtualizzazione. Invece di avviare un’intera macchina virtuale, un contenitore racchiude tutto il necessario per eseguire un piccolo software. Il contenitore include tutto il codice, le sue dipendenze e persino il sistema operativo stesso. Ciò consente alle applicazioni di essere eseguite quasi ovunque: un computer desktop, un’infrastruttura IT tradizionale o il cloud. I contenitori utilizzano una forma di virtualizzazione del sistema operativo (OS). In parole povere, sfruttano le funzionalità del sistema operativo per isolare i processi e controllare l’accesso dei processi a CPU, memoria e spazio sulla scrivania. I container esistono da decenni, ma l’opinione comune è che l’era dei container moderni sia iniziata nel 2013 con l’introduzione di Docker e successivamente di Kubernetes.
Container e VM: quali sono le differenze?
Nella virtualizzazione tradizionale, un hypervisor residente si un Host virtualizza l’hardware fisico. Il risultato è che ogni macchina virtuale contiene un sistema operativo guest, una copia virtuale di un hardware preconfigurato che il sistema operativo richiede per l’esecuzione e un’applicazione e le relative librerie e dipendenze associate. La VM che viene eseguita sull’hypervisor è spesso chiamata guest.
La macchina virtuale contiene tutti gli elementi necessari per eseguire applicazioni, tra cui:
- Computing
- Conservazione
- Memoria
- Networking
- Funzionalità hardware disponibile come sistema virtualizzato
Nei container, invece, non virtualizzano l’hardware sottostante, ma virtualizzano il sistema operativo (tipicamente Linux) in modo che ogni singolo contenitore contenga solo l’applicazione e le sue librerie e dipendenze. I contenitori sono piccoli, veloci e portabili perché, a differenza di una macchina virtuale, non è necessario che i contenitori includano un sistema operativo guest in ogni istanza e possono invece semplicemente sfruttare le funzionalità e le risorse del sistema operativo host.
i contenitori, come le VM, consentono di migliorare l’utilizzo della CPU e della memoria delle macchine fisiche, ma vanno oltre, perché consentono di implementare architetture di microservizi, in cui i componenti dell’applicazione possono essere distribuiti e scalati in modo più granulare.
Perchè usare i contenitori?
Nonostante le VM riescano in larga parte a soddisfare i bisogni degli utenti, i container forniscono maggiore flessibilità per il mondo multicloud, cioè l’uso di più cloud. Infatti, se è vero che un’azienda potrebbe eseguire le proprie applicazioni sul proprio cloud privato, è anche vero che un domani potrebbe dover usare un cloud pubblico e non conoscere i luoghi in cui l’applicazione verrà distribuita. La containerizzazione delle applicazioni fornisce ai team la flessibilità di cui hanno bisogno per gestire i numerosi ambienti software dell’IT moderno.
Certo, non è tutto rose e fiori: forse il più grande svantaggio dei container è la loro mancanza di sicurezza. Diverse aziende hanno subito incidenti di sicurezza specifici nei container, poichè, come in tutti i sistemi informatici, esistono le solite vulnerabilità di sicurezza: bug, scarsa autenticazione e autorizzazione e persino configurazione errata. La potenziale superficie di attacco è molto ampia.
Inoltre, le applicazioni aziendali di grandi dimensioni potrebbero includere un gran numero di contenitori. La gestione di questi contenitori presenta alcuni seri problemi: come avere visibilità su cosa è in esecuzione e dove? Come gestire problemi quali sicurezza e compatibilità? Come monitorare costantemente le applicazioni? Per questo motivo più aziende stanno coinvolgendo DevOps e SecOps fin dall’inizio del progetto.
Il crescente interesse nella tecnologia di containerizzazione, sta portando ad un rapido cambiamento negli ambienti Cloud. Si stima (Gartner) che più di due terzi delle aziende eseguiranno almeno 2 applicazioni containerizzate. Nel 2019, quel numero era inferiore al 20%.
Conclusione
Le macchine virtuali e i contenitori consentono di virtualizzare applicativi in diversi modi:
- i contenitori forniscono un modo per virtualizzare un sistema operativo in modo che più carichi di lavoro possano essere eseguiti su una singola istanza del sistema operativo
- le VM virtualizzano l’hardware per eseguire più istanze del sistema operativo
La velocità, l’agilità e la portabilità dei container ne fanno un ulteriore strumento per semplificare lo sviluppo del software.