L’avvento della virtualizzazione nel mondo IT ha consentito dapprima di creare le macchine virtuali (qui una guida completa), poi di virtualizzare direttamente al livello del sistema operativo. Grazie a questa possibilità sono nate tecnologie come i container Linux, del tutto liberi dall’esigenza di virtualizzare la pesante componente hardware, per concentrarsi esclusivamente sulle funzioni utili ad eseguire i microservizi che compongono le applicazioni sviluppate sul cloud con metodologie DevOps.

Questi ambienti di runtime sono appunto più leggeri e agili da gestire come istanze rispetto alle macchine virtuali e possono essere eseguite direttamente come applicazioni sul sistema operativo host. Il problema nasce quando si iniziano a creare decine, centinaia, se non addirittura migliaia di container, distribuiti su servizi in cloud differenti, grazie alla loro innata portabilità. Come è possibile mantenere il controllo su questa incredibile varietà, riuscendo a mantenere la visibilità su tutto ciò che accade sulle nostre applicazioni?

Per dare una risposta a questa domanda, nel 2015 Google ha sviluppato Kubernetes, ispirato a Borg, un software di gestione dei data center dell’azienda di Mountain View. La stessa Google, dopo aver ricevuto importanti contributi al suo sviluppo, ha deciso di rilasciarlo alla neonata Cloud Native Computing Foundation, che tuttora si occupa di coordinare il progetto open source di Kubernetes.

Kubernetes è una piattaforma open source e riceve costanti contributi di sviluppo da parte di aziende come IBM (Red Hat) e Rackspace. Kubernetes alimenta un enorme indotto in termini di business, sia per quanto riguarda l’integrazione che per la distribuzioni di versioni commerciali basate sulla sua tecnologia open source, il tutto mentre una community sempre più ampia contribuisce a vario titolo alla sua crescita tecnologica e diffusione nel mercato dello sviluppo delle applicazioni cloud native.

Secondo il Open Source Job Report 2021, pubblicato da Linux Foundation, le professioni cloud e cointainer, con il 41% sul totale, sono diventate in assoluto le più richieste nel mercato IT relativo alle tecnologie open source, superando per la prima volta Linux. Una svolta epocale, che non fa altro che confermare il sentore diffuso, che ci dice che lo sviluppo di applicazioni cloud native sarà per molti anni il motore del mercato software. Tecnologie di orchestrazione come Kubernetes sono destinate a diventare uno standard sempre più diffuso nelle aziende, necessitando di solidi investimenti per assicurarsi le competenze specifiche. Vediamo più nello specifico in cosa consiste Kubernetes e quali sono i vantaggi che è in grado di garantire se implementato in maniera consapevole.

Cos’è Kubernetes

Kubernetes è una piattaforma open source che viene utilizzata per orchestrare i Container Linux negli ambienti di sviluppo del cloud privato, pubblico e ibrido e, più in generale, per gestire le architetture a microservizi, di cui abbiamo parlato in questa pratica guida. Container e Kubernetes rappresentano ormai di fatto uno standard nello sviluppo delle applicazioni cloud native e le loro tecnologie sono disponibili nell’offerta di tutti i CSP (Cloud Service Providers). Gli sviluppatori e i DevOps engineer utilizzano Kubernetes per automatizzare le operazioni di deploy, scalabilità, manutenzione, pianificazione ed esecuzione di istanze dei container.

Una piattaforma di gestione come Kubernetes risulta fondamentale per una ragione molto semplice. I Container sono eseguiti al livello del sistema operativo, con tutti i vantaggi che ne conseguono in materia di leggerezza e scalabilità. Tuttavia, essi rimangono tra di loro isolati, per cui gli sviluppatori devono utilizzare un software di orchestrazione per ottenere la visibilità di tutti i container attivi presso i vari servizi in cloud. Questo è, in estrema sintesi, il ruolo che viene svolto da Kubernetes.

Kubernetes è disponibile sia in versione open source, piuttosto ostica da interfacciare, che in varie distribuzioni commerciali, che si occupano di rendere l’applicazione core decisamente più intuitiva e fruibile soprattutto per gli aspetti relativi al front-end.

