L'Architettura di Kubernetes e i motivi del suo successo

L'Architettura di Kubernetes e i motivi del suo successo

Come funziona Kubernetes? E perché ha avuto tanto successo?

In questo articolo, risponderò a queste domande, analizzando l’architettura di Kubernetes e i motivi per cui l’hanno resa la soluzione più dominante nel panorama del cloud native.

Trovi questo contenuto anche in formato video sul mio canale YouTube.

Cos’è Kubernetes? 

Kubernetes è un sistema open-source per automatizzare il deployment, lo scaling e la gestione delle applicazioni containerizzate

Le ragioni per cui ha avuto così tanto successo sono tre: 

  • La vasta gamma di funzionalità offerte
  • I suoi loop di controllo
  • Il suo design estensibile

In sostanza, Kubernetes rende più facile il deployment delle applicazioni e la gestione delle loro dipendenze ambientali, come rete, mappe di configurazione, segreti e volumi. Gli ingegneri definiscono lo stato desiderato, mentre Kubernetes monitora continuamente il sistema e riconcilia eventuali differenze, garantendo che lo stato attuale corrisponda sempre a quello desiderato. 

Questo meccanismo è noto come “control pattern” ed è ispirato agli stessi loop di controllo usati nella robotica e nell’automazione. In pratica, Kubernetes agisce come un termostato in una stanza. Noi definiamo la temperatura desiderata, mentre Kubernetes monitora la temperatura della stanza e decide se deve attivare o meno il condizionatore. 

Stato Desiderato vs Stato Attuale

Quasi tutto in Kubernetes è implementato secondo il “controller pattern”. 

Kubernetes è anche molto estensibile. Possiamo estendere la sua API introducendo le Custom Resource Definitions (CRD) e interagire con esse come se fossero una risorsa standard di Kubernetes. Possiamo anche estendere le sue capacità implementando controller personalizzati che seguono lo stesso pattern descritto prima. 

Questa estensibilità conferisce a Kubernetes un vantaggio strategico su qualsiasi soluzione concorrente perché facilita l’integrazione di altre tecnologie. Network policies, gestione dei certificati, API gateway, service mesh, monitoraggio e molto altro sono ormai gestiti all'interno di Kubernetes grazie a CRDs e controller personalizzati. 

Bene! Ora che sappiamo perché Kubernetes ha avuto tanto successo, vediamo l’architettura che lo sostiene. 

Architettura 

Kubernetes non è un’applicazione unica, ma è un insieme di componenti specializzati distribuiti su uno o più nodi. 

Ci sono due tipi di componenti: quelli del control-plane e quelli del runtime. 

I componenti di Kubernetes

I componenti del control-plane gestiscono lo stato generale del cluster; agiscono come il cervello di Kubernetes, dove avvengono tutte le decisioni. Questi componenti girano solitamente solo su alcuni nodi del nostro cluster.

I componenti runtime, ufficialmente chiamati “node components”, sono responsabili dell’interazione tra Kubernetes e l’infrastruttura sottostante. È questa interazione che crea pod e containers e gestisce la network per collegarli. In sostanza, sono le “braccia” di Kubernetes che eseguendo i compiti definiti dal control-plane. I componenti runtime girano su tutti i nodi. 

Adesso, invece di definire ogni componente, ti mostrerò cosa succede quando eseguiamo un comando con kubectl. Penso che questo sia il modo più efficace per spiegare come funziona Kubernetes. 

Iniziamo!

Kubectl Flow

Immagina di voler far eseguire a Kubernetes il deployment di tre istanze di nginx. 

Quando eseguiamo kubectl, stiamo effettivamente invocando l’API di Kubernetes nel control plane. Il componente che implementa l'API è il kube-apiserver. È un componente speciale perché è l'unico autorizzato a interagire con il database, che è etcd: uno store di chiavi-valori consistente e altamente disponibile. 

kube-apiserver e etcd

Dato il suo ruolo privilegiato, l’apiserver è anche il componente dove Kubernetes implementa autenticazione, autorizzazione, auditing e validazione delle richieste prima che vengano elaborate. Una volta superati questi controlli, lo stato desiderato viene salvato in etcd. 

Ora è il momento di vedere in azione il “controller pattern”. All'interno del “control-plane”, tre componenti monitorano continuamente lo stato desiderato invocando l’apiserver, lo confrontano con lo stato attuale del sistema e prendono decisioni per allinearli. 

kube-scheduler kube-controller-manager cloud-controller-manager

Il kube-controller-manager raggruppa diversi controller, incluso uno che sincronizza i deployment con replicaset e pod. Nel nostro esempio, dovrebbe tradurre la nostra risorsa di Deployment in un replica set e tre pod. 

Il passaggio successivo è decidere dove posizionare questi pod. Devono essere tutti eseguiti su un singolo nodo o distribuiti su più nodi per una migliore resilienza e load-balancing? Il componente responsabile di prendere questa decisione è il kube-scheduler, che opera come un altro loop di controllo. Monitora continuamente i pod senza un nodo prestabilito, e li assegna ai nodi appropriati in base a fattori come disponibilità delle risorse, stato di salute del nodo e qualsiasi vincolo specificato nella definizione del Pod. 

C’è anche il cloud-controller-manager, un componente opzionale progettato per integrare Kubernetes con piattaforme cloud specifiche. Tuttavia, non è essenziale per comprendere il funzionamento generale di Kubernetes. 

Una volta prese tutte le decisioni, entrano in gioco i componenti runtime.

kubelet

Il ruolo del kubelet è elencare i pod assegnati al suo nodo e interagire con il “container runtime per garantire che vengano creati e siano in esecuzione. Inoltre, monitora lo stato dei pod e lo riferisce al control plane. In questa maniera i controller hanno informazioni sullo stato attuale dell’infrastruttura e possono reagire in caso di errori su un pod o nodo.

kube-proxy10-

L’ultimo componente è il kube-proxy, che implementa il concetto di Service mantenendo le regole di rete sui nodi, consentendo la comunicazione verso i nostri Pod sia all'interno che all'esterno del cluster. Se c’è un sistema di “packet filtering”, Kubernetes lo configura; altrimenti, agisce come una proxy vera e propria. Non aggiungo altro su questo perché la rete di Kubernetes è estremamente complessa e richiederebbe un video a sé. 

Conclusione

Questo è tutto! Ora sai esattamente come funziona Kubernetes! 

Spero che questo post ti sia piaciuto! Se ti serve aiuto puoi mandarmi una email o prenotare un meeting su Topmate o Superprof.

Se vuoi aiutarmi a produrre più contenuti come questo, metti mi piace e condividi in modo che tutti possano imparare qualcosa di nuovo!