Sfruttare al massimo Kubernetes con Azure DevOps

di Matteo Tumiati, in DevOps,

Negli articoli precedenti presenti su questo canale abbiamo introdotto quella che è la nuova filosofia che dovrebbe guidare lo sviluppo di qualsiasi tipologia di progetto. Infatti, sia che si tratti di applicazioni "classiche", piuttosto che di applicazioni moderne basate, ad esempio, su micro-services, piuttosto ancora che applicazioni intranet o enterprise, tutti, dagli sviluppatori ai manager di alto livello, si devono adattare a quelli che sono definiti come standard del ciclo di sviluppo moderno, dettati dalle pratiche di DevOps.

Abbiamo già trattato di come Azure DevOps ci aiuti a raggiungere questi standard: tramite Azure Boards possiamo programmare il lavoro ad ogni livello del team, grazie ad una gestione del codice sorgente efficiente possiamo tenere traccia di tutte le modifiche fatte al software e all'infrastruttura (per via di Infrastructure as Code), tramite Azure Test Plan possiamo tenere traccia di tutte le esecuzioni di unit test, test di integrazione, UI test e così via, mentre tramite la parte di build e release management possiamo rilasciare in modo continuo, anche sull'ambiente di produzione, le ultime modifiche fatte sul repository. Quello che ci resta da affrontare è relativo al deployment stesso: come possiamo essere efficienti nel rilasciare il codice?

Kubernetes (o K8s, in seguito), è una piattaforma che ci può venire incontro. Originariamente sviluppato da Google, ora gestito dalla Cloud Native Computing Foundation (CNCF) e supportato da grandi partner come Microsoft, Amazon, IBM, Intel, Cisco, Red Hat e Google stessa, Kubernetes è diventato lo strumento open-source di orchestrazione di container per eccellenza e permette non solo di gestire i container, per l'appunto, ma anche di automatizzare i deployment e la scalabilità degli stessi. Kubernetes rende molto semplice l'orchestrazione delle applicazioni, sia che esse siano classici monoliti, sia che essi siano organizzati con un'architettura basata a micro-services. Come vedremo in questo articolo, però, Kubernetes può essere utilizzato anche per molti altri scopi e si integra perfettamente con Azure DevOps, anche nei punti più impensati.

L'orchestrazione avviene creando un layer di astrazione al di sopra delle macchine host, così che i team di sviluppo possano fare il deploy con semplicità dele loro applicazioni, senza che si debbano preoccupare dell'infrastruttura sottostante. K8s:

  • Controlla il consumo di risorse per applicazione o per team;
  • Alloca le applicazioni in modo equo all'interno del cluster, così da non "affogare" le singole macchine;
  • Crea load-balancing automatico delle richieste sulle differenti istanze delle applicazioni;
  • Monitora il consumo di risorse e, se queste oltrepassano i limiti imposti, le riavvia automaticamente per evitare malfunzionamenti;
  • Sposta le istanze di un'applicazione automaticamente su altri nodi, qualora uno abbia un sovraccarico di risorse o non sia più disponibile per malfunzionamenti;
  • Può sfruttare immediatamente nuove istanze del cluster non appena aggiunte, senza necessità di configurazione aggiuntiva;
  • Semplifica i rilasci delle applicazioni per scenari di A/B testing, canary deployment e rollback.

Perché Kubernetes?

Kubernetes non è solo una moda temporanea, come può sembrare. Al contrario, dobbiamo osservare come stanno cambiando gli approcci allo sviluppo e in particolare al deployment:

  • Trazionalmente, i vari deployment si sono sempre fatti su server fisici: non essendoci limiti, le applicazioni, il software installato sulle macchine e l'hardware "viaggiavano" insieme e questo poteva causare grossi problemi, tra cui applicazioni poco performanti nella scalabilità, allocazioni complicate nel caso di carichi differenti degli applicativi alloggiati sulla stessa macchina, difficoltà nell'avere più versioni degli stessi applicativi e così via. Inoltre, i costi erano piuttosto elevati e la scalabilità non era predittiva;
  • Nell'era della virtualizzazione, invece, alcuni di questi problemi sono stati risolti poiché potevamo eseguire più Virtual Machine sulla stessa CPU di un singolo server fisico. Sebbene questo è sempre sembrato un vantaggio, poiché effettivamente a livello di costi erano e sono più gestibili, lato scalabilità delle risorse non ci sono stati grossi miglioramenti in quanto, per scalare è comunque necessario replicare le VM e non sono rapide nelle allocazioni, creando grossi problemi nei periodi di carichi importanti o di picco, quali possono essere, ad esempio, il Black Friday e i giorni precedenti al Natale per un sito di e-commerce;
  • Con l'avvento dei container il tutto è strato estremamente semplificato, perché possono girare in isolation, mantenendo comunque lo stesso sistema operativo condiviso tra le applicazioni, pertanto sono più leggeri e possono scalare molto in fretta. In modo simile alle VM, i container hanno un loro file system, CPU, memoria, spazio dei processi e di indirizzamento e molto altro, ma sono "staccati" dall'infrastruttura di base, il chè li rende portabili, ovunque.

