Container management

Con Kubernetes modernizzazione delle app semplice, veloce e scalabile

Resilienza, sicurezza, semplicità sia lato Ops che Dev: Kubernetes è la piattaforma open source di orchestrazione dei container che sprigiona le loro potenzialità e permette alle aziende di modernizzare le app in modo efficace per gestire al meglio la propria evoluzione senza perdere né tempo né opportunità di business.

17 Nov 2021

Se la containerizzazione ha completamente trasformato le modalità di sviluppo applicativo permettendo maggiore rapidità di deploy, scalabilità e portabilità tra i diversi ambienti, è con l’arrivo di Kubernetes che è diventato davvero possibile beneficiarne a fondo usufruendo di una architettura di container completa e articolata in grado di gestire cluster di medie e grandi dimensioni e applicazioni complesse, anche legacy, modernizzandole in modo veloce e scalabile. La differenza emerge anche dal punto di vista della sicurezza, diventata oggi la priorità per molte aziende, e ciò non fa che rendere questa soluzione una delle più apprezzate sia per l‘alta affidabilità (HA) sia per gli elevati SLA (Service Level Agreement) ma anche per la ampiezza crescente del suo ecosistema di strumenti di supporto open source e per la portabilità attraverso i principali cloud provider.

Cos’è Kubernetes

Kubernetes è una delle più note piattaforme di orchestrazione di container, è open source e favorisce e semplifica l’application management e l’application modernization consentendo di automatizzare molti processi necessari per il deployment, la gestione e la scalabilità delle applicazioni containerizzate, legacy e cloud native, distribuendole poi su vasta scala, sia in ambienti di cloud privati che pubblici.

Grazie all’adozione dei container, sviluppatori e team operativo possono procedere parallelamente dedicandosi rispettivamente alle app e all’infrastruttura, ma è con Kubernetes che la gestione dei deployment in ambiente enterprise diventa realmente più semplice ed efficace, con evidenti vantaggi sia in termini che di costi e performance a livello aziendale.

 

Le origini di Kubernetes

Se nel suo nome c’è l’Antica Grecia – in greco antico Kubernetes significa “timoniere” o “pilota” – nel suo logo, nei sette raggi del timone che vi è raffigurato, si può invece riconoscere un cenno alla celebre saga di Star Trek perché fanno riferimento al progetto Seven of Nine, nome di uno dei protagonisti del film ma anche della prima bozza proprio di Kubernetes. Questa piattaforma è infatti nata come ulteriore sviluppo di Borg, il cluster manager adoperato internamente da Google: il suo team di ingegneri, notando un forte sottoutilizzo delle CPU in rapporto alle macchine virtuali (VM) da parte di clienti che dovevano sobbarcarsi comunque i costi relativi, aveva infatti deciso di puntare sulla scalabilità, sulla portatilità e sulla efficienza dei container offrendo però anche un efficace sistema per gestirli.

Dal 2015 Kubernetes non è più di Google che, in seguito a un’alleanza con la Linux Foundation, ha deciso di donarlo alla neonata Cloud Native Computing Foundation (CNCF) permettendone quindi l’uso a chiunque vi aderisca, che si tratti di colossi mondiali del public cloud o di startup innovative del settore.

Dalle VM ai container

Facendo un ulteriore, e doveroso, passo indietro, per poi comprendere meglio il ruolo di Kubernetes anche nella modernizzazione delle applicazioni, si può osservare come, quando e soprattutto perché i container hanno preso il posto della macchine virtuali (VM) nel mondo dello sviluppo applicativo, diventando un importante elemento di svolta non solo tecnologica ma anche di business. Le VM hanno avuto il loro momento di gloria tra gli sviluppatori soprattutto appena entrate in gioco, perché permettevano di “consolidare” il parco di installato e di ridurre il numero dei server necessari consentendo di far girare più applicazioni assieme contemporaneamente su un solo sistema fisico per sfruttare meglio le risorse assegnate. Il cloud computing ne ha subito beneficiato ma, una volta sviluppatosi in maniera pervasiva, ha portato anche nuove esigenze che hanno resto la virtualizzazione “tradizionale” inadeguata alle sfide affrontare dalle aziende ogni giorno per mantenere i ritmi del mercato.

