Rimuovi i nodi bloccati da PodDisruptionBudgets

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

Se hai bisogno di ulteriore aiuto, contatta l'assistenza clienti Google Cloud.

PDB in conflitto con il numero di pod disponibili

I criteri PDB aiutano a garantire le prestazioni dell'app impedendo l'arresto dei pod contemporaneamente quando apporti modifiche al sistema. Di conseguenza, i criteri PDB limitano il numero di pod contemporaneamente non disponibili in un'applicazione replicata.

Tuttavia, il criterio PDB a volte può impedire l'eliminazione dei nodi che vuoi eseguire se violi il criterio rimuovendo un nodo.

Ad esempio, un criterio PDB può definire che nel sistema siano sempre disponibili due pod (.spec.minAvailable è 2). Tuttavia, se hai solo due pod e provi a rimuovere il nodo che ne contiene uno, il criterio PDB entra in vigore e impedisce la rimozione del nodo.

Allo stesso modo, 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 tenti di rimuovere un singolo 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, il nodo viene svuotato e i pod associati vengono rimossi. Puoi quindi apportare le modifiche desiderate e riattivare il criterio PDB.

L'esempio seguente mostra come eliminare un nodo in questa condizione, che può interessare tutti i tipi di cluster Google Distributed Cloud: cluster amministrativi, ibridi, autonomi e utente.

La stessa procedura generale funziona per tutti i tipi di cluster. Tuttavia, i comandi specifici per eliminare un nodo da un pool di nodi del cluster di amministrazione (per i cluster di amministrazione, ibridi o autonomi) sono leggermente diversi da quelli per l'eliminazione di un nodo da un pool di nodi del cluster utente.

  1. Per facilitare la lettura, la variabile ${KUBECONFIG} viene utilizzata nei seguenti comandi.

    A seconda del tipo di cluster, esporta il percorso kubeconfig (ADMIN_KUBECONFIG) o kubeconfig (USER_CLUSTER_CONFIG) del cluster di amministrazione in $(KUBECONFIG) e completa questi passaggi:

    • Per eliminare un nodo da un cluster utente, imposta export KUBECONFIG=USER_CLUSTER_CONFIG
    • Per eliminare il nodo da un cluster di amministrazione, imposta export KUBECONFIG=ADMIN_KUBECONFIG.
  2. (Facoltativo) Se stai eliminando un nodo da un pool di nodi del cluster utente, esegui questo 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 l'ambiente del tuo cluster:

    • ADMIN_KUBECONFIG: il percorso del file kubeconfig del cluster di amministrazione.
    • CLUSTER_NAME: il nome del cluster di cui vuoi acquisire uno snapshot.
    • USER_CLUSTER_CONFIG: il percorso del file di configurazione del cluster utente.
  3. Dopo aver rimosso il nodo dal pool di nodi, controlla lo stato del nodo. Il nodo interessato riporta 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 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                     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 garantisce di disabilitare 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 nel criterio 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 che corrispondono all'etichetta PDB e verifica il criterio PDB che devi 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 seguente esegue il backup del criterio 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, i seguenti esempi eliminano il criterio log-aggregator:

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

    Dopo aver eliminato il criterio PDB, lo svuotamento del nodo viene eseguito. Tuttavia, l'eliminazione completa del nodo può richiedere fino a 30 minuti. Continua a controllare lo stato del nodo per confermare che il processo sia stato completato correttamente.

    Se vuoi rimuovere il nodo in modo permanente e anche le risorse di archiviazione associate al nodo, 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 siano stati ricreati correttamente. In questo esempio, se erano 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 ripristina l'indirizzo IP del nodo.

Rimuovi 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 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 l'oggetto 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 aiuto, contatta l'assistenza clienti Google Cloud.