Rimozione dei nodi bloccati dal budget per l'interruzione dei pod

In determinate condizioni, i criteri relativi al budget di interruzione dei pod (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.

Il budget per l'interruzione dei pod è 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 effettuare, se rimuovendo un nodo, violeresti il criterio.

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 cerchi di rimuovere il nodo che ne contiene uno, il criterio PDB diventa effettivo e impedisce la rimozione del nodo.

Analogamente, quando il criterio PDB definisce che nessun pod deve essere non disponibile (.spec.maxUnavailable è pari a 0), impedisce anche l'eliminazione di eventuali nodi associati. Anche se provi a rimuovere un singolo pod alla volta, il criterio PDB ti impedisce di eliminare il nodo interessato.

Soluzione alternativa: disattivazione e riattivazione del criterio PDB

Per risolvere questo conflitto, esegui il backup e poi rimuovi il criterio PDB. Una volta eliminato il PDB, il nodo svuota e i pod associati vengono rimossi. Dopo aver apportato le modifiche desiderate, puoi riattivare il criterio PDB.

L'esempio seguente mostra come eliminare un nodo in questa condizione, che può influire su tutti i tipi di cluster GKE su Bare Metal: 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.

Varianti del comando per tipi di cluster diversi

Per facilità di lettura, nota il segnaposto ${KUBECONFIG} nei comandi seguenti. A seconda del tipo di cluster, esporta il percorso kubeconfig (ADMIN_KUBECONFIG) del cluster utente o kubeconfig (USER_CLUSTER_CONFIG) del cluster di amministrazione in $(KUBECONFIG) e segui i passaggi riportati di seguito.

  • Per eliminare un nodo da un cluster utente, export KUBECONFIG=USER_CLUSTER_CONFIG
  • Per eliminare il nodo da un cluster di amministrazione, export KUBECONFIG=ADMIN_KUBECONFIG.
  1. (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. Tieni presente che la variabile ADMIN_KUBECONFIG specifica il percorso del cluster di amministrazione kubeconfig, mentre la variabile USER_CLUSTER_NAME specifica il nome del cluster:

    kubectl --kubeconfig ADMIN_KUBECONFIG -n cluster-USER_CLUSTER_NAME  \
    get secret USER_CLUSTER_NAME-kubeconfig  \
    -o 'jsonpath={.data.value}' | base64 -d > USER_CLUSTER_CONFIG
    
  2. Dopo aver rimosso il nodo dal pool di nodi, controlla lo stato del nodo. I report sui nodi interessati Ready, SchedulingDisabled:

    kubectl get nodes --kubeconfig ${KUBECONFIG}
    

    Lo stato del nodo è simile al seguente:

    NAME        STATUS                    ROLES      AGE      VERSION
    abmnewCP2   Ready                     Master     11m      v.1.18.6-gke.6600
    abmnewCP3   Ready,SchedulingDisabled  <none>     9m22s    v.1.18.6-gke.6600
    abmnewCP4   Ready                     <none>     9m18s    v.1.18.6-gke.6600
    
  3. Controlla i PDB nel cluster:

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

    Il sistema segnala PDB simili a quelli riportati di seguito:

    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
     ```
    
  4. Esamina il PDB. Devi trovare 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"}}}
    
  5. 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 che devi rimuovere:

    stackdriver-log-aggregator-0    abmnewCP3
    stackdriver-log-aggregator-1    abmnewCP3
    
  6. Dopo aver confermato il pod interessato, crea una copia di backup del criterio PDB, in questo caso il criterio log-aggregator:

    kubectl get pdb log-aggregator --kubeconfig ${KUBECONFIG} -n kube-system  \
    -o yaml >> log-aggregator.yaml
    
  7. Elimina il criterio PDB specifico, in questo caso il criterio log-aggregator:

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

    Dopo che hai eliminato il criterio PDB, lo svuotamento del nodo viene eseguito. Tuttavia, l'eliminazione completa del nodo può richiedere fino a 30 minuti, quindi continua a controllare lo stato del nodo.

    Tieni presente che 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. Consulta Rimozione delle risorse di archiviazione.

  8. Ripristina il criterio PDB dalla tua copia:

    kubectl apply -f log-aggregator.yaml --kubeconfig ${KUBECONFIG}
    
  9. Verifica che i pod eliminati siano stati ricreati correttamente. In questo esempio, se erano presenti due pod stackdriver-log-aggregator-x, questi vengono ricreati:

    kubectl get pods -o wide --kubeconfig ${KUBECONFIG} -A
    

Se vuoi ripristinare il nodo, modifica la configurazione appropriata del pool di nodi e ripristina l'indirizzo IP del nodo.

Rimozione delle 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.

Nei seguenti comandi, tieni presente le seguenti variabili:

  • ADMIN-KUBECONFIG specifica il percorso del cluster di amministrazione
  • USER_CLUSTER_CONFIG specifica il percorso del file YAML di configurazione del cluster.
  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}