Ir para o conteúdo

Como soluciono problemas de pods e namespaces bloqueados em clusters do Amazon EKS?

6 minuto de leitura
0

Não consigo excluir meus pods ou namespaces no meu cluster do Amazon Elastic Kubernetes Service (Amazon EKS). Os pods ou namespaces estão presos no status Encerrando.

Breve descrição

Depois de excluir um pod ou namespace no Amazon EKS, o recurso entra no status Encerrando. Se esse processo não for concluído, você deverá resolver o problema manualmente.

Os pods podem apresentar problemas de encerramento por qualquer um dos seguintes motivos:

  • Os finalizadores evitam a exclusão
  • O pod não responde aos sinais de encerramento
  • Os hooks PreStop falham ou o serviço terminationGracePeriodSeconds se estende por muito tempo
  • Interrupções na rede bloqueiam os nós de processamento e a comunicação do ambiente de gerenciamento
  • O alto uso de recursos afeta os nós de processamento

Os namespaces podem apresentar problemas de encerramento por qualquer um dos seguintes motivos:

  • O Kubernetes não pode excluir recursos específicos
  • Os servidores de API registram um status Falso
  • Os finalizadores evitam a exclusão

Resolução

Use as seções a seguir para solucionar problemas de pod ou namespace bloqueados.

Solucionar problemas com os pods bloqueados

Conclua as tarefas a seguir para solucionar problemas de pods bloqueados.

Verificar o status do pod

Conclua as etapas a seguir:

  1. Para verificar os logs do kubelet no nó afetado, execute o seguinte comando:

    kubectl get pods -A --field-selector=status.phase==Terminating -o wide
  2. Consulte a coluna NODE na saída para identificar os nós afetados. Se todos os pods bloqueados estiverem no mesmo nó, execute o seguinte comando journalctl para verificar os logs do kubelet no nó afetado:

    journalctl -u kubelet
  3. Reinicie o kubelet.

Verificar os finalizadores do Pod

Para verificar os finalizadores, execute o seguinte comando:

kubectl get pod POD_NAME -n NAMESPACE -o yaml

Observação: substitua POD_NAME pelo nome do seu pod. Substitua NAMESPACE pelo nome do namespace em que seu pod está localizado.

Se os finalizadores estiverem presentes, execute um dos seguintes comandos:

Para uma remoção simples, use o seguinte comando:

kubectl patch pod POD_NAME -n NAMESPACE -p '{"metadata":{"finalizers":null}}'

Ou, se seu ambiente exigir operações de patch JSON ou você preferir uma sintaxe mais detalhada, use o seguinte comando:

kubectl patch pod POD_NAME -n NAMESPACE --type=json -p '[{"op": "remove", "path": "/metadata/finalizers" }]'

Observação: substitua POD_NAME pelo nome do seu pod. Substitua NAMESPACE pelo nome do namespace em que seu pod está localizado.

Forçar a exclusão do pod

Importante: é uma prática recomendada usar essa opção somente se outros métodos não conseguirem evitar a perda ou violação de dados.

Para forçar a exclusão do pod, execute o seguinte comando:

kubectl delete pod POD_NAME -n NAMESPACE --grace-period=0 --force

Observação: substitua POD_NAME pelo nome do seu pod e NAMESPACE pelo nome do seu namespace onde seu pod está localizado.

Solucionar problemas de namespaces bloqueados

Conclua as tarefas a seguir para solucionar problemas de namespaces bloqueados.

Verificar o status do namespace

Quando um namespace fica preso no status Encerrando, ele pode conter recursos que o Kubernetes não pode excluir. Ou um serviço de API pode ter um status Falso.

Execute o comando a seguir para verificar o status do seu namespace:

kubectl describe namespace NAMESPACE

Observação: substitua NAMESPACE pelo nome do seu namespace bloqueado.

Encontrar e remover os recursos restantes

Se os recursos permanecerem no namespace, você receberá a seguinte mensagem de erro:

