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:
- Assicurarsi di avere l'accesso al cluster AWS EKS.
- Utilizzare il comando
kubectl delete namespace <namespace>
per eliminare il namespace bloccato. - Attendere qualche minuto per vedere se il namespace veniva effettivamente eliminato.
- 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
- 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:
- Nome del namespace da eliminare nella variabile
TERMINATING_NAMESPACE
. - Ottiene le informazioni del namespace in formato JSON utilizzando il comando:
-
kubectl get namespace ${TERMINATING_NAMESPACE} -o json
. jq
rimuove i finalizzatori dal JSON ottenuto.- 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
Posta un commento