1.1 Kubernetes

aggiornato 23/11/2023
 
Kubernetes è un sistema open source per l'orchestrazione dei container che consente di gestire e scalare facilmente le applicazioni containerizzate su un'infrastruttura distribuita. Funziona attraverso un insieme di componenti che collaborano tra loro per fornire un'infrastruttura di gestione delle applicazioni altamente scalabile e ridondante.
Kubernetes semplifica notevolmente la gestione delle applicazioni in quanto consente di automatizzare il deployment, la scalabilità e la gestione delle applicazioni in contenitori, riducendo al minimo la complessità operativa.
Kubernetes offre una vasta gamma di funzionalità, come:
  • il deployment automatico;
  • la gestione delle risorse;
  • l'aggiornamento automatico;
  • la scalabilità orizzontale e verticale:
  • la gestione della configurazione;
  • la gestione dei volumi di archiviazione;
  • la distribuzione del traffico;
  • la gestione degli eventi e dei log.
Grazie a queste funzionalità, Kubernetes semplifica notevolmente la gestione delle applicazioni in container e consente di gestire facilmente ambienti complessi e di grande scala.
   
Un cluster Kubernetes è un insieme di nodi (o macchine) che eseguono il software Kubernetes e lavorano insieme come un singolo sistema coerente per gestire e orchestrare i container. Un cluster consente di gestire le applicazioni containerizzate in modo scalabile, ridondante e affidabile.

In un cluster Kubernetes, un nodo può assumere il ruolo di control plane node, che coordina tutte le attività del cluster, o di worker node, che esegue le applicazioni containerizzate.
Il control plane node gestisce il deployment, la scalabilità e la gestione delle applicazioni sui nodi worker.
I nodi worker eseguono i container delle applicazioni e comunicano con il control plane node per ricevere le istruzioni.

Il cluster Kubernetes offre diverse funzionalità, come il deployment automatico, la gestione delle risorse, l'aggiornamento automatico, la scalabilità orizzontale e verticale, la gestione della configurazione, la gestione dei volumi di archiviazione, la distribuzione del traffico e la gestione degli eventi e dei log. Grazie a queste funzionalità, un cluster Kubernetes semplifica notevolmente la gestione delle applicazioni containerizzate, consentendo di gestire facilmente ambienti complessi e di grande scala.
Un container è un'istanza eseguibile, che viene utilizzato per ospitare un'applicazione o un servizio. Un container Kubernetes è un'unità logica di calcolo che viene gestita e orchestrata dal sistema Kubernetes all'interno di un cluster. Kubernetes utilizza i container per eseguire le applicazioni in modo isolato, consentendo a più container di coesistere sulla stessa macchina senza interferire tra loro. Ogni container ha il proprio file system isolato, la propria configurazione di rete e i propri processi. Ciò significa che l'aggiornamento di un container non influisce sugli altri container che vengono eseguiti sulla stessa macchina.

Un gruppo di container viene raggruppato in un'unità logica chiamata "pod". I pod sono le unità di base dell'orchestrazione delle applicazioni in Kubernetes, e possono contenere uno o più container. Kubernetes gestisce i pod come singole entità, consentendo di scalare, aggiornare o sostituire i container all'interno dei pod in modo indipendente.

Un container Kubernetes è un'istanza eseguibile che viene gestita e orchestrata dal sistema Kubernetes all'interno di un cluster, per ospitare un'applicazione o un servizio.
Il control plane node è la componente centrale del cluster, responsabile della gestione e del controllo delle risorse all'interno del cluster. Il control plane node coordina e distribuisce il lavoro tra i worker node all'interno del cluster e gestisce la gestione delle risorse, ad esempio la creazione e la gestione dei pod, l'allocazione delle risorse, la scalabilità delle applicazioni e la gestione degli eventi.

Il control plane node è composto da diverse componenti, tra cui l'API server, il controller manager, il scheduler e il etcd (database distribuito utilizzato per archiviare le informazioni di configurazione del cluster). Queste componenti lavorano insieme per garantire che il cluster sia sempre in uno stato coerente e funzionante. L'API server in Kubernetes è il punto di ingresso principale per la gestione del cluster, consentendo di comunicare con il control plane node utilizzando l'interfaccia della riga di comando kubectl o altre interfacce utente. Il controller manager in Kubernetes è responsabile della gestione dei controller, che controllano lo stato delle risorse all'interno del cluster e gestiscono le azioni in risposta a eventi specifici.

