Rimuovi i nodi bloccati da PodDisruptionBudget

In determinate condizioni, PodDisruptionBudget (PDB) possono impedire la corretta rimozione dei nodi dai pool di nodi. In queste condizioni, lo stato del nodo viene segnalato come Ready,SchedulingDisabled nonostante sia stato rimosso. Questo documento mostra come rimuovere i nodi da Cluster Google Distributed Cloud attualmente bloccati da problemi di PDB.

Questa pagina è rivolta agli amministratori, agli architetti e agli operatori che gestiscono ciclo di vita dell'infrastruttura tecnica sottostante e rispondere ad avvisi e pagine quando gli obiettivi del livello di servizio (SLO) non vengono soddisfatti o le applicazioni non vanno a buon fine. 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 le prestazioni dell'app impedendo l'arresto dei pod nello stesso momento in cui 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 dovrebbero essere sempre presenti due pod disponibile nel sistema (.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 disponibile (.spec.maxUnavailable è 0), il criterio impedisce anche eventuali nodi associati non vengano eliminate. Anche se provi a rimuovere un solo pod alla volta, il criterio PDB 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 il Il PDB viene eliminato, il nodo svuota e i pod associati vengono rimosso. 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.

  1. Per facilitare la lettura, la variabile ${KUBECONFIG} viene utilizzata in: tramite comandi SQL.

    A seconda del tipo di cluster, esporta kubeconfig del cluster di amministrazione (ADMIN_KUBECONFIG) o kubeconfig del cluster utente (USER_CLUSTER_CONFIG) percorso verso $(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.
  2. (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 voci seguenti con informazioni specifiche per il tuo cluster questo ambiente:

    • ADMIN_KUBECONFIG: il percorso dell'amministratore kubeconfig del cluster.
    • 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.
  3. 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
    
  4. Controlla i PDB nel cluster:

    kubectl get pdb --kubeconfig ${KUBECONFIG} -A
    

    Il sistema genera report sui PDB simili a quelli mostrati nell'esempio seguente output:

    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
    
  5. Esamina 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"}}}
    
  6. Trova i pod che corrispondono all'etichetta del criterio 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
    
  7. 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
    
  8. Elimina il criterio PDB specifico. Anche in questo caso, gli esempi riportati di seguito eliminano il criteriolog-aggregator:

    kubectl delete pdb log-aggregator --kubeconfig ${KUBECONFIG} -n kube-system
    

    Dopo aver eliminato il criterio PDB, il nodo procede allo svuotamento. Tuttavia, può l'eliminazione completa del nodo può richiedere fino a 30 minuti. Continua a controllare per confermare che il processo è stato completato 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.

  9. Ripristina il criterio PDB dalla tua copia:

    kubectl apply -f log-aggregator.yaml --kubeconfig ${KUBECONFIG}
    
  10. Verifica che i pod eliminati vengano ricreati correttamente. In questo esempio, se esistono due pod stackdriver-log-aggregator-x, vengono ricreati:

    kubectl get pods -o wide --kubeconfig ${KUBECONFIG} -A
    
  11. Se vuoi ripristinare il nodo, modifica la configurazione appropriata del pool di nodi e ripristinare l'indirizzo IP del nodo.

Rimuovi le risorse di archiviazione dai nodi eliminati definitivamente

Se elimini definitivamente un nodo e non vuoi ripristinarlo nel tuo sistema, puoi anche eliminare le risorse di archiviazione associate a quel nodo.

  1. 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}'
    
  2. Elimina il volume permanente 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 Assistenza clienti Google Cloud.