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.

Consiglio

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
yaml

Questo 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
shell

Output:

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
shell
  • NAME: 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 e 1/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
shell

Prendi 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
shell

Sostituisci [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]
shell

Vai 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"
        ...
yaml

Applica il manifest aggiornato al tuo cluster Kubernetes:

kubectl apply -f statefulset.yaml
shell

Ispeziona 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
shell

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

Managed Kubernetes
Orchestrazione sicura dei carichi di lavoro dei container
  • Configurazione automatica dei cluster Kubernetes
  • Archiviazione persistente completamente integrata
  • Assistenza clienti 24/7
Hai trovato questo articolo utile?
Per offrirti una migliore esperienza di navigazione online questo sito web usa dei cookie, propri e di terze parti. Continuando a navigare sul sito acconsenti all’utilizzo dei cookie. Scopri di più sull’uso dei cookie e sulla possibilità di modificarne le impostazioni o negare il consenso.
Page top