A ben guardare, infatti, ogni virtual machine, richiedendo di essere “abitata” da un sistema operativo completo, porta con sé uno spreco di risorse che non può essere tollerato nell’ideale scenario multicloud a cui il mondo sta andando incontro, in cui spostare un’applicazione dovrebbe essere facile e veloce, e finirebbe per frenare tale evoluzione. I container permettono invece di astrarre solamente quella parte di ambiente necessaria alle applicazioni per farle funzionare perché si ha una virtualizzazione vera e propria di tutto il sistema operativo. Kubernetes è uno degli strumenti che permettono oggi di sfruttare al meglio questo notevole passo avanti compiuto con l’introduzione dei container nel mondo dello sviluppo applicativo.

 

La svolta dei container

Offrendo, proprio come le VM, uno spazio isolato di esecuzione, i container condividono un solo sistema operativo riducendo ulteriormente i costi, e permettono di gestire in modo granulare le risorse di calcolo rendendo più fluida l’esecuzione delle applicazioni e semplificando lo sviluppo del software.

Il ruolo che l’hypervisor gioca per le VM, per i container lo ricopre Kubernetes che risponde all’esigenza di un modello per governare automaticamente l’orchestrazione dei container distribuiti in cluster e su più server host e può contare su più di 2.300 contributor, oltre che su una diffusione capillare in diversi angoli del mondo, nei settori più disparati.

Come funziona Kubernetes

Uno dei primi aspetti da chiarire subito è fino a che punto arrivano le competenze di Kubernetes e dove questa piattaforma lascia poi spazio di manovra e libertà di decisione. Dopo infatti aver offerto gli strumenti necessari per orchestrare un’applicazione containerizzata complessa e di grandi dimensioni, legacy o cloud native, il resto è lasciato all’utente. Ciò significa che è suo compito  gestire ruoli e controllare accessi, multi-tenancy e impostazioni di sicurezza predefinite e che è suo diritto scegliere sistema operativo, runtime dei container, strumenti per i flussi di integrazione e distribuzione continue (CI/CD), servizi applicativi, storage e altri componenti.

Questo in una parola significa flessibilità, una delle caratteristiche più apprezzate di Kubernetes da parte delle aziende che lo usano per gestire più agilmente applicazioni containerizzate e modernizzarle se necessario, velocizzando la propria digital transformation.

Una piattaforma di orchestrazione come Kubernetes si occupa della gestione dei singoli server web utilizzati nei container mediante partizioni virtuali dell’hardware del data center consentendo di mantenere il framework elastico per i server web di un data center su base automatizzata negli ambienti di produzione. Tradotto in chiave business, Kubernetes si occupa di scalabilità, failover, distribuzione delle applicazioni offrendo un framework per far funzionare i sistemi distribuiti in modo resiliente. Come? Fornendo tra le altre cose

  • Ottimizzazione dei carichi per massimizzare l’uso delle risorse a disposizione
  • Bilanciamento del carico per distribuire il traffico su più container ed evitare interruzioni di servizio
  • Orchestrazione dello storage per montare automaticamente un sistema di archiviazione a scelta
  • Rollout e rollback automatizzati per raggiungere lo stato dei container desiderato ad una velocità controllata
  • Self-healing per evitare che arrivi traffico ai container che non sono ancora pronti
  • Gestione di informazioni sensibili e della configurazione per minimizzare rischi cyber

 

Quali sono i componenti di Kubernetes

Per eseguire applicazioni containerizzate si usufruisce di cluster Kubernetes, un gruppo di sistemi nodo suddiviso idealmente in due parti: il piano di controllo e i sistemi di elaborazione, o nodi ciascuno dei quali costituisce un ambiente Linux® autonomo – macchina fisica o virtuale – ed esegue pod, composti da container.

 

Componenti del piano di controllo

