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.

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 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.

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.

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.

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.

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!