Docker, al contrario di quanto si può pensare, non ha inventato i container ma ha "solamente" portato questa tecnologia alla portata di tutti. Quando si parla di applicazioni complesse, però, andare nel cloud e gestire le applicazioni con App Service, ad esempio, potrebbe non essere sufficiente per gestire gli scenari di alta affidabilità e scalabilità che abbiamo anticipato in precedenza e Docker, da solo, non è in grado di aiutarci. Proprio per questo motivo ci serve una piattaforma, come Kubernetes, che ci aiuti nell'orchestrazione dei servizi. K8s:

  • Aiuta a muoversi più velocemente, grazie al suo layer di astrazione sull'hardware che lo ospita e alla possibilità di fare deployment dei servizi sfruttando dei semplici file YAML;
  • Aiuta a risparmiare sui costi, poiché grazie ai container, che richiedono meno CPU e memoria, abbiamo la possibilità di risparmiare di più in confronto a VM e hardware fisico;
  • E' agnostico, infatti indipendentemente dal fatto che l'implementazione sia fatta su un server on-premise, piuttosto che su uno dei servizi cloud, come vedremo nelle prossime pagine, funzionerà allo stesso modo e tutti i workload che andremo a creare saranno portabili al 100%, senza modifiche;
  • E' supportato dai maggiori cloud provider come Microsoft Azure e Amazon AWS che supportano la stessa versione di K8s che potremo installarci nel datacenter privato, ma in modalità gestita, così da non doverci preoccupare dei "dettagli" relativi all'infrastruttura, ma solo alle applicazioni che andremo a caricarci.

L'infrastruttura di Kubernetes

E' importante capire com'è strutturato Kubernetes e vedere come interagiscono i vari componenti poiché nelle pagine seguenti entreremo nel vivo dell'installazione e della sua configurazione. Principalmente, è necessario capire che, a grandi linee, possiamo divedere il tutto in due parti: il master node e i worker node.

Il nodo master, detto anche control plane, è il componente principale poiché è colui che dovrà prendere tutte le decisioni in merito al cluster come, ad esempio, gestire il suo stato, effettuare i deployment, creare nuove repliche dei servizi per scalarli etc. Nonostante sia il nodo principale, può essere configurato su qualsiasi macchina, esattamente come i worker node che vedremo a breve, pertanto non ha bisogno di una configurazione particolare. Per quanto riguarda i componenti che lo formano, troviamo:

  • kube-apiserver: si occupa di esporre le API di Kubernetes;
  • etcd: è uno storage di tipo chiave-valore, consistente e con alta affidabilità, dove K8s salva i dati relativi al cluster;
  • kube-scheduler: controlla i requisiti delle risorse da deployare e facendo un match con la disponibilità sul cluster in termini di memoria, consumi di CPU e policy custom, decide dove allocare nuovi pod (l'unità minima di deployment all'interno di un cluster di K8s, che può contenere uno o più container);
  • kube-controller-manager: esegue tutti i processi di controllo come il node controller, che verifica la disponibilità dei nodi e prende azioni qualora uno dei nodi muoia, il replication controller, che si assicura che ci sia un numero adeguato di repliche dei pod, piuttosto che token controller che gestisce le secret e altri...;
  • cloud-controller-manager: rappresenta un'interfaccia tra i vari cloud provider ed il cluster di Kubernetes stesso, così che le implementazioni di entrambi possano andare avanti separatamente senza conflitti.

All'interno di ogni nodo del cluster di K8s, invece, troviamo i seguenti componenti:

  • kubelet: è un agent che si assicura che i container siano effettivamente in esecuzione all'interno dei pod deployati;
  • kube-proxy: è un proxy a livello di network che permette di applicare regole di rete anche alla comunicazione interna ai nodi del cluster e ai pod;
  • Container Runtime: il software responsabile per l'esecuzione dei container.

Oltre a questi componenti, troviamo anche diversi add-on che possono essere installati sul cluster come, ad esempio, una dashboard web per avere accesso al cluster tramite interfaccia grafica anziché solo tramite riga di comando, ma rimandiamo alla documentazione ufficiale per maggiori dettagli poiché questi servizi dipendono dall'implementazione che vogliamo supportare.

Capiti quelli che sono i vantaggi nell'adottare un approccio nuovo allo sviluppo, i benefici nello scegliere un'architettura basata su Kubernetes, vediamo ora come possiamo installare il cluster nella versione on-premise, piuttosto che sfruttare la versione in cloud come servizio gestito, per arrivare, infine, a vedere come Kubernetes può essere integrato in uno scenario alternativo al deployment all'interno di Azure DevOps per migliorare i flussi applicativi.

6 pagine in totale: 1 2 3 4 5 6
Contenuti dell'articolo

Commenti

Visualizza/aggiungi commenti

| Condividi su: Twitter, Facebook, LinkedIn

Per inserire un commento, devi avere un account.

Fai il login e torna a questa pagina, oppure registrati alla nostra community.

Approfondimenti

Top Ten Articoli

Articoli via e-mail

Iscriviti alla nostra newsletter nuoviarticoli per ricevere via e-mail le notifiche!

In primo piano

I più letti di oggi

In evidenza

Misc