Generalmente ogni cluster è stato configurato per essere eseguito in un certo modo, il piano di controllo deve garantire che ciò avvenga verificando ad esempio che il numero di container in esecuzione sia sufficiente e che siano disponibili le risorse necessarie. Si tratta di una sorta di centro nevralgico del cluster con tutte quelle componenti di Kubernetes che controllano il cluster e i dati sul suo stato e sulla sua configurazione. Tra queste figurano:

  • kube-APIserver: front end del piano di controllo di Kubernetes, fondamentale per interagire con il cluster e stabilire se le richieste sono valide e quindi vanno elaborate
  • kube-scheduler: per garantire l’integrità del cluster assicurandosi che possa ospitare altri nuovi container, se necessari, e per pianificare il pod in funzione del nodo di lavoro più adeguato
  • kube-controller-manager: raggruppa in un unico controller numerose funzioni di controllo e si fa garante dell’effettiva esecuzione del cluster
  • etcd: l’unica sorgente di dati del cluster, un database con dati e informazioni di configurazione relativi allo stato del cluster.

 

Componenti di un nodo Kubernetes

In ogni cluster Kubernetes ci deve essere almeno un nodo di lavoro, ma generalmente ne sono presenti numerosi ed è proprio su di essi che si eseguono poi i pod pianificati e orchestrati.

Pod: l’unità più piccola e semplice in Kubernetes, costituita da uno o più container a basso livello di accoppiamento e dalle opzioni che controllano le modalità di esecuzione dei container.

Motore di runtime del container: motore per eseguire i container, come ad esempio Docker kubelet: applicazione presente in ogni nodo di lavoro che comunica con il piano di controllo e verifica che i container vengano eseguiti in un pod.

Kube-proxy: proxy di rete presente in ogni nodo che ottimizza i servizi di rete Kubernetes e gestisce le comunicazioni di rete interne ed esterne al cluster.

Altri elementi di Kubernetes

Perché tutto funzioni, all’interno di un singolo cluster devono essere presenti anche altri componenti come

storage permanente: potendo gestire con Kubernetes anche i dati applicativi collegati a un cluster, l’utente può richiedere le risorse di storage senza dover conoscere i dettagli dell’infrastruttura di storage sottostante.

Registro dei container: archivio di tutte le immagini di container

Infrastruttura di base: permette a Kubernetes di essere eseguito su server bare metal, macchine virtuali, provider di cloud pubblico, cloud privato e ambienti ibridi rendendolo compatibile con diverse tipologie di infrastruttura.

Cosa è il deployment Kubernetes

Nel mondo di Kubernetes troviamo anche gli oggetti che indicano al sistema come il carico di lavoro del cluster deve funzionare e, una volta che vengono creati, il cluster agisce per garantirne l’esistenza e per mantenere lo stato desiderato. Uno di questi oggetti è proprio il deployment Kubernetes che ha il compito di fornire aggiornamenti dichiarativi alle applicazioni, descrivendo con completezza il loro ciclo di vita, partendo con il precisare le immagini da utilizzare, il numero di pod necessari e le modalità di aggiornamento relative.

Se realizzato manualmente l’aggiornamento delle applicazioni containerizzate per la loro modernizzazione può richiedere tempo e risorse eccessive, oltre a costituire una potenziale fonte di errori anche solo per la laboriosità della script da compilare. Il risultato è quasi sempre un dannoso rallentamento del processo di release che, con un deployment Kubernetes diventa, invece automatico e ripetibile. Senza interagire con il client, infatti, tale oggetto garantisce l’esecuzione e la disponibilità del numero previsto di pod, in ogni momento, registrando l’aggiornamento in modo da poter eventualmente tornare a precedenti versioni.

Con un deployment Kubernetes è possibile:

  • Eseguire il deployment di un set di repliche o pod
  • Aggiornare i pod e i set di repliche
  • Ripristinare versioni precedenti del deployment
  • Rendere scalabile il deployment
  • Sospendere o continuare il deployment

 

Strategie di application management tramite deployment Kubernetes

Nel prevedere le modalità di aggiornamento dell’applicazione, è possibile scegliere quale strada percorrere. La strategia di incrementale sostituisce i pod progressivamente garantendo la disponibilità costante di un numero minimo perché controlla che non più del 25% sia fuori uso nello stesso momento. In questo modo non si hanno tempi di inattività durante il processo di aggiornamento ma possono verificarsi dei problemi di servizio all’utente. Accade l’opposto con la seconda strategia che, prima di creare nuovi pod attende che tutti quelli esistenti vengano eliminati: nessun problema di servizio ma il rischio di tempi di inattività in questo modo è alto.