Come funziona

I container vengono eseguiti a livello di sistema operativo su varie macchine host (nodi) su vari servizi in cloud. I container eseguiti su ogni macchina costituiscono un pod. Kubernetes ha il compito di individuare tutti i pod presenti e distribuirli sulle varie macchine host, verificando, attraverso un agente chiamato kubelet, che abbia a disposizione le risorse computazionali per poterli eseguire con successo.

Ogni pod è contrassegnato da un IP univoco, che Kubernetes impiega per assegnarlo al nodo prescelto per l’esecuzione dei suoi container. Attraverso un’ampia gamma di funzioni, è possibile automatizzare la gestione dei container o gestirli manualmente attraverso le API Kubernetes. La varietà di possibili configurazioni è teoricamente infinita.

Vedremo più avanti quali sono i componenti specifici dell’architettura di Kubernetes. In estrema sintesi, ci basti sapere che Kubernetes è composto da cluster, composti da vari nodi (macchine host), che a loro volta sono chiamati a gestire i pod che contengono i container da eseguire.

Questo genere di architettura si associa alla perfezione con i microservizi, in quanto consente di avviare tutti i cluster necessari per automatizzare la gestione di un numero anche molto elevato di container, distribuiti praticamente ovunque nel cloud. Tale visibilità è interfacciata all’utente finale attraverso un’unica dashboard, che consente di monitorare il corretto funzionamento dei container e pianificare tutte le operazioni necessarie per sviluppare e mantenere le applicazioni.

Quali sono i suoi vantaggi

Abbiamo visto come Kubernetes consenta agli sviluppatori di pianificare, eseguire e monitorare i container. La logica operativa di Kubernetes offre una serie di vantaggi essenziali per la capacità di automatizzare i seguenti processi:

  • Deployment: possibilità di creare nuove istanze dei container, oltre a gestire la migrazione da altri ambienti e l’eliminazione di quelli non più necessari;
  • Monitoraggio: feature fondamentale nell’orchestrazione svolta da Kubernetes, che consiste nel garantire la visibilità in tempo reale dei processi eseguiti sui vari servizi in cloud privato, pubblico e ibrido di cui il team di sviluppo si avvale per sviluppare i componenti del software; L’automatizzazione consente di valutare in tempo reale se i container lavorano in modo corretto, di riavviare quelli che si sono per qualsiasi motivo arrestati, oltre a rimuovere quelli che secondo vari criteri non sono più ritenuti necessari nei vari carichi di lavoro previsti;
  • Load Balancing: feature molto utile per ottimizzare le risorse di rete in cloud, grazie alla capacità di distribuire il traffico sulla base delle esigenze dei singoli container, che costituiscono i carichi di lavoro da gestire;
  • Storage: gestione delle operazioni utili all’archiviazione dei container in situazioni di cloud ibrido e multicloud, in modo da soddisfare i requisiti richiesti in maniera del tutto automatizzata;
  • Ottimizzazione: l’analisi del deployment consente di ottimizzare le risorse computazionali in funzione delle esigenze di ogni container, assegnandoli al nodo la cui disponibilità si rivela più prossima al loro soddisfacimento;
  • Sicurezza: gestione automatica di tutti i dati previsti per le autenticazioni: password, token, SSH, ecc.

Quali sono le sue criticità

