Kubernetes: Delete terminating namespace

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

Conclusión

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.

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Google photo

You are commenting using your Google account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s