Como posso solucionar problemas de atualização de grupos de nós gerenciados no Amazon EKS?

Última atualização: 02/03/2023

Estou tentando atualizar meu grupo de nós gerenciados do Amazon Elastic Kubernetes Service (Amazon EKS) e estou enfrentando problemas.

Breve descrição

Ao atualizar seu grupo de nós gerenciados do Amazon EKS, você pode ver um dos seguintes erros:

  • "PodVictionFailure atingiu o máximo de tentativas ao tentar retirar pods dos nós no grupo de nós nodegroup-1234"
  • “Erro: a integridade do grupo de nós tem outros problemas além de falhas de inicialização de instância do ASG, limite de instância excedido, endereços livres insuficientes, ClusterUnreachable”
  • “Erro: InvalidParameterException: os detalhes do modelo de inicialização não podem ser nulos para o grupo de nós do tipo AMI personalizado”

          -ou-

         “Ocorreu um erro (InvalidParameterException) ao chamar a operação UpdateNodeGroupVersion: você não pode especificar o campo KubernetesVersion ao usar AMIs personalizadas”

  • “UPDATE_FAILED O manipulador de recursos retornou a mensagem: a versão 1.xx da versão solicitada não é válida para a versão 1.yy do kubernetes”

Resolução

Para resolver erros de atualização do grupo de nós gerenciados do Amazon EKS, siga estas etapas de solução de problemas.

Observação: se receber erros ao executar comandos da AWS Command Line Interface (AWS CLI), verifique se está usando a versão mais recente da AWS CLI.

PodVictionFailure Alcançou o máximo de tentativas ao tentar retirar os pods dos nós no grupo de nós nodegroup-1234

O erro PodVictionFailure ocorre quando a atualização não consegue retirar todos os pods do nó. Se um orçamento de interrupção do pod (PDB) estiver impedindo que os pods sejam retirados do nó, isso pode causar o problema. Por exemplo, se um aplicativo tiver um PDB de dois, pelo menos dois pods desse aplicativo deverão estar em execução.

Para verificar se seu aplicativo está usando um PDB, execute o seguinte comando kubectl:

$ kubectl get pdb —all-namespaces

Se você estiver usando um PDB, execute uma das seguintes ações:

A opção de atualização forçada não reconhece PDBs. As atualizações ocorrem independentemente dos problemas do PDB, forçando a reinicialização do nó.

Observação: se os pods de um controlador Kubernetes não estiverem espalhados pelos nós, essa opção poderá causar tempo de inatividade para seus aplicativos.

Para usar a opção forçar, execute o comando AWS CLI semelhante ao seguinte:

$ aws eks update-nodegroup-version --cluster-name cluster-123 --nodegroup-name nodegroup-1234 --force

-ou-

Execute o seguinte comando eksctl:

$ eksctl upgrade nodegroup --cluster OneCluster --name managed-ng --force-upgrade

Solução de problemas de falhas de remoção do PodDisruptionBudget com o CloudWatch Logs Insights

Você pode usar o Amazon CloudWatch Logs Insights para pesquisar os dados de log do ambiente de gerenciamento do EKS. Para obter mais informações, consulte Análise de dados de log com o CloudWatch Logs Insights.

Importante: você pode visualizar eventos de log no CloudWatch Logs somente depois de ativar o registro em log do ambiente de gerenciamento em um cluster. Antes de selecionar um intervalo de tempo para executar consultas no CloudWatch Logs Insights, verifique se você ativou o registro em log do ambiente de gerenciamento. Para mais informações, consulte Como posso recuperar os logs do ambiente de gerenciamento do Amazon EKS do CloudWatch Logs?

Para identificar o pod que falhou na remoção e a contagem de falhas, execute uma consulta semelhante à seguinte:

fields @timestamp, @message 
| stats count(*) as count by objectRef.name
| filter @logStream like /audit/ 
| filter user.username == "eks:node-manager" and requestURI like "eviction" and requestURI like "pod" and responseStatus.code > 400
| sort count desc

O número máximo de tentativas para um pod de remoção é 20. Se a contagem de um pod exibido for maior ou igual a 20 falhas, esse é o pod que falhou na remoção.

Para identificar o nome do orçamento de interrupção do pod que está impedindo que o pod anterior seja despejado, execute a consulta a seguir.

filter @logStream like /^kube-apiserver-audit/
  | fields @logStream, @timestamp, @message
  | sort @timestamp desc
  | filter user.username == "eks:node-manager" and requestURI like "eviction" and requestURI like "pod_name" and responseStatus.code > 400
  | limit 999
  | display responseObject.details.causes.0.message,objectRef.name,objectRef.namespace,objectRef.resource

Observação: Substitua pod_name pelo nome do seu pod.

A saída tem uma mensagem semelhante à seguinte, em que pod_distruption_budget é o objeto que está causando as falhas de remoção:

The disruption budget pod_distruption_budget needs 1 healthy pods and has 1 currently

Erro: a integridade do grupo de nós tem outros problemas além de AsgInstanceLaunchFailures, InstanceLimitExceeded, InsufficientFreeAddresses, ClusterUnreachable

Se você receber essa mensagem de erro, verifique os detalhes do grupo de nós gerenciados e localize os problemas de funcionamento. Para obter mais informações e solucionar problemas, verifique os erros do grupo de nós gerenciados e a referência da API de problemas do Amazon EKS.

Erro: InvalidParameterException: os detalhes do modelo de inicialização não podem ser nulos para o grupo de nós do tipo AMI personalizado

-ou-

Ocorreu um erro (InvalidParameterException) ao solicitar a operação UpdateNodeGroupVersion: você não pode especificar o campo KubernetesVersion ao usar AMIs personalizadas.

Para grupos de nós gerenciados com uma AMI personalizada, você deve criar uma nova versão da AMI com a versão do Kubernetes para a qual deseja fazer a atualização. Durante a atualização, especifique o modelo de inicialização e a versão.

Se você estiver usando o AWS CLI, use o sinalizador --launch-template. Para eksctl, use o sinalizador --launch-template-version.

Observação: evite usar o sinalizador --kubernetes-version com esses comandos.

UPDATE_FAILED O manipulador de recursos retornou a mensagem: “A versão 1.xx da versão solicitada não é válida para a versão 1.yy do kubernetes”

Esse erro ocorre ao atualizar o grupo de nós gerenciados com o cluster Amazon EKS da mesma pilha do AWS CloudFormation com a solicitação de API UpdateStack.

O CloudFormation tenta reverter a pilha, mas falha porque o cluster Amazon EKS foi atualizado com sucesso e não pode ser revertido. O cluster Amazon EKS não pode combinar 1.xx com 1.yy (por exemplo, 1,21 e 1,22).

Verifique o primeiro erro que ocorreu no grupo de nós na pilha do CloudFormation para obter mais detalhes sobre como corrigir o problema. Em seguida, atualize sua pilha do CloudFormation novamente.

Para obter mais informações, consulte Erros de grupos de nós gerenciados.