Il control plane node in Kubernetes è un componente cruciale del cluster, che si occupa di garantire la coerenza e la gestione delle risorse all'interno del cluster, semplificando la gestione e l'orchestrazione delle applicazioni.
Il worker node è un nodo all'interno di un cluster Kubernetes che esegue i container delle applicazioni. Il worker node è uno dei due tipi di nodi all'interno di un cluster Kubernetes, insieme al control plane node. Il worker node esegue i container delle applicazioni, in base alle specifiche fornite dal control plane node. Il worker node gestisce il ciclo di vita dei container all'interno del nodo, eseguendo le istruzioni fornite dal control plane node per avviare, arrestare o riavviare i container. Il worker node è responsabile anche della gestione delle risorse a livello di nodo, tra cui CPU, memoria, storage e rete.

Il worker node comunica con il control plane node attraverso l'API server di Kubernetes, per ricevere le istruzioni e le informazioni sullo stato del cluster. Il worker node invia inoltre informazioni sulle risorse disponibili e sullo stato dei container eseguiti.

Il worker node in Kubernetes è il componente responsabile dell'esecuzione delle applicazioni all'interno di un cluster. Grazie alla sua scalabilità orizzontale, è possibile aggiungere o rimuovere worker node dal cluster a seconda delle esigenze di gestione delle risorse.
Un Node Pool è un gruppo di nodi all'interno di un cluster Kubernetes con caratteristiche hardware simili, come CPU, memoria, storage e capacità di rete. I Node Pool sono utilizzati per la scalabilità orizzontale dei nodi in un cluster Kubernetes. In un cluster Kubernetes, i nodi possono essere aggiunti o rimossi a seconda delle esigenze dell'applicazione. Quando si crea un Node Pool, si specificano le caratteristiche hardware dei nodi che saranno aggiunti a quel pool. In questo modo, è possibile garantire che i nodi all'interno dello stesso pool abbiano le stesse specifiche hardware e siano adatti a eseguire le stesse applicazioni.

Quando viene eseguita un'applicazione all'interno di un cluster, Kubernetes valuta le risorse disponibili e determina su quali nodi eseguire i container. Se tutti i nodi in un pool sono saturi, Kubernetes può automaticamente creare nuovi nodi all'interno del pool per soddisfare la richiesta di risorse dell'applicazione. In questo modo, il Node Pool in Kubernetes offre una maggiore flessibilità e scalabilità nella gestione delle risorse del cluster, consentendo di aumentare o diminuire la capacità del cluster in modo dinamico e adattabile.
Un kubelet è un agente che viene eseguito su ogni nodo del cluster e gestisce l'esecuzione dei container all'interno del nodo. Il kubelet è uno dei componenti principali del nodo worker e si occupa della comunicazione tra il nodo e il master del cluster. Il kubelet controlla lo stato dei container all'interno del nodo e si assicura che i container siano in esecuzione correttamente. Se un container si arresta in modo anomalo, il kubelet lo rileva e tenta di riavviarlo automaticamente. Il kubelet gestisce anche le risorse del nodo, come CPU, memoria e storage, per garantire che i container eseguiti sul nodo non consumino più risorse di quelle disponibili.

Il kubelet interagisce con il control plane node di Kubernetes attraverso l'API server, che gli fornisce informazioni sullo stato del cluster e le istruzioni per la gestione dei container. Il kubelet invia inoltre informazioni sullo stato dei container eseguiti sul nodo, inclusi eventuali errori o problemi.

Il kubelet in Kubernetes è un agente essenziale per la gestione dei container all'interno di un nodo worker, assicurando che i container vengano eseguiti correttamente e in modo affidabile e garantendo che il nodo worker rispetti le politiche di gestione delle risorse del cluster.
Kubectl è la CLI (Command Line Interface) ufficiale utilizzata per interagire con il cluster Kubernetes. Kubectl è uno strumento potente e flessibile che consente di gestire le risorse all'interno del cluster, ad esempio la creazione e l'eliminazione di pod, la scalabilità delle applicazioni, la configurazione dei servizi e la visualizzazione dei log delle applicazioni.
Kubectl consente agli amministratori e agli sviluppatori di eseguire facilmente le operazioni comuni di gestione del cluster, utilizzando comandi intuitivi e ben documentati. Kubectl si connette al control plane node di Kubernetes utilizzando l'API server e consente di inviare comandi al cluster tramite l'interfaccia della riga di comando.

