Un paradigma sempre più popolare nel panorama dei sistemi enterprise è quello dei microservizi. In un’Architettura IT basata sui microservizi, le applicazioni aziendali vengono spezzate in piccoli componenti indipendenti tra di loro, ad ognuno dei quali è affidata una specifica funzione di business: il disaccoppiamento di questi componenti permette ai sistemi di essere più flessibili e di evolvere con più agilità.
Un’architettura così distribuita necessita però di strumenti e processi che ne garantiscano la governance, e che permettano a sistemi complessi di evolvere garantendo la continuità e l’innovazione del business.
Container e Kubernetes
Tra le tecnologie abilitanti per l’adozione di un’architettura a microservizi, la principale è quella dei container. Un container raccoglie in un unico pacchetto tutte le dipendenze necessarie all’applicazione per funzionare e consente di distribuire il software in modo affidabile e consistente da un ambiente ad un altro, astraendosi dall’infrastruttura sottostante. Un container può essere eseguito sul laptop di uno sviluppatore e poi portato facilmente in un cluster di produzione in cloud.
Il container porta grossi vantaggi in termini di isolamento e portabilità delle applicazioni; tuttavia, è un piccolo tassello del puzzle in un sistema a microservizi in cui la cooperazione tra le applicazioni è fondamentale. Come gestire il deploy e lo scaling dei container? Come connettere più container tra di loro? Come connettere un container al mondo esterno? Come gestire il monitoring e il loro aggiornamento? La risposta è Kubernetes.
Kubernetes (dal greco κυβερνήτης, che significa “timoniere” o “pilota”) è una piattaforma open source per l’orchestrazione di container. Consente di gestire e automatizzare il ciclo di vita di applicazioni containerizzate standardizzando gli aspetti di deploy, scaling e monitoring delle applicazioni. Kubernetes è quindi il capitano di un cluster di server e distribuisce i container al suo interno in maniera automatizzata, assicurandosi che il sistema risponda in modo efficiente ed elastico ai carichi di lavoro richiesti.
Quando usare Kubernetes?
Kubernetes e i container permettono di semplificare la gestione dei (micro)servizi aziendali, affrontando out-of-the-box diverse sfide tipiche dei sistemi distribuiti, come:
- definire un sistema omogeneo di configurazione e deploy in un ecosistema di applicazioni scritte in linguaggi di programmazione diversi;
- ottimizzare i costi delle risorse hardware a disposizione;
- far fronte a carichi di elaborazione variabili e poco prevedibili;
- monitorare un sistema in cui i servizi comunicano via API o servizi di messaging;
- sfruttare l’elasticità dei servizi cloud evitando il più possibile il vendor lock-in.
Kubernetes supporta i team IT nel tenere il passo con i requisiti delle moderne architetture software, portando velocemente le nuove feature in produzione e accelerare il time to market per adattarsi al cambiamento continuo. Vediamo come.
1. Per velocizzare i cicli di sviluppo
Definire degli standard per il deploy e lo scaling delle applicazioni è tanto più complesso quanto più vario è il parco applicativo del sistema.
Grazie ad un approccio “dichiarativo”, Kubernetes permette agli utenti di definire tramite file di configurazione lo stato desiderato del sistema. Di quante repliche del servizio ho bisogno? Che versione del servizio voglio installare nel sistema? Kubernetes monitora costantemente e orchestra i servizi in modo che questo stato venga mantenuto nel tempo anche nel caso del crash di alcuni di questi (il cosiddetto self-healing).
La piattaforma si occupa nativamente anche di aspetti infrastrutturali come il load balancing, l’autoscaling e la service discovery.
Questo permette ai team di sviluppo di concentrarsi sullo sviluppo di feature applicative, automatizzando facilmente, in un ciclo di continuous deployment, le operazioni infrastrutturali che vengono invece delegate nativamente alla piattaforma.
2. Per ottimizzare i costi dell’infrastruttura
Le macchine virtuali sono spesso dimensionate per far fronte anche a picchi improvvisi di carico, ma nei momenti di minor traffico le risorse rimangono di fatto inutilizzate.
Grazie al concetto di POD e label, Kubernetes raggruppa i container in unità logiche facili da gestire e permette di definire per ognuna di esse le risorse necessarie (CPU e RAM) per la loro esecuzione, distribuendo i POD tra i nodi. Se le risorse non sono sufficienti, fornisce la possibilità di scalare orizzontalmente i POD o i nodi del custer per soddisfare i requisiti definiti dagli utenti.
Kubernetes sfrutta quindi le risorse con efficienza e densità:
- per le infrastrutture aziendali on-premise permette di sfruttare meglio le risorse hardware, evitando il cosiddetto over-provisioning;
- installato nel cloud consente un utilizzo ancora più elastico delle risorse, portando a una significativa riduzione dei costi.
3. Per attuare una strategia Multi Cloud
Le moderne piattaforme cloud hanno da tempo introdotto servizi che consentono di costruire applicazioni distribuite scalabili on demand. Queste soluzioni, tuttavia, non risultano sempre portabili e possono limitare l’IT nella scelta del cloud provider che meglio supporterebbe una particolare esigenza del business.
Kubernetes è invece una tecnologia cloud-native in grado di operare su sistemi on-premise, cloud privati, pubblici o ibridi. Le operazioni di gestione del cluster descritte nei paragrafi precedenti – in particolare quelle che coinvolgono applicativi stateless – non cambiano usando un cluster Kubernetes di un cloud provider rispetto ad un altro. Questo comporta una maggiore flessibilità per l’IT e limita il vendor lock-in.
4. Per avere uno standard per il monitoring e l’osservabilità
La community open source ha accolto con entusiasmo l’adozione dei container e continua a supportare numerose estensioni che arricchiscono le funzionalità di Kubernetes. Istio, Prometheus, Jaeger, ELK stack sono alcuni degli strumenti open source che consentono di:
- monitorare le performance dei servizi all’interno di Kubernetes;
- tracciare l’andamento delle chiamate, individuando eventuali colli di bottiglia;
- applicare e distribuire nel sistema regole di sicurezza definite per la comunicazione tra i servizi;
- definire delle policy particolari a supporto di operazioni di rolling-upgrade e A/B testing.
Anche in questo caso, queste operazioni ai astraggono dal tipo di tecnologia scelta per implementare i singoli microservizi, garantendo uno strato infrastrutturale a supporto della governance dell’infrastruttura.
Perché utilizzare Kubernetes?
Passare a Kubernetes non è ovvio: bisogna avere le competenze giuste, formando i team interni all’azienda o avvalendosi di un supporto consulenziale per definire i requisiti della nuova infrastruttura. Gli step di transizione vanno pianificati strategicamente, delineando un percorso che può essere più o meno complesso in base all’infrastruttura IT, ai processi e alle persone.
L’utilizzo di tecnologie cloud native richiede prima di tutto un cambio di mindset nel concepire i sistemi e i processi per la loro gestione. L’adozione di pratiche DevOps e il focus sul cambiamento continuo devono diventare parte integrante nel modo di distribuire il software.
Un passaggio non banale, ma che consente di avere uno strumento valido per guidare la trasformazione digitale della propria azienda con un sistema architetturale moderno a supporto di un business in evoluzione continua.
Vuoi sapere di più su questo tema? Lo abbiamo approfondito nell’evento: “Headless & API date 2020: attuare e governare la trasformazione digitale con le architetture IT”