Solucionar problemas con espacios de nombres que se quedan en el estado Terminating


En esta página se explica cómo resolver problemas con un espacio de nombres que se ha quedado en el estado Terminating.

Los espacios de nombres usan finalizadores de Kubernetes para evitar que se eliminen si aún existen uno o varios recursos en un espacio de nombres. Cuando eliminas un espacio de nombres con el comando kubectl delete, el espacio de nombres pasa al estado Terminating. El espacio de nombres permanece en el estado Terminating hasta que Kubernetes elimina sus recursos dependientes y borra todos los finalizadores. El controlador del ciclo de vida del espacio de nombres primero enumera todos los recursos del espacio de nombres que GKE debe eliminar.

Si GKE no puede eliminar un recurso dependiente o si el controlador del ciclo de vida del espacio de nombres no puede verificar que el espacio de nombres está vacío, el espacio de nombres permanece en el estado Terminating hasta que resuelva el problema.

Para resolver un espacio de nombres que se ha quedado en el estado Terminating, identifique y elimine los componentes que no funcionen correctamente y que impidan la eliminación. Prueba estas soluciones en orden:

  1. Busca y elimina servicios de API no disponibles.
  2. Busca y elimina los recursos restantes.
  3. Elimina el espacio de nombres por la fuerza.

Buscar y quitar servicios de API no disponibles

  1. Mostrar los servicios de API no disponibles:

    kubectl get apiservice | grep False
    
  2. Soluciona los problemas de los servicios que no responden:

    kubectl describe apiservice API_SERVICE
    

    Sustituye API_SERVICE por el nombre del servicio que no responde.

  3. Comprueba si el estado del espacio de nombres sigue siendo Terminating:

    kubectl get ns | grep Terminating
    

Buscar y eliminar los recursos restantes

  1. Lista todos los recursos que quedan en el espacio de nombres que se va a terminar:

    kubectl api-resources --verbs=list --namespaced -o name | xargs -n 1 kubectl get -n NAMESPACE
    

    Sustituye NAMESPACE por el nombre del espacio de nombres que quieras eliminar.

  2. Elimina los recursos que se muestren en el resultado.

  3. Comprueba si el estado del espacio de nombres sigue siendo Terminating:

    kubectl get ns | grep Terminating
    

Eliminar el espacio de nombres por la fuerza

Elimina los finalizadores que impiden la eliminación del espacio de nombres para forzar la finalización del espacio de nombres:

  1. Guarda el manifiesto del espacio de nombres como un archivo YAML:

    kubectl get ns NAMESPACE -o yaml > ns-terminating.yml
    
  2. Abre el archivo de manifiesto en un editor de texto y elimina todos los valores del campo spec.finalizers:

    vi ns-terminating.yml
    
  3. Verifica que el campo finalizers esté vacío:

    cat ns-terminating.yml
    

    La salida debería ser similar a la siguiente:

    apiVersion: v1
    kind: Namespace
    metadata:
      annotations:
      name: NAMESPACE
    spec:
      finalizers:
    status:
      phase: Terminating
    
  4. Inicia un proxy HTTP para acceder a la API de Kubernetes:

    kubectl proxy
    
  5. Sustituye el manifiesto del espacio de nombres con curl:

    curl -H "Content-Type: application/yaml" -X PUT --data-binary @ns-terminating.yml http://127.0.0.1:8001/api/v1/namespaces/NAMESPACE/finalize
    
  6. Comprueba si el estado del espacio de nombres sigue siendo Terminating:

    kubectl get ns | grep Terminating
    

Siguientes pasos