Kubectl è altamente personalizzabile e consente di creare script e comandi personalizzati per semplificare le operazioni ripetitive. Inoltre, kubectl supporta l'autocompletamento dei comandi e dei nomi delle risorse, semplificando la digitazione dei comandi.

Kubectl è uno strumento essenziale per la gestione del cluster Kubernetes, consentendo di gestire le risorse in modo efficace e semplificando le operazioni di amministrazione e sviluppo del cluster.
Un pod è il più piccolo oggetto di gestione dell'orchestrazione delle applicazioni, è un gruppo di uno o più container che condividono lo stesso spazio di rete e le stesse risorse all'interno di un nodo.

I container all'interno di un pod condividono lo stesso IP del pod e la stessa porta, il che consente loro di comunicare tra loro utilizzando la localhost. Inoltre, i container all'interno di un pod possono condividere volumi di dati, consentendo loro di condividere file e altre risorse. Un pod è gestito dal control plane node, che si occupa di garantire che il pod sia in esecuzione e funzionante. Se un pod si arresta in modo anomalo, il control plane node tenta di riavviarlo automaticamente o di creare un nuovo pod per sostituirlo.

I pod sono anche utilizzati per la scalabilità orizzontale, consentendo di eseguire più istanze di un'applicazione su un singolo nodo. In questo caso, ogni istanza dell'applicazione viene eseguita all'interno di un pod separato.
Il pod in Kubernetes è un'astrazione importante per la gestione delle applicazioni, consentendo di gestire in modo efficace l'esecuzione dei container all'interno del cluster, semplificando la gestione delle risorse e migliorando l'affidabilità delle applicazioni.
l'API Server è il componente centrale e fondamentale del control plane node. Fornisce un'interfaccia principale per interagire con il cluster Kubernetes, consentendo agli utenti e agli strumenti esterni di comunicare con il cluster per gestire le risorse e controllare lo stato del sistema.

Gestisce l'autenticazione e l'autorizzazione degli utenti, valida le richieste, persiste i dati delle risorse e controlla le operazioni sulle risorse all'interno del cluster.
Etcd in Kubernetes è un componente chiave che fornisce un sistema distribuito di archiviazione dei dati per memorizzare e gestire lo stato del cluster e le informazioni di configurazione e altre risorse.

Etcd replica i dati tra i nodi del cluster per garantire la ridondanza e l'affidabilità. Utilizza il modello chiave-valore, in cui i dati vengono organizzati in una struttura ad albero gerarchica.

Ogni nodo dell'albero può contenere una chiave univoca e un valore associato. Questo permette a Kubernetes di gestire in modo affidabile le risorse e lo stato del cluster.
Lo scheduler è un componente responsabile dell'assegnazione dei pod alle macchine virtuali (VM) o ai nodi del cluster. Il compito dello scheduler è quello di distribuire e bilanciare il carico di lavoro in modo efficiente tra i nodi del cluster, prendendo in considerazione i requisiti e le limitazioni delle risorse.

Lo scheduler sceglie il nodo più adatto per ogni pod, prendendo in considerazione le preferenze, le limitazioni e gli algoritmi di schedulazione definiti. Lo scheduler gioca un ruolo fondamentale nel garantire la scalabilità e l'efficienza delle applicazioni distribuite in Kubernetes.
Un controller è un componente software che si occupa di gestire il ciclo di vita delle risorse del cluster e di garantirne lo stato desiderato.

Le principali caratteristiche dei controller in Kubernetes sono:
  • monitoraggio dello stato - monitorano continuamente lo stato del cluster e delle risorse interrogando l'API server;
  • riconciliazione - monitorano costantemente lo stato reale delle risorse ed intervengono per assicurarsi che questo sia allineato e mantenuto con lo stato desiderato delle stesse;
  • gestione degli eventi - gestiscono gli eventi che si verificano nel cluster, come la creazione/modifica/rimozione nuove risorse;
  • scalabilità - possono essere scalati orizzontalmente per gestire grandi carichi di lavoro o cluster di grandi dimensioni;
  • gestione delle dipendenze - possono gestire le dipendenze tra le risorse;
I controller sono un elemento chiave nell'orchestrazione delle applicazioni in Kubernetes.