In determinate condizioni, i criteri PodDisruptionBudget (PDB) possono impedire la rimozione dei nodi dai node pool.
In queste condizioni, lo stato del nodo viene segnalato come Ready,SchedulingDisabled
nonostante sia stato rimosso. Questo documento mostra come rimuovere i nodi dai cluster Google Distributed Cloud attualmente bloccati da problemi PDB.
Questa pagina è rivolta ad amministratori, architetti e operatori che gestiscono il ciclo di vita dell'infrastruttura tecnica di base e rispondono ad avvisi e pagine quando gli obiettivi del livello di servizio (SLO) non vengono raggiunti o le applicazioni non funzionano. Per scoprire di più sui ruoli comuni e sugli esempi di attività a cui facciamo riferimento nei contenuti di Google Cloud, consulta Ruoli e attività comuni degli utenti di GKE Enterprise.
Se hai bisogno di ulteriore assistenza, contatta l'assistenza clienti Google Cloud.
Il budget per le interruzioni dei pod è in conflitto con il numero di pod disponibili
I criteri PDB contribuiscono a garantire il rendimento delle app impedendo che i pod si arrestino contemporaneamente quando apporti modifiche al sistema. Di conseguenza, i criteri PDB limitano il numero di pod non disponibili contemporaneamente in un'applicazione replicata.
Tuttavia, a volte il criterio PDB può impedire le eliminazioni di nodi che vuoi eseguire se violi il criterio rimuovendo un nodo.
Ad esempio, un criterio PDB può definire che nel sistema devono essere sempre disponibili due pod (.spec.minAvailable
è 2). Tuttavia, se hai solo due
pod e provi a rimuovere il nodo contenente uno di questi, il criterio PDB
viene applicato e impedisce la rimozione del nodo.
Analogamente, quando il criterio PDB definisce che nessun pod deve essere non disponibile
(.spec.maxUnavailable
è 0), il criterio impedisce anche l'eliminazione di eventuali nodi associati. Anche se provi a rimuovere un solo pod alla volta, il criterio PDB
ti impedisce di eliminare il nodo interessato.
Disattiva e riattiva il criterio PDB
Per risolvere un conflitto PDB, esegui il backup e rimuovi il criterio PDB. Dopo che il PDB è stato eliminato correttamente, il nodo viene svuotato e i pod associati vengono rimossi. Puoi quindi apportare le modifiche necessarie e riattivare il criterio PDB.
Il seguente esempio mostra come eliminare un nodo in questa condizione, che può colpire tutti i tipi di cluster Google Distributed Cloud: cluster di amministrazione, ibridi, autonomi e utente.
La stessa procedura generale è valida per tutti i tipi di cluster. Tuttavia, i comandi specifici per eliminare un nodo da un pool di nodi di un cluster di amministrazione (per cluster di amministrazione, ibridi o autonomi) variano leggermente dai comandi per eliminare un nodo da un pool di nodi di un cluster utente.
Per facilitare la lettura, la variabile
${KUBECONFIG}
viene utilizzata nei seguenti comandi.A seconda del tipo di cluster, esporta il percorso del file kubeconfig del cluster di amministrazione (
ADMIN_KUBECONFIG
) o del cluster utente (USER_CLUSTER_CONFIG
) in$(KUBECONFIG)
e completa i seguenti passaggi:- Per eliminare un nodo da un cluster di utenti, imposta
export KUBECONFIG=USER_CLUSTER_CONFIG
- Per eliminare un nodo da un cluster di amministrazione, imposta
export KUBECONFIG=ADMIN_KUBECONFIG
.
- Per eliminare un nodo da un cluster di utenti, imposta
(Facoltativo) Se stai eliminando un nodo da un pool di nodi di un cluster utente, esegui il seguente comando per estrarre il file kubeconfig del cluster utente:
kubectl --kubeconfig ADMIN_KUBECONFIG -n cluster-USER_CLUSTER_NAME \ get secret USER_CLUSTER_NAME-kubeconfig \ -o 'jsonpath={.data.value}' | base64 -d > USER_CLUSTER_CONFIG
Sostituisci le seguenti voci con informazioni specifiche per il tuo ambiente in cluster:
ADMIN_KUBECONFIG
: il percorso del file kubeconfig del cluster di amministrazione.CLUSTER_NAME
: il nome del cluster di cui vuoi eseguire lo snapshot.USER_CLUSTER_CONFIG
: il percorso del file di configurazione del cluster di utenti.
Dopo aver rimosso il nodo dal pool di nodi, controlla il relativo stato. Il nodo interessato segnala
Ready, SchedulingDisabled
:kubectl get nodes --kubeconfig ${KUBECONFIG}
Lo stato del nodo è simile al seguente output di esempio:
NAME STATUS ROLES AGE VERSION CP2 Ready Master 11m v.1.18.6-gke.6600 CP3 Ready,SchedulingDisabled <none> 9m22s v.1.18.6-gke.6600 CP4 Ready <none> 9m18s v.1.18.6-gke.6600
Controlla i PDB nel cluster:
kubectl get pdb --kubeconfig ${KUBECONFIG} -A
Il sistema segnala PDB simili a quelli mostrati nell'output dell'esempio seguente:
NAMESPACE NAME MIN AVAILABLE MAX UNAVAILABLE ALLOWED DISRUPTIONS AGE gke-system istio-ingress 1 N/A 1 19m gke-system istiod 1 N/A 1 19m kube-system coredns 1 N/A 0 19m kube-system log-aggregator N/A 0 0 19m kube-system prometheus N/A 0 0 19m
Controlla il PDB. Trova una corrispondenza tra l'etichetta del pod all'interno del PDB e i pod corrispondenti nel nodo. Questa corrispondenza ti consente di disattivare il PDB corretto per rimuovere correttamente il nodo:
kubectl --kubeconfig ${KUBECONFIG} get pdb log-aggregator -n kube-system -o 'jsonpath={.spec}'
Il sistema restituisce i risultati delle etichette corrispondenti nelle norme PDB:
{"maxUnavailable":0,"selector":{"matchLabels":{"app":"stackdriver-log-aggregator"}}}
Trova i pod corrispondenti all'etichetta delle norme PDB:
kubectl --kubeconfig ${KUBECONFIG} get pods -A --selector=app=stackdriver-log-aggregator \ -o=jsonpath='{range .items[*]}{.metadata.name}{"\t"}{.spec.nodeName}{"\n"}{end}'
Il comando restituisce un elenco di pod corrispondenti all'etichetta PDB e verifica il criterio PDB da rimuovere:
stackdriver-log-aggregator-0 CP3 stackdriver-log-aggregator-1 CP3
Dopo aver confermato il pod interessato, crea una copia di backup del criterio PDB. L'esempio riportato di seguito esegue il backup delle norme relative a
log-aggregator
:kubectl get pdb log-aggregator --kubeconfig ${KUBECONFIG} -n kube-system \ -o yaml >> log-aggregator.yaml
Elimina il criterio PDB specifico. Anche in questo caso, gli esempi riportati di seguito eliminano il criterio
log-aggregator
:kubectl delete pdb log-aggregator --kubeconfig ${KUBECONFIG} -n kube-system
Dopo aver eliminato il criterio PDB, il nodo procede allo svuotamento. Tuttavia, l'eliminazione completa del nodo può richiedere fino a 30 minuti. Continua a controllare lo stato del nodo per verificare che la procedura sia stata completata correttamente.
Se vuoi rimuovere definitivamente il nodo e anche le risorse di archiviazione associate, puoi farlo prima di ripristinare il criterio PDB. Per ulteriori informazioni, vedi Rimuovere le risorse di archiviazione.
Ripristina il criterio PDB dalla tua copia:
kubectl apply -f log-aggregator.yaml --kubeconfig ${KUBECONFIG}
Verifica che i pod eliminati siano stati ricreati correttamente. In questo esempio, se esistono due pod
stackdriver-log-aggregator-x
, vengono ricreati:kubectl get pods -o wide --kubeconfig ${KUBECONFIG} -A
Se vuoi ripristinare il nodo, modifica la configurazione del pool di nodi appropriata e ripristina l'indirizzo IP del nodo.
Rimuovere le risorse di archiviazione dai nodi eliminati definitivamente
Se elimini definitivamente un nodo e non vuoi ripristinarlo nel sistema, puoi anche eliminare le risorse di archiviazione associate al nodo.
Controlla e ottieni il nome del volume permanente (PV) associato al nodo:
kubectl get pv --kubeconfig ${KUBECONFIG} \ -A -o=jsonpath='{range .items[*]}{"\n"}{.metadata.name}{":\t"}{.spec.claimRef.name}{":\t"} \ {.spec.nodeAffinity.required.nodeSelectorTerms[0].matchExpressions[0].values}{"\n"}{end}'
Elimina il PV associato al nodo:
kubectl delete pv PV_NAME --kubeconfig ${KUBECONFIG}
Sostituisci
PV_NAME
con il nome del volume permanente da eliminare.
Passaggi successivi
Se hai bisogno di ulteriore assistenza, contatta l'assistenza clienti Google Cloud.