Risolvere il Problema di un Namespace Bloccato su "Terminating" su AWS EKS

Risolvere il Problema di un Namespace Bloccato su "Terminating" su AWS EKS

Se sei un amministratore di sistema o un DevOps engineer che lavora con Kubernetes su AWS Elastic Kubernetes Service (EKS), potresti aver incontrato la seguente problematica: un namespace che rimane bloccato sulla fase "terminating". Questa è una situazione comune che può verificarsi quando si cerca di eliminare un namespace e i finalizzatori (finalizers) associati non vengono rimossi correttamente. 

Il Problema

In un ambiente Kubernetes, i namespace vengono utilizzati per isolare risorse e applicazioni all'interno di un cluster. Tuttavia, quando è necessario rimuovere un namespace, è possibile imbattersi in un problema noto come "terminating namespace". In questa situazione, il namespace sembra non voler essere eliminato e rimane in uno stato di "terminating" indefinitamente.

Seguire la Documentazione Ufficiale

La prima cosa che ho fatto quando ho incontrato questo problema è stata cercare una soluzione nella documentazione ufficiale di AWS. Lì ho trovato una procedura che sembrava risolvere il problema. La procedura suggerita era la seguente:

  1. Assicurarsi di avere l'accesso al cluster AWS EKS.
  2. Utilizzare il comando kubectl delete namespace <namespace> per eliminare il namespace bloccato.
  3. Attendere qualche minuto per vedere se il namespace veniva effettivamente eliminato.
  4. Se il namespace non veniva eliminato, è stato consigliato di eseguire il comando, per ottenere le informazioni sul namespace in formato JSON
    • kubectl get namespace <namespace> -o json 
  5. Quindi, dovevo rimuovere manualmente i finalizzatori dal JSON ottenuto e quindi applicare le modifiche utilizzando il comando kubectl replace --raw.

Questa sembrava una soluzione promettente, ma purtroppo, quando ho cercato di seguirlo passo dopo passo, il mio namespace rimaneva ancora bloccato su "terminating".

La Soluzione

        
            TERMINATING_NAMESPACE=bad-namespace-here
            echo "Force Terminating: ${TERMINATING_NAMESPACE}..."
            echo "${TERMINATING_NAMESPACE}" != ""
            kubectl get namespace ${TERMINATING_NAMESPACE} -o json | jq 'del(.metadata.finalizers)' | kubectl replace --raw "/api/v1/namespaces/${TERMINATING_NAMESPACE}/finalize" -f -
        
    

Se dopo aver eseguito la seguente guida: https://repost.aws/knowledge-center/eks-terminated-namespaces, il vostro namespace non viene cancellato, allora potrebbe essere necessario eseguire anche lo script sopra indicato.

Il campo metadata, in alcuni casi può contenere informazioni sui finalizzatori, che impediscono la rimozione come nel mio caso. 

Questo script ha forzato l'eliminazione del namespace bloccato. Ecco come funziona:

  1. Nome del namespace da eliminare nella variabile TERMINATING_NAMESPACE.
  2. Ottiene le informazioni del namespace in formato JSON utilizzando il comando:
    •  kubectl get namespace ${TERMINATING_NAMESPACE} -o json.
  3. jq rimuove i finalizzatori dal JSON ottenuto.
  4. Infine, con il comando:
    • kubectl replace --raw
      sono state applicate le modifiche e forzare l'eliminazione del namespace.

Con le opportune modifiche è possibile utilizzare lo stesso approccio anche su altri componenti che possono rimanere bloccati, spesso succede spesso anche con gli Ingress.

Commenti