Diversi rapporti di recente riguardano gli spazi dei nomi di Kubernetes che rimaneno bloccati in uno stato di risoluzione. Questo articolo fornisce una spiegazione di alto livello di ciò che può causare questo e come risolverlo. Troverai tutte le informazioni necessarie su come risolvere il problema. Spiegheremo perché ciò accade in primo luogo. Cominciamo con ciò che lo spazio dei nomi Kubernetes bloccato è il problema.
Qual è il problema dello spazio dei nomi di Kubernetes che è bloccato nella chiusura dei problemi?
Per capire cosa sia il problema di chiusura dello spazio dei nomi di Kubernetes, è importante acquisire familiarità con ciò che uno spazio dei nomi. Lo spazio dei nomi di Kubernetes è un insieme di risorse utilizzate dal demone Kubernetes per gestire e controllare le applicazioni distribuite. Viene di solito creato uno spazio dei nomi quando viene avviata la prima distribuzione di una nuova applicazione su Kubernetes. Lo spazio dei nomi rimane nello stato di "creazione" per i primi secondi dopo la distribuzione. Dopo questo, diventa lo stato "terminato" e il demone inizia ad assegnare le risorse all'applicazione. Si pensa che lo spazio dei nomi sia preparato per l'uso dal programma quando viene terminato. Tuttavia, in alcuni casi, lo spazio dei nomi potrebbe rimanere bloccato in questo stato a tempo indeterminato e rifiutarsi di diventare attivo anche dopo che sono stati fatti più tentativi per ricrearlo. Ci sono alcune azioni che puoi fare per risolverlo quando si verifica. Esamineremo alcune delle ragioni più tipiche di questo problema e possibilmente risolvere.
Perché lo spazio dei nomi rimane bloccato nello stato di risoluzione?
Ci sono alcuni motivi comuni per cui uno spazio dei nomi potrebbe essere bloccato in uno stato terminale:
Motivo 1: errore dell'operatore comune
L'errore più comune è l'errore dell'operatore in cui un operatore elimina accidentalmente o interrompe il servizio che mantiene vivo lo spazio dei nomi.
Motivo 2: configurazione impropria
Un altro motivo comune è che il cluster sottostante deve essere configurato correttamente. Se il cluster è configurato con più master e un master viene improvvisamente rimosso dal cluster, può portare allo stato di terminazione di tutti gli altri cluster nella rete del cluster poiché mancano di una connessione master praticabile.
Motivo 3: problemi di connettività di rete
A volte, un problema sottostante, come i problemi di connettività di rete, può far terminare bruscamente i pod all'interno dello spazio dei nomi, facendo sì che lo spazio dei nomi si entri in uno stato terminato. È fondamentale tenere traccia delle metriche di un cluster e ispezionarli frequentemente per garantire che non ci siano problemi di fondo che causano i tempi di inattività per le tue applicazioni.
Motivo 4: finalizzatori
Infine, gli spazi dei nomi hanno un finalizer che è definito sotto le specifiche. Un finalizer è una chiave di metadati che indica a Kubernetes di trattenere la distruzione di una risorsa a meno che non venga soddisfatta una condizione particolare. Quindi, quando viene eseguito un comando per eliminare uno spazio dei nomi, Kubernetes controlla la sezione dei metadati per un finalizer. Se la risorsa definita da Finalizer non può essere distrutta, anche lo spazio dei nomi non può essere chiuso, risultando in uno spazio dei nomi in uno stato di chiusura per giorni, mesi o addirittura anni.
Come possiamo risolvere questo problema?
Ecco alcuni semplici modi in cui puoi seguire per risolvere facilmente il problema:
Essere aggiornato
Innanzitutto, assicurati che il tuo sistema sia aggiornato aggiornando i nodi K8S con l'ultima versione di rilascio. Alcune versioni precedenti hanno un difetto che potrebbe interferire con il funzionamento del servizio di kubelet e causare questo fallimento.
Riavvia il processo principale di Kubernetes
Se il problema persiste nonostante faccia il passo che abbiamo menzionato in precedenza, puoi provare a riavviare il processo principale di Kubernetes. Questo processo termina eventuali processi di lavoro che potrebbero essere bloccati. Questo li fa uscire con grazia senza causare problemi per altri baccelli.
Ricreare i baccelli bloccati
Se lo spazio dei nomi rimane bloccato in questo stato dopo aver riavviato il processo principale, il passo successivo è ricreare i baccelli bloccati. Ciò richiede di copiarli in uno spazio dei nomi diverso e di eliminare i baccelli rotti nello spazio dei nomi originali. Una volta fatto questo, dovresti assicurarti che tutti i baccelli cancellati siano ancora correttamente in esecuzione nello spazio dei nomi target. Se qualcuno di loro non funziona correttamente, dovresti ripristinarli. Questo aiuta a risolvere il problema con lo spazio dei nomi in Kubernetes. Una volta fatto questo, puoi verificare che tutti i tuoi contenitori siano correttamente e che i baccelli rotti non siano più in esecuzione nel cluster.
Avere uno spazio sufficiente a disco disponibile per la memoria sul cluster
Se non funziona anche questo, controlla se esiste uno spazio su disco adeguato aperto per la memorizzazione sul cluster eseguendo il comando seguente su uno dei nodi che ospitano il cluster:
kalsoom@virtualbox> sudo df-kh | grep/var/lib/kubelet
Come indica il nome, questo comando ti dà un elenco di dischi montati sul sistema, insieme alla quantità di spazio utilizzata da ciascun dispositivo. Questo può essere utilizzato per identificare i dispositivi che stanno riscontrando problemi con l'allocazione dello spazio e liberare spazio aggiuntivo su tali dispositivi necessari.
Esecuzione di un aggiornamento APT-get e un riavvio completo del sistema
Se questo non aiuta a risolvere il problema, prova a eseguire un aggiornamento APT-get seguito da un riavvio completo del sistema. Questo costringe il gestore pacchetti a verificare automaticamente nuovi aggiornamenti e installarli. Dopo che il sistema è stato riavviato, eseguire lo stesso comando che hai eseguito per identificare qualsiasi dispositivo che esaurisce lo spazio di archiviazione. Una volta identificato il problema, liberare il più possibile spazio sul dispositivo per liberare un po 'di spazio per il servizio Kubelet da allocare allo spazio dei nomi. Potresti anche provare a utilizzare le diverse soluzioni di archiviazione per il tuo cluster se l'hardware sottostante è sottodimensionato.
Forza eliminare lo spazio dei nomi
Puoi anche forzare eliminare lo spazio dei nomi facendo quanto segue:
kalsoom@virtualbox> namespace = your_namespace_to_delete
proxy kubectl e
Kubectl Ottieni namespace $ namespace -o json | jq '.Spec = "finalizers": [] '> temp.JSON
CURL -K -H "Content -Type: Application/JSON" -x Put - -Data -Binary @Temp.JSON 127.0.0.1: 8001/API/v1/namespaces/$ namespace/finalizza
I componenti della sezione finalizzatori in questo caso vengono eliminati a livello di programmazione utilizzando la funzione JQ. Potresti anche completarlo manualmente. Per impostazione predefinita, il proxy Kubectl crea l'ascoltatore a 127.0.0.1: 8001. Potresti essere in grado di utilizzarlo invece se sei a conoscenza del nome host e dell'indirizzo IP del tuo cluster Master.
Rimozione del finalizzatore
È inoltre possibile rimuovere le specifiche di finalizer per eliminare completamente lo spazio dei nomi. Per fare ciò, è necessario rimuovere il finalizer per eliminare completamente lo spazio dei nomi facendo quanto segue:
1. Innanzitutto, scarica le specifiche dello spazio dei nomi in formato JSON. Il codice è indicato come segue:
kalsoom@virtualbox> kubectl ottieni ns -o json>.JSON
2. Successivamente, modifica lo spazio dei nomi.JSON rimuovendo i "finalizzatori" nelle specifiche:
"Spec": "finalizer":,
A:
"Spec": ,
3. Successivamente, patcha lo spazio dei nomi facendo quanto segue:
kalsoom@virtualbox> kubectl sostituire - -raw "/api/v1/namespaces // finalize" -f.JSON
Conclusione
Abbiamo spiegato brevemente il problema dello spazio dei nomi rimasti bloccati in uno stato terminale. Abbiamo anche sottolineato molte ragioni per cui ciò può accadere e i passi necessari che possiamo prendere per risolvere questo problema. Abbiamo fornito in dettaglio tutte le informazioni critiche su tale argomento.