Quando si tratta di rendere semplice all’utente finale qualcosa di informaticamente complesso per natura, non mancano ovviamente le criticità. Nulla che debba far presagire ad una rinuncia all’impiego di Kubernetes, che per essere utilizzato nel pieno delle sue potenzialità richiede in ogni caso delle competenze specifiche e la relativa esperienza in produzione, indispensabile per gli aspetti legati al problem solving. Occorre infatti considerare che ogni azienda e, ancor più nello specifico, ogni progetto di sviluppo ha le proprie caratteristiche. Per cui è indispensabile acquisire un know-how specifico per ogni situazione, a partire da un’analisi molto accurata. La grande azienda, con decine di sviluppatori impegnati su un progetto, difficilmente avrà le stesse esigenze e, di conseguenza, gli stessi problemi di una piccola realtà. Il che non vuol dire che una realtà abbia più o meno problemi di un’altra, semplicemente si tratta di problemi differenti, da gestire in modo differente. La tecnologia di Kubernetes consente di orchestrare i Container nel migliore dei modi, a patto di implementarla e gestirla nella maniera più opportuna, in funzione di ogni specifica esigenza. Vediamo gli aspetti più comuni.

  • Monitoraggio e visibilità: Kubernetes serve proprio per orchestrare situazioni altrimenti ingestibili, come centinaia di container sparsi in molte piattaforme, disponibili su differenti servizi in cloud. La visibilità garantita da Kubernetes, semplifica la gestione, ma non ne elimina di fatto la complessità oggettiva dei processi in senso stretto. Se si articola un progetto di sviluppo in maniera poco consona, le criticità in termini di sicurezza e performance che certamente ne derivano non possono essere del tutto risolte dalle capacità di orchestrazione di Kubernetes;
  • Scalabilità delle applicazioni: i container possono scalare in modo differente nelle varie condizioni di carico, per cui è opportuno saper bilanciare al meglio i pod e i nodi, operazione non sempre semplice da eseguire;
  • Complessità nella distribuzione: il fatto di distribuire i componenti dell’applicazione su vari container rende molto più flessibile lo sviluppo di un’applicazione, ma ne aumenta al tempo stesso la complessità di gestione. Abusare di questa proprietà può portare ad un’applicazione molto difficile da gestire anche per quanto riguarda lo sviluppo dei singoli componenti, ancor prima di verificare che tutto possa lavorare insieme in maniera coerente e funzionale. L’abilità e l’esperienza di un project manager risiede proprio per gestire e saper bilanciare al meglio questo aspetto.

Le componenti di Kubernetes

Come anticipato, l’elemento principe di Kubernetes è rappresentato dal cluster che si ottiene ogni volta che viene effettuato un deploy. Il cluster consiste in un insieme di nodi che eseguono i container degli utenti. Ogni cluster per avere senso di esistere deve pertanto contenere almeno un Worker Node, gestito da un Control Plane. La logica con cui vengono implementati i cluster è generalmente orientata alla cosidetta high availability, ossia una disponibilità elevata per garantire la maggior continuità di business possibile. Per evitare che il failover di un cluster causi un disservizio nell’orchestrazione dei container che eseguono le applicazioni, vengono dunque utilizzati più Control Plane in contemporanea.

Per utilizzare con successo Kubernetes, oltre ai componenti in senso stretto, sono fondamentali gli add on, come l’interfaccia web (dashboard), il monitoraggio dei container e un log manager per i cluster.

Tra i componenti del Control Plane ritroviamo:

  • kube-apiserver: l’API server di Kubernetes è un componente che fa da front-end al Control Plane ed è progettato per eseguire varie istanze secondo una logica di scalatura orizzontale.
  • etcd: database che consente di salvare tutte le informazioni contenute nel cluster Kubernetes.
  • kube-scheduler: si occupa di assegnare un nodo ai pod secondo una serie di parametri decisionali, come le risorse richieste dai carichi di lavoro, i vincoli in termini di policy, la disponibilità di dati, le interferenze e le scadenze.
  • kube-controller-manager: come il nome stesso suggerisce è un componente chiamato a gestire i controller di Kubernetes. I controller sono processi che vengono raggruppati nei container. Ne esistono di varie tipologie e consentono di gestire i seguenti argomenti: Node Controller, Replication Controller, Endpoints Controller, Service Account e Token Controller.
  • cloud-controller-manager: il ruolo di questo componente consiste nel collegamento del cluster Kubernetes con le API del cloud provider, separando con logiche molto specifiche i componenti che interagiscono con il PaaS con i componenti che interagiscono in maniera esclusiva con il cluster stesso. Come nel caso del kube-controller-manager, anche i vari componenti dedicati al cloud vengono solitamente raggruppati per essere eseguiti come un processo unico, semplificando notevolmente l’operazione. Anche nel caso dei cloud-controller-manager esistono varie tipologie: Node Controller, che elimina dal cloud i nodi che non vengono più eseguiti; i Route Controller, che configurano i percorsi di rete in cloud; i Service Controller, che si occupano di gestire le operazioni dei load balancer del cloud provider (creazione, aggiornamento, eliminazione).

