Nella precedente puntata abbiamo accennato alle problematiche che comporta l’adozione del paradigma del Cloud Native in larga misura derivate dell’inevitabile complessità che un’architettura a Microservizi può implicare.
Kubernetes (più in breve K8s) è uno strumento che consente di affrontare al meglio il percorso di transizione al Cloud Native.
Più avanti, esamineremo com’è fatto Kubernetes, quali funzionalità garantisce e perché è così diffuso e utilizzato. Iniziamo subito con qualche accenno alla sua genesi e al suo excursus storico.
K8s tra passato e presente
Il termine greco “Kubernetes” significa timoniere oppure pilota: da qui il simbolo del timone presente nel suo logo.
K8s affonda le sue radici in un sistema di cluster di container chiamato Borg, ideato da Google attorno al 2003 per proprie necessità interne.
Una decina di anni più tardi, l’antenato di Kubernetes si potenzia ed evolve nel sistema Omega. Nel 2014, Google decide di rendere pubblico Omega “donandolo alla comunità”: in collaborazione con la Linux Foundation, viene lanciato Kubernetes, rilasciando la prima versione nel 2015. Allo sviluppo del progetto si aggiungono poi importanti soggetti contributori come Microsoft, RedHat, IBM e Docker.
Proprio da Kubernetes nasce anche la Cloud Native Computing Foundation (CNCF), concepita con la missione di sponsorizzare progetti nativi per il cloud.
Il 2016 è l’anno della consacrazione di K8s. Lo sviluppo della soluzione procede a ritmi sostenuti con numerosi rilasci, progetti complementari come Helm e Minikube e iniziative che stimolano ed espandono la comunità, come KubeCon.
Nel 2017 la soluzione è già matura: si aggiungono importanti attori alla comunità e sono disponibili le prime piattaforme gestite da hyperscaler (AWS, Azure, GCP).
L’adozione si espande su scala globale e incrementa inesorabile negli anni successivi: oggi K8s è considerato uno dei progetti open-source più significativi e di successo della storia.
Com’è fatto Kubernetes?
K8s è sostanzialmente un cluster composto da nodi. Un nodo è un host, nella forma di server fisico o di macchina virtuale:
I nodi sono di due tipologie ognuna con compiti differenti. I nodi Worker sono quelli che eseguono i container, i nodi Control Plane (o master) gestiscono i nodi Worker e tutto quanto accade nel cluster.
In funzione del ruolo, ogni nodo è costituito da una serie di componenti, anch’essi container, che svolgono le diverse funzioni come la schedulazione dei container, la loro esecuzione, il monitoraggio, la registrazione degli eventi e dei servizi e la loro risoluzione DNS, le comunicazioni di rete, il database, le comunicazioni API e più nel dettaglio:
In sostanza, Kubernetes è un orchestratore: gestisce le attività di orchestrazione aiutandosi con entità logiche, denominate oggetti o risorse, ognuno specificatamente pensato per svolgere una determinata funzione.
Gli oggetti sono definiti dagli amministratori in fase di deploy, associati da K8s a un identificativo univoco, poi collegati a un dato workload (il container).
Ne esistono decine di tipologie, ma le risorse fondamentali quasi sempre presenti a supporto di un workload sono:
Infine, vi è il collante che unisce tutte le entità del cluster tra loro, cioè le API.
Le API sono probabilmente l’elemento che più contraddistingue K8s, sono pervasive, tutti componenti interagiscono tra loro tramite API, la struttura degli oggetti di gestione è costituita da API, il cluster si amministra e si gestisce attraverso API.
Una sorta di sistema nervoso molto capillare che trasmette e riceve impulsi nella forma di API.
Cosa fa un Orchestratore?
Abbiamo visto che Kubernetes è sostanzialmente un cluster di sistemi computazionali che eseguono le applicazioni in modo resiliente: un orchestratore. Le funzioni fondamentali di un sistema di orchestrazione di container sono:
- Eseguire e distribuire i container su larga scala quindi su più sistemi computazionali;
- Allocare dinamicamente le risorse richieste da ogni carico di lavoro, posizionando i container nel posto ideale;
- Monitorare i carichi di lavoro e mantenerne lo stato desiderato;
- Gestire lo storage dei dati;
- Rilevare i servizi di rete dei container, esponendoli attraverso un nome DNS o un indirizzo IP;
- Bilanciare il carico di lavoro, cioè i flussi di traffico, su più container in base all’utilizzo;
- Automatizzare rollout e rollback, a fronte di modifiche nella distribuzione il sistema ritorna automaticamente alla situazione precedente qualora qualcosa non dovesse funzionare;
- Scalare orizzontalmente, a fronte di picchi di utilizzo si aumenta la capienza computazionale aggiungendo in modo automatico ulteriori sistemi;
Dinamismo ed automazione sono le caratteristiche peculiari di una piattaforma di orchestrazione Cloud Native.
Perché Kubernetes?
Un ambiente di produzione in cui proliferano centinaia o migliaia di container, basato su un singolo host, non è plausibile; occorre un sistema distribuito che si astragga dall’infrastruttura fisica sottostante, che semplifichi l’esecuzione di applicazioni containerizzate su larga scala e che garantisca che non vi siano momenti di inattività.
Kubernetes si occupa della scalabilità e del failover, fornisce modelli di distribuzione e altro ancora. La resilienza nell’esecuzione delle applicazioni è sicuramente uno dei principali punti di forza, ma esistono ulteriori motivazioni che spiegano perché la tecnologia Kubernetes sia cosi abilitante.
- È Facile. “Dichiaratività” e “Auto-riconciliazione” sono due caratteristiche che rappresentano al meglio il concetto di facilità di K8s: la prima fa riferimento alla puntuale descrizione dello stato che una risorsa deve assumere, senza dover entrare nel merito delle configurazioni di più basso livello del sistema che la esegue; l“Auto-riconciliazione”, invece, non è altro che il controllo automatico che riporta una risorsa allo stato desiderato quando il suo stato reale tende a divergere. Due fattori che fanno parte di un sistema complesso e, secondo alcuni, difficile da “maneggiare”; tuttavia, considerando come e in che scala K8s opera, la prospettiva di facilità appare chiara: le tante funzionalità e i tanti aspetti in cui si muove “per nostro conto” ci conducono verso molteplici vantaggi diretti in termini di gestione e operatività.
- È consistente. Grazie all’approccio Full API la gestione è omogenea e uniforme ovunque lo si utilizzi (on-prem, cloud, ibrido). Le cose si fanno sempre nello stesso modo indipendentemente dalla dimensione e dalla complessità dell’ambiente.
- Ecosistema e comunità in continua crescita. La galassia K8s è costituita da un grande numero di sviluppatori e di soluzioni collaterali. Le aziende utilizzano sempre più massicciamente Kubernetes alimentando l’ecosistema e la comunità.
Ma il gioco vale la candela?
Le aziende intenzionate a modernizzare i propri workload, trasformando le proprie applicazioni monolitiche in microservizi sono molto attratte dalle architetture cloud native, ma al tempo stesso sono preoccupate dell’impegno che la gestione comporterebbe.
Seppur Kubernetes sia uno strumento articolato e complesso, rimane la piattaforma più potente e completa per realizzare e gestire applicazioni moderne.
Grazie alle piattaforme PaaS, cioè cluster gestiti, offerte dagli hyperscaler e con il supporto di partner certificati e specializzati, il percorso di adozione di questa tecnologia da parte delle aziende diventa decisamente più sostenibile.