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:
- Aumente o número de endereços IP disponíveis para seus nós do Amazon Elastic Compute Cloud (Amazon EC2) para aumentar o número de pods.
- Remova temporariamente o PDB.
- Use a opção forçar a atualização.
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.
Informações relacionadas
Este artigo foi útil?
Precisa de ajuda com faturamento ou suporte técnico?