Resolver problemas de namespaces travados no estado de encerramento


Esta página mostra como resolver problemas com um namespace que está travado no estado Terminating.

Os namespaces usam os finalizadores do Kubernetes para evitar a exclusão se um ou mais recursos em um namespace ainda existirem. Quando você exclui um namespace usando o comando kubectl delete, ele entra no estado Terminating. O namespace fica no estado Terminating até o Kubernetes excluir os recursos dependentes e limpar todos os finalizadores. O controlador de ciclo de vida do namespace começa listando todos os recursos no namespace que o GKE precisa excluir.

Se o GKE não puder excluir um recurso dependente ou se o controlador de ciclo de vida do namespace não puder verificar se ele está vazio, ele vai permanecer no estado Terminating até que você resolva o problema.

Para resolver um namespace travado no estado Terminating, identifique e remova os componentes não íntegros que estão impedindo a exclusão. Tente estas soluções em ordem:

  1. Encontre e remova serviços de API indisponíveis.
  2. Encontre e remova recursos restantes.
  3. Force a exclusão do namespace.

Encontrar e remover serviços de API indisponíveis

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

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

    kubectl describe apiservice API_SERVICE
    

    Troque API_SERVICE pelo nome do serviço que não está respondendo.

  3. Veja se o status do namespace ainda é Terminating:

    kubectl get ns | grep Terminating
    

Encontrar e remover recursos restantes

  1. Liste todos os recursos restantes no namespace em encerramento:

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

    Troque NAMESPACE pelo nome do namespace que você quer excluir.

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

  3. Veja se o status do namespace ainda é Terminating:

    kubectl get ns | grep Terminating
    

Forçar a exclusão do namespace

Remova os finalizadores que impedem a exclusão do namespace para forçar o encerramento dele.

  1. Salve o manifesto a seguir como um arquivo YAML:

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

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

    cat ns-terminating.yml
    

    A resposta será parecida com esta:

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

    kubectl proxy
    
  5. Substitua o manifesto do namespace usando 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. Veja se o status do namespace ainda é Terminating:

    kubectl get ns | grep Terminating
    

A seguir

Se precisar de mais ajuda, entre em contato com o Cloud Customer Care.