Tra i componenti del Worker Node:

  • kubelet: è un agente che viene eseguito su ogni nodo del cluster per garantire che i container creati da Kubernetes vengano eseguiti da un pod, grazie ad uno specifico set di istruzioni definito PodSpecs.
  • kube-proxy: si tratta di un proxy eseguito su ogni nodo del cluster, per mantenere le regole di networking e permettere la comunicazione verso gli altri nodi presenti nel cluster o verso l’esterno, facendo ricorso alle librerie del sistema operativo, se presenti, o gestendo in autonomia il traffico tra i nodi.
  • container runtime: i software che consentono di eseguire i container. Ne esistono diversi e Kubernetes supporta pienamente Docker, containerd, cri-o, rktlet e in generale tutte le implementazioni basate su Kubernetes CRI (Container Runtime Interface).

Kubernetes e Docker. Le tecnologie open source per la gestione dei container

Il lessico dei container vede spesso Kubernetes affiancato a Docker. Si tratta tuttavia di una differente piattaforma open source, sviluppata a partire dal 2013 che consente di creare e fare il deploy dei container grazie ad un ecosistema di tool il cui scopo è naturalmente quello di semplificare e automatizzare le procedure necessarie. Docker è oggi disponibile praticamente su tutti i principali CSP, a cominciare da AWS e Microsoft Azure. 

A differenza di Kubernetes, l’applicazione core di Docker non si occupa però dell’orchestrazione, anzi, Kubernetes e Docker si completano perfettamente a vicenda. Docker consente infatti di eseguire, creare e gestire i container su un singolo sistema operativo, mentre con Kubernetes è possibile automatizzarli per il provisioning, il networking, il load balancing, la sicurezza e la scalabilità dei carichi di lavoro sui nodi a disposizione. Il tutto grazie ad una unica dashboard.

In tempi più recenti, Docker inc. è stata acquisita da Mirantis, che ha deciso di rilasciare Docker Swarm, un’applicazione stand alone per l’orchestrazione dei container Docker, che possono essere ovviamente anche gestiti grazie allo stesso Kubernetes. Swarm è stato sviluppato per offrire un’alternativa più semplice rispetto a Kubernetes, con meno comandi anche per il fatto di essere concepito per gestire una varietà tecnologica sensibilmente inferiore.

Docker Swarm non costituisce ovviamente l’unica alternativa rispetto a Kubernetes, che vede tra i suoi competitor come Apache Mesos e Jenkins.

Apache Mesos è un cluster manager open source noto per la sua integrazione con tool di Machine Learning come Cassandra, Kafka e Spark. Esiste una distribuzione commerciale piuttosto diffusa, ossia Mesosphere DC/OS, attualmente gestita da D2iQ, brand molto noto per il suo supporto allo stesso Kubernetes.

Jenkins è una piattaforma open source più orientata verso il CI / CD delivery, tipico delle applicazioni cloud native basate sulla metodologia di sviluppo DevOps. Originariamente era una fork di un’applicazione di Oracle, ma è stata in seguito capace di trovare la sua strada sia nella distribuzione open source che nelle distribuzioni commerciali, esattamente come Kubernetes.

Tra queste tecnologie, per quanto concerne l’orchestrazione dei container, Kubernetes rappresenta certamente la più popolare e diffusa sia nella versione open source che per quanto riguarda le sue distribuzioni commerciali, come Red Had OpenShift, Rancher Labs Rancher, CoreOS Tectonic, Amazon Elastic Kubernetes Service, Azure Kubernetes Service e Google Kubernetes Engine. La stessa Mirantis, che attualmente possiede Docker Inc. ha sviluppato un ecosistema basato sulla tecnologia di Kubernetes specifico per l’IoT e i sistemi interconnessi che abilitano le applicazioni e i servizi delle smart city.

Kubernetes: cos’è e come funziona ultima modifica: 2022-03-28T12:20:09+02:00 da Francesco La Trofa

LEAVE A REPLY

Please enter your comment!
Please enter your name here