Kubernetes: cos’è e come funziona la piattaforma per il deployment in container
Da ormai qualche anno, Kubernetes (K8s) è una delle tecnologie più chiacchierate dell’universo IT ma, considerando che le applicazioni moderne vengono sempre più spesso sviluppate in microservizi, la cosa non ci stupisce affatto. Kubernetes è infatti la piattaforma per eccellenza per il deployment e l’orchestrazione delle applicazioni containerizzate.
Sviluppata da Google e rilasciata come progetto open source nel 2014, K8s è il frutto dei 15 anni di esperienza del colosso americano nell’esecuzione dei carichi di lavoro containerizzati e dei contributi di una community open source ogni giorno più ampia.
Kubernetes permette di automatizzare il deployment e la gestione delle applicazioni, contribuendo alla resilienza dei servizi IT.
Cos’è Kubernetes
Kubernetes è una piattaforma open source per la gestione di carichi di lavoro e di servizi containerizzati che permette di semplificare la configurazione dichiarativa e automatizzare il deployment, la gestione e la scalabilità delle applicazioni containerizzate. Insomma, uno strumento che permette agli sviluppatori e amministratori di sistema di gestire le applicazioni in un ambiente distribuito.
In, greco antico, il termine Kubernetes significa letteralmente“timoniere” o “pilota”. In effetti, Kubernetes si occupa si trasportare e consegnare in sicurezza, appunto, i container nei luoghi in cui possono essere utilizzati.
Diretta evoluzione di Borg, il sistema per il cluster management progettato da Google, Kubernetes nasce per semplificare la gestione delle varie operazioni sui container e per orchestrare l’intera infrastruttura in modo veloce, efficiente e performante. Permette infatti di eliminare molti dei processi manuali tradizionalmente coinvolti nel deployment automatizzando le attività operative di orchestrazione dei container e semplificando il ridimensionamento, la gestione e il monitoraggio delle applicazioni containerizzate.
Un salto nella storia del deployment
Ma da dove nasce l’esigenza di uno strumento con cui gestire e automatizzare il deployment in container?
Per capirlo, diventa necessario fare un passo indietro nel tempo e ripercorrere la storia del deployment a partire dalla sua forma tradizionale.
Deployment tradizionale attraverso server fisici
Un tempo, tutte le organizzazioni eseguivano le applicazioni su server fisici. Questo modello di deployment tradizionale, però, ha un grande difetto: non consente di definire in partenza quante risorse allocare per ogni singola applicazione eseguita su quello specifico server.
Ad esempio, ipotizziamo che su un server fisico girino diverse applicazioni e che una di queste finisca per assorbire la maggior parte delle risorse disponibili sottraendole alle altre, magari a seguito di un picco di richieste. Che cosa accade alle altre applicazioni? Non potendo contare su risorse a sufficienza per funzionare a dovere, finiscono così per essere compromesse sia in termini di funzionalità sia di performance.
Per ovviare a questo problema è chiaro che la soluzione ideale sarebbe eseguire ogni applicazione su un server fisico diverso. Ma se dal punto di vista teorico non ci sono controindicazioni, dal punto di vista pratico le cose si complicano. Per l’organizzazione si tratterebbe di affrontare i costi di gestione e manutenzione di numerosi server fisici, che tra l’altro vedrebbero le loro risorse costantemente sottoutilizzate.
Deployment virtualizzato attraverso virtual machine
Per risolvere i problemi associati al deployment tradizionale su server fisici è stata introdotta la virtualizzazione, ovvero un livello di astrazione, segregazione e controllo degli asset.
La virtualizzazione permette di eseguire più virtual machines (o macchine virtuali, MV) su una singola CPU fisica, isolando così le applicazioni in più MV e fornendo un livello di sicurezza superiore, considerando che le informazioni di un’applicazione non sono liberamente accessibili da un’altra applicazione.
Isolando le applicazioni all’interno di guest che risiedono sul medesimo computer fisico (l’host), la virtualizzazione consente non solo di ottimizzare l’uso delle risorse e ridurre i costi per l’hardware, ma anche di ottenere un importante vantaggio aggiuntivo: la scalabilità di ogni applicazione, che può essere aggiunta o aggiornata in modo semplicissimo.
La macchina virtuale esegue tutti i componenti, compreso il sistema operativo, sull’hardware virtualizzato e le risorse vengono distribuite dinamicamente tra i sistemi guest (le macchine virtuali) secondo le necessità applicative assicurandone un corretto bilanciamento.
Deployment in container attraverso container
Ad oggi, il deployment che sfrutta la containerizzazione rappresenta un importante passo avanti rispetto alle virtual machines.
I container, di per sé simili alle macchine virtuali, hanno un modello d’isolamento più leggero, sono più portabili e facili da gestire poiché condividono il sistema operativo ma non sono legati all’infrastruttura sottostante. I container, infatti, virtualizzano solo l’ambiente di runtime necessario all’esecuzione delle applicazioni funzionando in qualsiasi ambiente di sviluppo, test o produzione. Proprio perché disaccoppiati dall’infrastruttura sottostante, i container risultano portabili tra differenti Cloud e diverse distribuzioni, favorendo l’utilizzo delle architetture a microservizi.
Come funziona Kubernetes: glossario
Come per ogni tecnologia, anche quando si tratta di Kubernetes è fondamentale prendere familiarità con alcune delle componenti alla base della sua architettura come:
- Master: macchina che controlla i nodi e permette di allocare dinamicamente i container in base alle risorse disponibili e i parametri predefiniti;
- Nodi: macchine controllate dal sistema master che eseguono le attività richieste;
- Pod: gruppo di uno o più container che risiedono sullo stesso nodo e condividono perciò l’indirizzo IP, IPC, nome host e altre risorse. Astraendo la rete e lo storage dal container sottostante, i pod permettono di spostare i container nei cluster con maggior facilità;
- Kubelet: agente software eseguito sui nodi che legge i manifesti del container e garantisce l’avvio e l’esecuzione dei container definiti;
- Piano di controllo: insieme dei processi che controllano i nodi.
Kubernetes offre la possibilità di distribuire i container in modo agevole e scalabile e di gestire al meglio i carichi di lavoro.
Possiamo immaginare un deployment Kubernetes suddiviso in due parti: il piano di controllo da un lato e i nodi dall’altro.
Ogni nodo è un ambiente autonomo che esegue i pod (ovvero gli insiemi di container) mentre il piano di controllo decide, con l’obiettivo di mantenere la condizione target del cluster, quali applicazioni eseguire. Il piano controllo Kubernetes riceve i comandi dall’amministratore (o dal team DevOps) e si occupa di inoltrare le istruzioni ai sistemi di elaborazione.
Il lavoro dell’utente, insomma, si limita alla configurazione di Kubernetes e alla definizione di nodi, pod e container. È poi la piattaforma K8s stessa ad occuparsi dell’orchestrazione dei container, individuando il nodo più adatto alle attività, allocando le risorse e assegnando i pod di quel nodo per completare il lavoro richiesto.
A cosa serve Kubernetes: i vantaggi
Ora che abbiamo ripercorso brevemente la storia del deployment, possiamo concludere che i container sono un’ottima soluzione per distribuire ed eseguire le applicazioni, assicurandosi che non si verifichino interruzioni dei servizi.
Ma mantenere le applicazioni in container attive e in esecuzione può essere complesso, soprattutto considerando che all’interno delle infrastrutture IT aziendali possono arrivare a circolare container anche nell’ordine di decine di migliaia.
Kubernetes nasce proprio per “guidare” l’intero ecosistema dei container, garantendo scalabilità, failover e distribuzione efficiente delle risorse.
Kubernetes permette di:
- Automatizzare le operazioni: Kubernetes consente di gestire molte attività operative associate alla gestione delle applicazioni in modo automatizzato, assicurandosi nel contempo del corretto funzionamento delle applicazioni;
- Bilanciare il carico: se il traffico verso un container è alto, K8s è in grado di garantire servizi sempre efficienti grazie alla ridistribuzione del traffico su più container in base alla domanda;
- Ottimizzare i carichi: l’amministratore può allocare in modo dinamico le risorse istruendo Kubernetes su quanta CPU e RAM necessita ogni singolo container. In questo modo, è K8s ad allocare i container sui nodi per massimizzare l’uso delle risorse a disposizione;
- Gestire informazioni critiche: Kubernetes memorizza, distribuisce e aggiorna le configurazioni e i dati sensibili delle applicazioni come password, token OAuth e chiavi SSH garantendo alti livelli di sicurezza;
- Monitorare l’integrità dei servizi: K8s è in grado di riavviare i container che si bloccano, sostituire i container, terminare i container che non rispondono agli health check e bloccare il traffico in direzione dei container non ancora pronti per rispondere correttamente;
- Garantire coerenza tra gli ambienti: ambiente di sviluppo, test e produzione sono coerenti tra loro poiché i container funzionano allo stesso modo su computer portatile come nel Cloud;
- Ammettere aggiornamenti in sequenza: gli amministratori possono implementare gradualmente nuove versioni di un’applicazione senza tempi d’inattività così da poter aggiornare e mantenere le applicazioni con minime interruzioni per gli utenti;
- Separazione delle fasi Dev e Ops: le container image non vengono prodotte al momento del rilascio ma al momento della compilazione dell’applicativo, permettendo così di disaccoppiare le applicazioni dall’infrastruttura sottostante;
- Supportare la creazione di applicazioni basate su microservizi: le applicazioni, suddivise in blocchi più piccoli e indipendenti, possono essere distribuite e gestite in modo dinamico rendendo la fase di sviluppo più rapida ed efficiente.
Sei alla ricerca di una soluzione software personalizzata? Contatta il team di Beliven!