
Seguro que en alguna que en otra ocasión, al tratar de borrar un namespace, este se ha quedado en estado “terminating” sin llegar a finalizar nunca.
En el presente artículo se pretende describir los pasos a realizar para dar solución a la problemática descrita.
Caso de uso
Se dispone de una cluster de Kubernetes en el que uno de los namespaces se encuentra en estado “terminating”, tras haber tratado de eliminarlo.
Solución
Lo primero de todo es asegurarse de que todos los Pods han sido eliminados. En caso de que alguno de ellos se encuentre en también en estado “terminating”, ejecutar el siguiente comando:
kubectl delete pod --all --grace-period=0 --force --namespace <NAMESPACE>
Si no es el caso o no ha dado resultado, será necesario editar manualmente el estado del namespaces. Para ello, lo primero es descargar a disco la configuración del citado namespace:
kubectl get namespace <NAMESPACE> -o json > namespace.json
Una vez descargado, se debe eliminar del fichero el contenido del array de “finalizers”.
Antes:
{
"apiVersion": "v1",
"kind": "Namespace",
"metadata": {
...
},
"spec": {
"finalizers": [
...
]
},
"status": {
"phase": "Terminating"
}
}
Después:
{
"apiVersion": "v1",
"kind": "Namespace",
"metadata": {
...
},
"spec": {
"finalizers": []
},
"status": {
"phase": "Terminating"
}
}
Finalmente, no queda mas que subir el fichero editado a través de la API de Kubernetes, para lo cual lo más rápido es establecer un proxy server con el API server.
# Start a proxy server to Kubernetes API server
kubectl proxy --port=8080
# Apply namespace changes
curl -k -H "Content-Type: application/json" -X PUT --data-binary @namespace.json http://127.0.0.1:8080/api/v1/namespaces/<NAMESPACE>/finalize
Conclusiones
En conclusión, para acabar con un namespace en estado “terminating” no hay mas que tratar de acabar con aquellos Pods que también se hubieran quedado bloqueados. En caso de que no diese resultado, será necesario editar manualmente el estado del namespace y aplicarlo a través del API server de Kubernetes.