Sono passati 5 anni dalla introduzione di Kubernetes da parte di Google, la versione open source del progetto Borg (a sua volta nato nel lontano 2003) e la gestione dei container ne è stata profondamente rivoluzionata.
Kubernetes è consigliato per la gestione di cluster di medie e grandi dimensioni e di applicazioni complesse. Molte organizzazioni ogni giorno lo scelgono, tanto per la sua versatilità quanto per la possibilità di gestione dello sviluppo su larga scala.
Il successo incredibile di Kubernetes (o k8s) affonda le radici nei container.
I container rappresentano spazi utente multipli e isolati direttamente in esecuzione sul livello di sistema operativo. Un container incapsula l’applicazione e tutte le sue dipendenze risultando indipendente dall’architettura sottostante.
Sono utilizzati in alternativa alle macchine virtuali, attraverso una tecnica di virtualizzazione nota come virtualizzazione basata su container.
La differenza fondamentale rispetto all’approccio classico basato sull’utilizzo dell’hypervisor sta nella condivisione del medesimo kernel fra tutti i container in esecuzione.
I vantaggi dei container
Tra i vantaggi dei container, sicuramente possiamo indicare l’isolamento. Infatti, per garantire l’isolamento delle risorse tra il sistema host e i container in esecuzione sullo stesso, viene implementato un meccanismo del kernel noto come namespace.
Questo fa sì che ogni processo abbia una propria visione del sistema, differente da quella degli altri processi. Le risorse sono quindi effettivamente condivise, ma ogni container vede filesystem, memoria, processi e dispositivi come se fossero interamente dedicate a esso.
Al fine di gestire l’accesso alle risorse, i container utilizzano un altro modulo kernel noto come cgroups, che permette sia di limitare l’accesso a CPU, memoria e I/O per alcuni container, sia di fare in modo che essi possano accedervi con maggiore priorità rispetto ad altri.
Anche lo sviluppo risulta agevolato. Un container impacchetta l’applicazione in un singolo componente che può essere distribuito e configurato con una sola linea di comando. Non bisogna quindi preoccuparsi dell’eventuale configurazione dell’ambiente di esecuzione.
Inoltre, uno sviluppatore può ospitare sul proprio computer una quantità enorme di container. Un container è infatti molto più leggero di una macchina virtuale che può arrivare anche a pesare alcuni Gbyte.
L’esecuzione di più macchine virtuali contemporaneamente è comunque possibile.
Tuttavia, questo andrebbe ad impattare pesantemente con le prestazioni del sistema, cosa che non accade invece con i container grazie alla loro dimensione ridotta.
Non solo: dal momento che si virtualizza solo il sistema operativo (non l’intera macchina) il container può essere avviato molto più rapidamente di quanto non sia possibile con una Vm.
Infine, un vantaggio ricorrente in chi propone soluzioni basate su Kubernetes è la portabilità. Di fatto è probabilmente questo il pregio più grande che viene offerto, in virtù del formato che consente l’esecuzione applicativa su diversi host.
Grazie alla standardizzazione è poi facile spostare velocemente i carichi di lavoro lì dove sono eseguiti in maniera più economica e rapida, evitando i problemi di compatibilità legati alle particolari caratteristiche delle singole piattaforme dei provider.
L’utilizzo dei container sta aumentando in maniera vertiginosa, dato che grazie a questa tecnologia è possibile la collaborazione tra diversi team. Tutte le novità che hanno a che fare con i container fanno subito notizia, e tra le parole ricorrenti quando si parla di container c’è sempre più spesso “orchestrazione”.
La necessità di orchestrazione è dettata dal fatto che le applicazioni di produzione si espandono su più container, che devono inoltre essere distribuiti su più server host. La sicurezza per i container è suddivisa in diversi livelli, pertanto può risultare complessa. In questo certo Kubernetes può essere d’aiuto.
Infatti, Kubernetes offre le capacità di orchestrazione e gestione necessarie per distribuire i container, in modo scalabile, al fine di gestire i carichi di lavoro. L’orchestrazione di k8s consente di creare servizi applicativi che si estendono su più container, programmare tali container in un cluster, gestirne la scalabilità e l’integrità nel tempo.
Non solo: Kubernetes deve integrarsi anche con reti, storage, sicurezza, telemetria e altri servizi, per mettere a disposizione un’infrastruttura di container completa.
Indubbiamente, questo dipende dal modo in cui una organizzazione sceglie di gestire i container nel proprio ambiente. Un’applicazione elementare di container Linux si limita a considerare questi ultimi come macchine virtuali efficienti e veloci.
Tuttavia, quando questo avviene in un ambiente di produzione e con numerose applicazioni, si rendono necessari diversi container co-locati che cooperano per fornire i singoli servizi. Ne consegue un aumento della complessità di gestione, data dal proliferare dei container.
Per superare molte delle difficoltà comuni legate alla proliferazione dei container, Kubernetes agisce raggruppandoli in un pod.
I pod aggiungono un livello di astrazione ai cluster di container, aiutando le organizzazioni a programmare i carichi di lavoro e a gestire i servizi necessari (come ad esempio rete e storage) ai container stessi.
Inoltre, Kubernetes agevola il load balancing all’interno dei pod e garantisce l’utilizzo di un numero di container adeguato a supportare i carichi di lavoro.
Quindi, Kubernetes è un sistema di orchestrazione di container. Questo significa che il software non deve creare container, bensì gestirli. Per farlo, Kubernetes si affida all’automazione dei processi, che rende le fasi di test, manutenzione e pubblicazione di applicazioni più facili per gli sviluppatori. L’architettura di Kubernetes consiste in una chiara gerarchia, composta da:
- Container: un container contiene applicazioni e ambienti software.
- Pod: questa unità dell’architettura Kubernetes raccoglie i container che devono lavorare insieme per un’applicazione.
- Nodo: uno o più pod operano su un nodo, che può essere una macchina virtuale o fisica.
- Cluster: in Kubernetes, diversi nodi formano un cluster.
Inoltre, l’architettura Kubernetes si basa sul principio di master e slave. I nodi sono utilizzati come slave, cioè le parti controllate del sistema, che sono sotto la gestione e il controllo del master di Kubernetes.
Uno dei compiti del master è quello di distribuire i pod ai nodi. Il monitoraggio costante permette al master di intervenire non appena un nodo incontra dei problemi e di duplicarlo direttamente per compensare il guasto.
Le condizioni attuali vengono sempre confrontate con le condizioni standard e, se necessario, adattate. Tali processi avvengono automaticamente. Il master è anche il punto di accesso per gli amministratori, che possono poi orchestrare i container.
Sia il master sia i nodi sono caratterizzati da una struttura specifica.
Nodo di Kubernetes
Lo slave (anche noto come minion) è un server (che può essere sia fisico che virtuale) su cui sono attivi uno o più container. Il nodo contiene un ambiente runtime per i container.
Inoltre, è presente ed attivo il servizio Kubelet che consente la comunicazione con il master e avvia e arresta i container.
Per finire, troviamo Kube-proxy: la sua funzione è agire come load balancer, abilitando le connessioni di rete.
Master di Kubernetes
Anche il Master è un server: per offrire tanto il controllo quanto il monitoraggio dei nodi, il Controller Manager lavora sul master.
Questo servizio, a sua volta, combina diversi processi: Il Node Controller controlla i nodi e reagisce in caso di guasto dei nodi, il Replication Controller assicura che il numero impostato di pod funzioni sempre contemporaneamente ed infine l’Endpoints Controller si occupa dell’oggetto endpoint che è responsabile della connessione di servizi e pod.
Accanto al Controller Manager viene eseguito un database chiamato etcd o database key-value, nel quale è memorizzata la configurazione del cluster di cui è responsabile il master. Lo Scheduler consente al master di distribuire automaticamente i pod ai nodi. La connessione al nodo funziona tramite il server API integrato nel master, che fornisce un’interfaccia REST e scambia informazioni con il cluster tramite JSON. Questo permette ai diversi controller, ad esempio, di accedere ai nodi.
Kubernetes e il mercato
Come è facile immaginare, sono innumerevoli le realtà che si cimentano in una sempre più ampia gamma di servizi e soluzioni inerenti all’universo Kubernetes.
Alcuni esempi?
Nutanix si è subito mostrata molto attenta alla tecnologia Kubernetes, e propone ai propri clienti e prospect Karbon, con cui è possibile creare un cluster Kubernetes pronto per la produzione in 20 minuti.
Nutanix sottolinea anche l’affidabilità della propria soluzione grazie anche a monitoraggio centralizzato e upgrade automatici.
Vmware ha di recente annunciato Vmware Tanzu, un nuovo portafoglio di prodotti e servizi per trasformare il modo in cui le aziende sviluppano, fanno girare e gestiscono software su Kubernetes. Con l’acquisizione di Pivotal Vmware amplia ulteriormente il proprio portfolio Kubernetes-based enterprise-grade, dimostrando di credere fermamente in questa tecnologia.
Amazon Web Services non è certo da meno con Amazon Elastic Kubernetes Service. Eks esegue l’infrastruttura di gestione di Kubernetes tra più zone di disponibilità Aws, per eliminare l’errore nel singolo punto.
Elastic Kubernetes Service garantisce compatibilità certificata con Kubernetes, rendendo possibile l’esecuzione di plug-in e tool creati dai partner e dalla community dedicata. Le applicazioni in esecuzione in un ambiente Kubernetes standard sono completamente compatibili e possono essere migrate su Amazon Eks.
Microsoft non ha intenzione di rimanere indietro in questa serrata competizione tecnologica, e offre il servizio Azure Kubernetes.
La soluzione di Microsoft consente di eseguire con facilità la migrazione di un’applicazione esistente in contenitori e l’esecuzione all’interno del servizio Kubernetes gestito da Azure.
È possibile controllare l’accesso tramite l’integrazione con Azure Active Directory e accedere a servizi di Azure basati sul contratto di servizio come Database di Azure per MySQL usando Open Service Broker for Azure.
Sarebbe davvero singolare che proprio Google e la sua piattaforma di cloud pubblico ignorassero Kubernetes. Google Kubernetes Engine rappresenta un ambiente gestito e ready for production, dedicato al deployment di applicazioni containerizzate.
Kubernetes Engine offre rapidità di sviluppo e iterazione delle applicazioni semplificando il deployment, l’aggiornamento e la gestione di applicazioni e servizi.
Oracle offre ai propri clienti il Container Engine for Kubernetes. Si tratta di un servizio container-native e pensato per agevolare gli sviluppatori, e basato sulla tradizionale affidabilità e alta disponibilità offerta dal cloud di Oracle.
Red Hat porta il proprio cappello rosso anche a Kubernetes e lo fa con OpenShift. Si tratta di una piattaforma container per le imprese basata su Kubernetes, e offre operazioni automatizzate in tutto lo stack per gestire deployment di cloud ibridi e multi-cloud.
OpenShift è ottimizzato per incrementare la produttività degli sviluppatori e promuovere l’innovazione.
Infine, citiamo anche un player europeo del settore cloud come Ovh. Managed Kubernetes è basato sulle istanze Public Cloud Ovh e, grazie ai Load Balancer e ai dischi aggiuntivi integrati, permette di ospitare diversi servizi e garantire la totale reversibilità di tutte le attività.
La flessibilità e l’universalità di Kubernetes ne permettono un utilizzo talmente variegato, da rendere di fatto impensabile fare un elenco anche solo approssimativo dei player attivi su questa tecnologia. Le società che abbiamo scelto di citare sono la prova evidente della attenzione riservata dalle più grandi società del settore, e la sensazione netta è che questa tendenza non farà altro che continuare a consolidarsi.