Kubernetes, sviluppato originariamente nei laboratori Google nel 2014, è un software Open Source per l'orchestrazione di architetture a container volto, tra gli altri obiettivi, a fornire un alto livello di automazione del deployment e un'ottima scalabilità, la proprietà di un sistema di aumentare le sue capacità o ridimensionarle, più o meno automaticamente, in base al variare dei carichi di lavoro.
Come si può vedere da questa definizione molto concisa di Kubernetes, questa piattaforma si colloca a pieno nell'ambito dello sviluppo a container, uno dei paradigmi più diffusi e fondamentali al giorno d'oggi. Vi si pone però con l'ottica di offrire un sistema di orchestrazione. Pertanto, è evidente che per apprezzarne il valore è importante aver ben chiare le risposte ad alcune domande: cosa sono i container? Qual è il loro contributo per sviluppatori e progettisti? Cosa significa orchestrare?
Il veloce excursus che il paragrafo successivo propone cercherà di fornire tutte le risposte.
Dai container all'orchestrazione
Conoscere i container e averne fatto un po' di pratica è fondamentale per sfruttare Kubernetes. In particolare, è importante conoscere Docker, una tecnologia importantissima in questo ambito. Nonostante servirebbe molto più spazio, approcciamo, sinteticamente, anche in queste righe i concetti di base.
Se volessimo eseguire un'applicazione, un programma in un qualsiasi linguaggio creato da noi o da altri, potremmo installarlo nel sistema operativo del nostro computer o magari scegliere di farlo eseguire da una macchina virtuale (un software che finge di essere un macchina fisica tanto da permettere l'installazione al suo interno di un vero sistema operativo).
Altrimenti, potremmo calcare una terza via, quella dei container. Seguendo questo approccio, la nostra applicazione verrebbe "impacchettata" in un prodotto chiamato immagine del container con all'interno tutte le dipendenze ad essa necessarie. Un'immagine rappresenta pertanto il contesto necessario di cui la nostra applicazione ha bisogno per essere eseguita. Un container non è altro che un'immagine in esecuzione.
Per avviarsi velocemente quindi all'uso dei container (prendiamo a riferimento il formato Docker), è importante:
- saper fare il build di un'immagine (in Docker, comando
docker build
). Dopo aver creato una nostra applicazione (ripetiamo, possiamo farlo con qualsiasi linguaggio di programmazione e tecnologia) scriviamo un Dockerfile che costituirà le istruzioni per la costruzione dell'immagine; - l'immagine appena creata sarà disponibile nel sistema locale ma, per la messa in produzione, tipicamente si ricorrerà al suo caricamento (tecnicamente, push) su una sorta di
magazzino condiviso, dall'accesso pubblico o privato a seconda dei casi, detto registry. Il registry più famoso probabilmente è Docker hub, il registry per antonomasia del mondo Docker; - una volta pronta l'immagine, se ne può avviare l'esecuzione (in Docker, comando
docker run
) attivando, in un ambiente isolato e completo, la nostra applicazione all'interno del sistema.
I container si rivelano utilissimi sia per eseguire applicazioni in produzione sia nella vita di tutti i giorni anche a puro scopo di test e sperimentazione. Se, ad esempio, volessimo studiare MySQL, MongoDB o nuove funzionalità di Java o Python - tanto per fare qualche esempio - perché installare sempre tutto nella propria macchina di lavoro?
Potremmo installare solo Docker e richiamare questi ambienti come container direttamente da Docker hub, no?
Soprattutto, i container rivelano il loro valore nella creazione di applicazioni distribuite con necessità di scalabilità e la tendenza ad ampliarsi sempre di più. I container infatti sono il mattone di base delle architetture a microservizi.
Le piattaforme on-line costituite da un unico, grande programma (detto molto spesso "monolite"), difficili da gestire e da suddividere in più gruppi di lavoro e che costringono ad arrestarle
in blocco in caso di manutenzione, stanno passando di moda. Un'applicazione, per grande che possa essere, può venire suddivisa in tanti servizi molto specifici (i microservizi, appunto) dove ognuno di essi è rappresentato da un container.
Ogni container potrà essere sviluppato in un linguaggio differente a seconda delle necessità, saprà comunicare con gli altri via rete, potrà essere assegnato ad un gruppo di lavoro diverso anche molto piccolo, potrà essere aggiornato con la periodicità che richiede.
Se la via progettuale che piace tanto al giorno d'oggi vede quindi le applicazioni costituite da molti container, è fondamentale che questi vengano sviluppati singolarmente ma gestiti nel loro complesso da un'unica mano. Già, tool come Docker Compose permettono di scrivere rapide configurazioni per il lancio di applicazioni multi-container ovvero composte ma molti container.
Quando si vuole però mettere in piedi servizi e carichi di lavoro imponenti con applicazioni complesse automatizzandone ogni aspetto, è necessario ricorrere ad una piattaforma di orchestrazione come Kubernetes.
La dimostrazione del suo successo (parliamo di uno dei progetti Open Source più diffusi al mondo e con una delle community più attive) è la sua presenza in tutte le principali piattaforme Cloud, pensiamo ad esempio a Amazon Web Services, Google Cloud Platform e Azure.
Kubernetes può essere definito come il giusto punto di incontro tra i container come strumento di sviluppo e l'elasticità che è alla base del Cloud
Come procediamo
Il nostro studio di Kubernetes sarà molto pratico e ci poterà a conoscere tutti gli aspetti salienti di questa piattaforma. In particolare, scopriremo:
- come avere a disposizione un ambiente di sperimentazione di Kubernetes da installare il più velocemente possibile evitando, finché non lo si vorrà, di spendere soldi in servizi Cloud (sono costi che tuttavia possono essere molto contenuti grazie alle policy di pricing del Cloud);
- come funziona la scrittura delle configurazioni in Kubernetes;
- quali sono gli oggetti principali che in esso trovano spazio (Pod, Service, Ingress, etc.) e qual è il ruolo di ognuno di essi nel lancio in produzione di carichi di lavoro;
- come imparare a pianificare un'applicazione per passare da un approccio più tradizionale ad uno votato ai container e alla logica di Kubernetes.
Qui, inizia il nostro viaggio!