Resolva problemas de espaço de nomes bloqueado no estado de encerramento


Esta página mostra como resolver problemas com um espaço de nomes bloqueado no estado Terminating.

Os namespaces usam finalizadores do Kubernetes para impedir a eliminação se ainda existirem um ou mais recursos num namespace. Quando elimina um espaço de nomes através do comando kubectl delete, o espaço de nomes entra no estado Terminating. O espaço de nomes permanece no estado Terminating até o Kubernetes eliminar os respetivos recursos dependentes e limpar todos os finalizadores. O controlador do ciclo de vida do espaço de nomes lista primeiro todos os recursos no espaço de nomes que o GKE precisa de eliminar.

Se o GKE não conseguir eliminar um recurso dependente, ou se o controlador do ciclo de vida do espaço de nomes não conseguir validar que o espaço de nomes está vazio, o espaço de nomes permanece no estado Terminating até resolver o problema.

Para resolver um espaço de nomes bloqueado no estado Terminating, identifique e remova todos os componentes não íntegros que estejam a bloquear a eliminação. Experimente estas soluções por ordem:

  1. Encontre e remova serviços de API indisponíveis.
  2. Localize e remova os recursos restantes.
  3. Forçar a eliminação do espaço de nomes.

Encontre e remova serviços de API indisponíveis

  1. Liste os serviços de API indisponíveis:

    kubectl get apiservice | grep False
    
  2. Resolva problemas de serviços que não respondem:

    kubectl describe apiservice API_SERVICE
    

    Substitua API_SERVICE pelo nome do serviço que não responde.

  3. Verifique se o estado do espaço de nomes ainda é Terminating:

    kubectl get ns | grep Terminating
    

Encontre e remova os recursos restantes

  1. Liste todos os recursos restantes no espaço de nomes de terminação:

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

    Substitua NAMESPACE pelo nome do espaço de nomes que quer eliminar.

  2. Remova todos os recursos apresentados na saída.

  3. Verifique se o estado do espaço de nomes ainda é Terminating:

    kubectl get ns | grep Terminating
    

Forçar a eliminação do espaço de nomes

Remova os finalizadores que bloqueiam a eliminação do espaço de nomes para forçar a terminação do espaço de nomes:

  1. Guarde o manifesto do espaço de nomes como um ficheiro YAML:

    kubectl get ns NAMESPACE -o yaml > ns-terminating.yml
    
  2. Abra o manifesto num editor de texto e remova todos os valores no campo spec.finalizers:

    vi ns-terminating.yml
    
  3. Verifique se o campo finalizers está vazio:

    cat ns-terminating.yml
    

    O resultado deve ser semelhante ao seguinte:

    apiVersion: v1
    kind: Namespace
    metadata:
      annotations:
      name: NAMESPACE
    spec:
      finalizers:
    status:
      phase: Terminating
    
  4. Inicie um proxy HTTP para aceder à API Kubernetes:

    kubectl proxy
    
  5. Substitua o manifesto do espaço de nomes através de 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. Verifique se o estado do espaço de nomes ainda é Terminating:

    kubectl get ns | grep Terminating
    

O que se segue?