"NamespaceContentRemaining: Some resources are remaining: serviceaccounts has 2 resource instances"

Para listar os recursos restantes, execute o seguinte comando:

kubectl api-resources --verbs=list --namespaced -o name | xargs -n 1 kubectl get --show-kind --ignore-not-found -n NAMESPACE

Observação: substitua NAMESPACE pelo nome do seu namespace.

Em seguida, execute o seguinte comando para remover os recursos identificados:

kubectl delete RESOURCE_TYPE RESOURCE_NAME -n NAMESPACE

Observação: substitua RESOURCE_TYPE pelo tipo de recurso, RESOURCE_NAME pelo nome do recurso e NAMESPACE pelo seu namespace.

Remover finalizadores de namespace

Se os finalizadores ainda estiverem anexados, você receberá a seguinte mensagem de erro:

"NamespaceFinalizersRemaining: Some content in the namespace has finalizers remaining: kubernetes.io/persistent-volume-provisioner in 1 resource instance"

Para remover finalizadores de namespace, é possível executar um comando patch, usar um arquivo JSON ou forçar a exclusão do namespace.

Para remover finalizadores com uma operação patch, execute o seguinte comando:

kubectl patch namespace NAMESPACE --type=json -p '[{"op": "remove", "path": "/metadata/finalizers" }]'

Observação: substitua NAMESPACE pelo nome do seu namespace bloqueado.

Para usar um arquivo JSON, conclua as seguintes etapas:

  1. Execute o comando a seguir para criar o arquivo de configuração do namespace:
    kubectl get namespace TERMINATING_NAMESPACE -o json > tempfile.json
    Observação: substitua TERMINATING_NAMESPACE pelo nome do seu namespace bloqueado.
  2. Remova a matriz de finalizadores da seção spec do arquivo JSON.
  3. Para aplicar as alterações, execute o seguinte comando:
    kubectl replace --raw "/api/v1/namespaces/TERMINATING_NAMESPACE/finalize" -f ./tempfile.json
    Observação: substitua TTERMINATING_NAMESPACE pelo nome do seu namespace bloqueado.
  4. Verifique se o namespace foi removido. Execute o seguinte comando:
    kubectl get namespaces

Para forçar a exclusão do namespace, execute o seguinte comando:

kubectl delete namespace NAMESPACE --grace-period=0 --force

Observação: substitua NAMESPACE pelo nome do seu namespace bloqueado. É uma prática recomendada usar essa opção somente se outros métodos não conseguirem evitar a perda ou violação de dados.

Limpar recursos personalizados

Se os recursos permanecerem no namespace, execute o seguinte comando:

kubectl api-resources --verbs=list --namespaced -o name | xargs -n 1 kubectl get --show-kind --ignore-not-found -n NAMESPACE

Observação: substitua NAMESPACE pelo nome do seu namespace.

Se você identificar recursos personalizados, execute o seguinte comando para removê-los:

kubectl delete RESOURCE_TYPE RESOURCE_NAME -n NAMESPACE

Observação: substitua RESOURCE_TYPE pelo tipo de recurso, RESOURCE_NAME pelo nome do recurso e NAMESPACE pelo seu namespace.

Execute o comando a seguir para remover os finalizadores de recursos personalizados:

kubectl patch RESOURCE_TYPE RESOURCE_NAME -n NAMESPACE -p '{"metadata":{"finalizers":null}}' --type=merge

Observação: substitua RESOURCE_TYPE pelo tipo de recurso. Substitua RESOURCE_NAME pelo nome do recurso. Substitua NAMESPACE pelo seu namespace.

Em seguida, execute o seguinte comando para remover CustomResourceDefinitions:

kubectl delete crd CRD_NAME

Observação: substitua CRD_NAME pelo nome de CustomResourceDefinition. Remova somente CustomResourceDefinitions que você não precisa mais.

AWS OFICIALAtualizada há 6 meses