StatefulSet in Kubernetes: creazione e debug
Ciascun pod di uno StatefulSet in Kubernetes è dotato di un nome host stabile e univoco e di un’identità DNS completa. Questo ID viene mantenuto anche in caso di riavvio e ridimensionamento.
Che cosa sono gli StatefulSet in Kubernetes?
Gli StatefulSet in Kubernetes sono speciali entità per la gestione di applicazioni che presentano requisiti particolari in termini di dati persistenti e identità fisse. Questi set garantiscono che i pod con repliche vengano avviati seguendo un ordine specifico. A ciascun pod di Kubernetes assegnano un ID univoco e un accesso alla memoria persistente. Tali funzionalità sono utili per i database che si basano su relazioni stabili tra le istanze e necessitano di archiviare dati persistenti. Gli StatefulSet sono quindi una soluzione efficace per orchestrare e gestire applicazioni complesse in Kubernetes.
Managed Kubernetes sul cloud IONOS offre una potente piattaforma per le applicazioni containerizzate. La distribuzione georidondante garantisce la massima affidabilità ed elevata disponibilità delle risorse. Grazie alle funzioni di controllo integrate e agli aggiornamenti automatizzati, Managed Kubernetes consente una configurazione semplice e sicura nel tuo ambiente di produzione.
Come creare uno StatefulSet in Kubernetes
Innanzitutto partiamo dalla definizione di un file di configurazione YAML in cui impostare le proprietà desiderate dello StatefulSet e creare i pod di Kubernetes. Dopo la configurazione, lo StatefulSet esegue un monitoraggio continuo dello stato del cluster e verifica che il numero di pod predefinito sia sempre in esecuzione e disponibile. In caso di guasto del pod o di una rimozione del nodo, lo StatefulSet rileva automaticamente la situazione. Quindi inizializza la distribuzione di un nuovo pod con lo stesso ID univoco. Questo nuovo pod viene connesso alla memoria persistente già esistente e riceve la stessa configurazione del pod originale. Questa comprende anche le richieste e i limiti di risorse.
Questa gestione precisa dei pod e delle loro identità è fondamentale affinché sia possibile reindirizzare al nuovo pod i client precedentemente serviti dal pod non più disponibile, senza interruzioni. L’accesso alla memoria persistente garantisce un funzionamento continuo dei processi senza interruzioni.
A seguire trovi un esempio di file YAML completo che mostra i passaggi necessari per la creazione di uno StatefulSet in Kubernetes per Nginx:
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: nginx-statefulset
spec:
serviceName: nginx
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:latest
volumeMounts:
- name: nginx-config
mountPath: /etc/nginx/conf.d
- name: nginx-html
mountPath: /usr/share/nginx/html
volumeClaimTemplates:
- metadata:
name: nginx-html
spec:
accessModes: [ "ReadWriteOnce" ]
resources:
requests:
storage: 1Gi
volumeClaimTemplates:
- metadata:
name: nginx-config
spec:
accessModes: [ "ReadWriteOnce" ]
resources:
requests:
storage: 1Gi
yamlQuesto documento YAML definisce uno StatefulSet in Kubernetes per Nginx con tre repliche. Utilizza un oggetto di servizio di nome nginx ed etichette per identificare correttamente i pod. Questi ultimi usano l’immagine Nginx più recente e dispongono di due volumi per la configurazione e per i file HTML. I VolumeClaimTemplates proteggono la memoria persistente per questi volumi con una dimensione di 1 gigabyte e consentono l’accesso ReadWriteOnce.
Debug di StatefulSet
Il debug degli StatefulSet in Kubernetes richiede passaggi specifici per verificare che i pod siano stati inizializzati correttamente e per identificare e risolvere gli errori, se necessario.
Primo passaggio: elencazione dei pod
Prima di iniziare il debug degli StatefulSet ti consigliamo di verificare lo stato dei pod.
Apri la riga di comando e utilizza il comando seguente per elencare tutti i pod nello StatefulSet desiderato:
kubectl get pods -l app=statefulset-label
shellOutput:
NAME READY STATUS RESTARTS AGE
nginx-statefulset-0 1/1 Running 0 2m
nginx-statefulset-1 1/1 Running 0 1m
nginx-statefulset-2 1/1 Running 0 1m
shellNAME
: a ciascun pod viene assegnato un nome univoco in base allo schema di denominazione dello StatefulSet e un numero progressivo.READY
: mostra quanti sono i container desiderati e pronti nel pod. In questo esempio, ogni pod ha un container e1/1
significa che il container è operativo.STATUS
: indica lo stato corrente del pod.RESTARTS
: mostra per quante volte il container nel pod è stato riavviato. Un valore pari a 0 significa che non è stato ancora effettuato nessun riavvio.AGE
: indica da quanto tempo è in esecuzione il pod.
Messaggi di stato che indicano errori:
- Failed (non riuscito): uno o più container nel pod hanno causato un errore che ha portato al malfunzionamento del pod. I motivi possono essere diversi, ad esempio dipendenze mancanti o problemi di configurazione.
- Unknown (sconosciuto): non è stato possibile determinare lo stato del pod. Il problema potrebbe essere nella comunicazione tra il cluster Kubernetes e il pod. Ad esempio, si può trattare di problemi di rete, autorizzazioni mancanti o altri fattori.
In entrambi i casi è importante utilizzare strumenti diagnostici precisi, come il controllo dei log dei pod o il comando kubectl describe pod
per ottenere maggiori dettagli e determinare le cause degli errori.
Secondo passaggio: debug dei singoli pod
L’aggiunta di annotazioni a un pod può essere un utile strumento di debug per influire sul processo di inizializzazione o per eseguire azioni particolari.
Per prima cosa è necessario identificare il nome del pod di cui vuoi eseguire il debug.
kubectl get pods
shellPrendi nota del nome del pod di cui vuoi eseguire il debug.
Quindi digita il seguente comando nel terminale per definire l’annotazione del pod selezionato:
kubectl annotate pods [pod-name] pod.alpha.kubernetes.io/initialized="false" --overwrite
shellSostituisci [pod-name]
con il nome effettivo del pod. Questa annotazione imposta lo stato di inizializzazione su false
, ossia il pod verrà contrassegnato come non inizializzato.
Monitora il pod per vedere come l’annotazione influisce sul suo comportamento. In particolare, puoi controllare gli eventi e i log del pod:
kubectl describe pod [pod-name]
kubectl logs [pod-name]
shellVai alla ricerca di eventi o risultati nel registro che potrebbero causare problemi durante il processo di inizializzazione. Una volta completato il debug, se desideri ripristinare il normale processo di inizializzazione puoi riportare l’annotazione su true
.
Terzo passaggio: inizializzazione graduale
Se il debug del pod con le tecniche descritte in precedenza non ha dato esito positivo, potrebbero essere presenti delle condizioni di corsa durante il processo di bootstrap dello StatefulSet. Per risolvere questo problema puoi specificare initialized="false"
nel manifest dello StatefulSet di Kubernetes e crearlo quindi all’interno del cluster con questa annotazione.
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: [statefulset-name]
spec:
template:
metadata:
annotations:
pod.alpha.kubernetes.io/initialized: "false"
...
yamlApplica il manifest aggiornato al tuo cluster Kubernetes:
kubectl apply -f statefulset.yaml
shellIspeziona i pod e identifica eventuali potenziali fonti di errore. Esegui le azioni di debug necessarie in base agli eventi e ai registri osservati. Se necessario, elimina i pod per mezzo di kubectl delete statefulsets
o kubectl delete service
.
Dopo aver completato il debug puoi rimuovere l’annotazione inizializzata e aggiornare lo StatefulSet di Kubernetes nel cluster:
kubectl annotate pods [pod-name] pod.alpha.kubernetes.io/initialized="true" --overwrite
shellIl comando imposta l’annotazione inizializzata di un pod su true
, garantendo che i valori esistenti vengano sovrascritti. Dopo aver controllato il primo pod, lo StatefulSet in Kubernetes inizializza automaticamente il pod successivo. Successivamente puoi ripetere i passaggi di debug per ogni altro pod nello StatefulSet.
Nel tutorial di Kubernetes trovi informazioni pratiche e dettagliate per la configurazione di un cluster Kubernetes.
- Configurazione automatica dei cluster Kubernetes
- Archiviazione persistente completamente integrata
- Assistenza clienti 24/7