In determinate condizioni, le policy PodDisruptionBudgets (PDB)
possono impedire la rimozione dei nodi dai nodepool.
In queste condizioni, lo stato del nodo indica Ready,SchedulingDisabled nonostante sia stato rimosso. Questo documento mostra come rimuovere i nodi dai cluster Google Distributed Cloud attualmente bloccati da problemi relativi a PDB.
Questa pagina è rivolta ad amministratori, architetti e operatori che gestiscono il ciclo di vita dell'infrastruttura tecnologica sottostante e rispondono ad avvisi e pagine quando gli obiettivi del livello di servizio (SLO) non vengono soddisfatti o le applicazioni non vanno a buon fine. Per saperne di più sui ruoli comuni e sulle attività di esempio a cui facciamo riferimento nei contenuti, consulta Ruoli e attività comuni degli utenti GKE. Google Cloud
Conflitti PDB con il numero di pod disponibili
Le policy PDB contribuiscono a garantire le prestazioni delle app impedendo l'arresto simultaneo dei pod quando apporti modifiche al sistema. Di conseguenza, le policy PDB limitano il numero di pod contemporaneamente non disponibili in un'applicazione replicata.
Tuttavia, la policy PDB a volte può impedire le eliminazioni dei nodi che vuoi eseguire se violi la policy rimuovendo un nodo.
Ad esempio, una policy 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 che ne contiene uno, la policy PDB entra in vigore e impedisce la rimozione del nodo.
Allo stesso modo, quando la policy PDB definisce che nessun pod deve essere non disponibile (.spec.maxUnavailable è 0), la policy impedisce anche l'eliminazione di eventuali nodi associati. Anche se provi a rimuovere un singolo pod alla volta, la policy PDB ti impedisce di eliminare il nodo interessato.
Disabilitare e riabilitare la policy PDB
Per risolvere un conflitto PDB, esegui il backup e poi rimuovi la policy PDB. Una volta eliminato correttamente il PDB, il nodo viene svuotato e i pod associati vengono rimossi. A questo punto puoi apportare le modifiche che vuoi e riattivare la policy PDB.
L'esempio seguente mostra come eliminare un nodo in questa condizione, che può interessare tutti i tipi di cluster Google Distributed Cloud: cluster di amministrazione, ibridi, autonomi e utente.
La stessa procedura generale funziona per tutti i tipi di cluster. Tuttavia, i comandi specifici per l'eliminazione di un nodo da un nodepool del cluster di amministrazione (per cluster di amministrazione, ibridi o autonomi) variano leggermente rispetto ai comandi per l'eliminazione di un nodo da un nodepool del cluster utente.
Per facilitare la lettura, nei comandi seguenti viene utilizzata la variabile
${KUBECONFIG}.A seconda del tipo di cluster, esporta il percorso kubeconfig del cluster di amministrazione (
ADMIN_KUBECONFIG) o il percorso kubeconfig del cluster utente (USER_CLUSTER_CONFIG) in$(KUBECONFIG)e completa i seguenti passaggi:- Per eliminare un nodo da un cluster utente, 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 utente, imposta
(Facoltativo) Se stai eliminando un nodo da un nodepool del cluster utente, esegui il comando seguente 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_CONFIGSostituisci le seguenti voci con informazioni specifiche per l'ambiente del cluster:
ADMIN_KUBECONFIG: il percorso del file kubeconfig del cluster di amministrazione.CLUSTER_NAME: il nome del cluster di cui vuoi creare uno snapshot.USER_CLUSTER_CONFIG: il percorso del file di configurazione del cluster utente.
Dopo aver rimosso il nodo dal pool di nodi, controlla lo stato del nodo. Il nodo interessato indica
Ready, SchedulingDisabled:kubectl get nodes --kubeconfig ${KUBECONFIG}Lo stato del nodo è simile all'output di esempio seguente:
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.6600Controlla i PDB nel cluster:
kubectl get pdb --kubeconfig ${KUBECONFIG} -AIl sistema segnala PDB simili a quelli mostrati nell'output di 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 19mIspeziona 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 il nodo correttamente:
kubectl --kubeconfig ${KUBECONFIG} get pdb log-aggregator -n kube-system -o 'jsonpath={.spec}'Il sistema restituisce i risultati delle etichette corrispondenti nella policy PDB:
{"maxUnavailable":0,"selector":{"matchLabels":{"app":"stackdriver-log-aggregator"}}}Trova i pod che corrispondono all'etichetta della policy 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 che corrispondono all'etichetta PDB e verifica la policy PDB che devi rimuovere:
stackdriver-log-aggregator-0 CP3 stackdriver-log-aggregator-1 CP3Dopo aver confermato il pod interessato, crea una copia di backup della policy PDB. L'esempio seguente esegue il backup della policy
log-aggregator:kubectl get pdb log-aggregator --kubeconfig ${KUBECONFIG} -n kube-system \ -o yaml >> log-aggregator.yamlElimina la policy PDB specifica. Anche in questo caso, gli esempi seguenti eliminano la policy
log-aggregator:kubectl delete pdb log-aggregator --kubeconfig ${KUBECONFIG} -n kube-systemDopo aver eliminato la policy 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 il nodo in modo permanente e rimuovere anche le risorse di archiviazione associate al nodo, puoi farlo prima di ripristinare la policy PDB. Per saperne di più, consulta Rimuovere le risorse di archiviazione.
Ripristina la policy PDB dalla copia:
kubectl apply -f log-aggregator.yaml --kubeconfig ${KUBECONFIG}Verifica che i pod eliminati vengano ricreati correttamente. In questo esempio, se erano presenti due pod
stackdriver-log-aggregator-x, vengono ricreati:kubectl get pods -o wide --kubeconfig ${KUBECONFIG} -ASe vuoi ripristinare il nodo, modifica la configurazione del nodepool appropriata e ripristina l'indirizzo IP del nodo.
Rimuovere le risorse di archiviazione dai nodi eliminati in modo permanente
Se elimini un nodo in modo permanente e non vuoi ripristinarlo nel sistema, puoi anche eliminare le risorse di archiviazione associate a quel nodo.
Controlla e recupera 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_NAMEcon il nome del volume permanente da eliminare.
Passaggi successivi
Se hai bisogno di ulteriore assistenza, contatta