Kubernetes: quali vantaggi

L’essenza di questa piattaforma open source si può sintetizzare nel suo essere elastica e automatizzata permettendo così di scalare applicazioni web e mobile app negli ambienti di produzione con livelli elevatissimi di traffico web. Allo stesso tempo se si vuole guardare l’aspetto più di business, è in grado di eliminare la dipendenza dal vendor e può essere supportata dalla maggior parte dei servizi di hosting su public cloud che la offrono a prezzi competitivi all’interno dei loro pacchetti.

Che Kubernetes abbia trasformato il mondo dei container e in generale della app modernization, è evidente, dato che ha reso possibile

  • orchestrare i container su host multipli
  • gestire rapidamente la scalabilità delle applicazioni containerizzate e delle loro risorse
  • sfruttare meglio l’hardware per massimizzare le risorse necessarie per gestire le app
  • controllare e automatizzare i deployment e gli aggiornamenti delle applicazioni
  • gestire in maniera aperta i servizi, garantendo il deployment delle applicazioni secondo le modalità di deployment stabilite
  • montare e aggiungere storage per eseguire app stateful.
  • controllare lo stato di integrità delle applicazioni e gestire le correzioni con posizionamento, riavvio, replica e scalabilità automatici.

Differenza tra Kubernetes e Docker, due finti competitor

E’ quasi impossibile non citare Docker quando si parla di Kubernetes, ma è importante farlo in maniera corretta ovvero non introducendolo come competitor della piattaforma di orchestrazione di container di cui si è parlato finora. Queste due soluzioni non sono affatto confrontabili perché non hanno lo stesso obiettivo e oltretutto intervengono in due momenti differenti dello sviluppo tramite container. Nessuna competizione, quindi, e nessuna scelta da compiere tra i due, anzi, se utilizzate insieme sono in  grado di semplificare e rendere molto più efficace la gestione e l’implementazione di container all’interno di un’architettura distribuita.

Docker è una piattaforma che consente di creare ed eseguire container, nonché di archiviare e condividere le immagini ottenute da tale processo di creazione, ed è quella che ha maggiormente cavalcato l’onda della containerizzazione. Seppur flessibile, user-friendly  e disponibile anche in versione Enterprise, Docker non basta per un utilizzo dei container all’ennesima potenza perché è necessario orchestrarli in modo da migliorare il lavoro dei team di sviluppo anche automatizzando alcuni processi.

E’ a questo punto che entra in gioco Kubernetes che, come altre soluzioni di container orchestration, tra cui Docker Swarm, OpenShift e Mesos, è in grado di automatizzare le funzionalità più “meccaniche”, interagire con diversi gruppi di container contemporaneamente e nel frattempo fornire anche funzionalità di rete, storage, security e metriche. Se si vuole fare un paragone corretto, vanno presi Kubernetes e Docker Swarm ma tra i due non c’è confronto: solo il primo può garantire una vera modernizzazione delle app veloce, semplice e scalabile.

Leader della virtualizzazione, VMware ha inserito Kubernetes nella propria offerta perché, assieme alla containerizzazione, fornisce alcune delle proprietà di base come l’isolamento dei processi e il packaging e l’astrazione delle applicazioni. Se c’è chi di fronte a  problemi di resilienza e disponibilità, sicurezza end-to-end e gestione delle operations ancora da risolvere, ritiene sia opportuno eliminare quello “strato non necessario” che è la virtualizzazione. VMware ha scelto una strada più costruttiva puntando a creare un’infrastruttura “migliore” che li risolva e, integrando Kubernetes nella propria offerta, ha sviluppato delle vere e proprie piattaforme native Kubernetes di livello enterprise che permettono di far funzionare fianco a fianco sia applicazioni moderne basate su container che tradizionali, basate su VM, aumentando la resilienza e la sicurezza dell’azienda e semplificando la vita sia delle operations che del team Dev.

@RIPRODUZIONE RISERVATA

Articolo 1 di 5