Solucionar problemas de erros UpgradeFailed devido a falhas de remoção causadas por PDBs
Este artigo discute como identificar e resolver erros UpgradeFailed devido a falhas de remoção causadas por PDBs (Orçamentos de Interrupção de Pod) que ocorrem quando você tenta atualizar um cluster do AKS (Serviço de Kubernetes do Azure).
Pré-requisitos
Este artigo requer a CLI do Azure versão 2.67.0 ou posterior. Para localizar o número da versão, execute az --version
. Se você precisar instalar ou atualizar a CLI do Azure, consulte Como instalar a CLI do Azure.
Para obter informações mais detalhadas sobre o processo de atualização, consulte a seção "Atualizar um cluster do AKS" em Atualizar um cluster do AKS (Serviço de Kubernetes do Azure).
Sintomas
Uma operação de atualização de cluster do AKS falha com uma das seguintes mensagens de erro:
-
(Falha na atualização) A drenagem
node aks-<nodepool-name>-xxxxxxxx-vmssxxxxxx
falhou quando o pod<pod-name>
de remoção falhou com o erro Muitas solicitações. Isso geralmente é causado por uma política restritiva de Orçamento de Interrupção de Pod (PDB). Consulte https://aka.ms/aks/debugdrainfailures. Erro original: Não é possível remover o pod, pois isso violaria o orçamento de interrupção do pod. Informações de depuração do PDB:<namespace>/<pod-name>
bloqueado pelo pdb<pdb-name>
com 0 pods não prontos. -
Código: UpgradeFailed
Mensagem: Falha no nó deaks-<nodepool-name>-xxxxxxxx-vmssxxxxxx
drenagem ao remover o pod<pod-name>
com o erro Muitas solicitações. Isso geralmente é causado por uma política restritiva de Orçamento de Interrupção de Pod (PDB). Consulte https://aka.ms/aks/debugdrainfailures. Erro original: Não é possível remover o pod, pois isso violaria o orçamento de interrupção do pod. Informações de depuração do PDB:<namespace>/<pod-name>
bloqueado pelo pdb<pdb-name>
com 0 pods não prontos.
Motivo
Esse erro poderá ocorrer se um pod estiver protegido pela política de Orçamento de Interrupção do Pod (PDB). Nessa situação, o pod resiste a ser drenado e, após várias tentativas, a operação de atualização falha e o cluster/pool de nós entra em um Failed
estado.
Verifique a configuração do PDB: ALLOWED DISRUPTIONS
valor. O valor deve ser 1
ou maior. Para obter mais informações, consulte Planejar a disponibilidade usando orçamentos de interrupção de pod. Por exemplo, você pode verificar a carga de trabalho e seu PDB da seguinte maneira. Você deve observar que a ALLOWED DISRUPTIONS
coluna não permite nenhuma interrupção. Se o ALLOWED DISRUPTIONS
valor for 0
, os pods não serão removidos e a drenagem do nó falhará durante o processo de atualização:
$ kubectl get deployments.apps nginx
NAME READY UP-TO-DATE AVAILABLE AGE
nginx 2/2 2 2 62s
$ kubectl get pod
NAME READY STATUS RESTARTS AGE
nginx-7854ff8877-gbr4m 1/1 Running 0 68s
nginx-7854ff8877-gnltd 1/1 Running 0 68s
$ kubectl get pdb
NAME MIN AVAILABLE MAX UNAVAILABLE ALLOWED DISRUPTIONS AGE
nginx-pdb 2 N/A 0 24s
Você também pode verificar se há entradas em eventos do Kubernetes usando o comando kubectl get events | grep -i drain
. Uma saída semelhante mostra a mensagem "Remoção bloqueada por muitas solicitações (geralmente um pdb)":
$ kubectl get events | grep -i drain
LAST SEEN TYPE REASON OBJECT MESSAGE
(...)
32m Normal Drain node/aks-<nodepool-name>-xxxxxxxx-vmssxxxxxx Draining node: aks-<nodepool-name>-xxxxxxxx-vmssxxxxxx
2m57s Warning Drain node/aks-<nodepool-name>-xxxxxxxx-vmssxxxxxx Eviction blocked by Too Many Requests (usually a pdb): <pod-name>
12m Warning Drain node/aks-<nodepool-name>-xxxxxxxx-vmssxxxxxx Eviction blocked by Too Many Requests (usually a pdb): <pod-name>
32m Warning Drain node/aks-<nodepool-name>-xxxxxxxx-vmssxxxxxx Eviction blocked by Too Many Requests (usually a pdb): <pod-name>
32m Warning Drain node/aks-<nodepool-name>-xxxxxxxx-vmssxxxxxx Eviction blocked by Too Many Requests (usually a pdb): <pod-name>
31m Warning Drain node/aks-<nodepool-name>-xxxxxxxx-vmssxxxxxx Eviction blocked by Too Many Requests (usually a pdb): <pod-name>
Para resolver o problema, use uma das soluções a seguir.
Solução 1: Habilitar a drenagem de pods
Ajuste o PDB para habilitar a drenagem do pod. Geralmente, a interrupção permitida é controlada pelo
Min Available / Max unavailable
parâmetro orRunning pods / Replicas
. Você pode modificar oMin Available / Max unavailable
parâmetro no nível do PDB ou aumentar o número de para enviar o valor deRunning pods / Replicas
Interrupção permitida para 1 ou mais.Tente atualizar novamente o cluster do AKS para a mesma versão para a qual você tentou atualizar anteriormente. Esse processo aciona uma reconciliação.
$ az aks upgrade --name <aksName> --resource-group <resourceGroupName> Are you sure you want to perform this operation? (y/N): y Cluster currently in failed state. Proceeding with upgrade to existing version 1.28.3 to attempt resolution of failed cluster state. Since control-plane-only argument is not specified, this will upgrade the control plane AND all nodepools to version . Continue? (y/N): y
Solução 2: Fazer backup, excluir e reimplantar o PDB
Faça um backup do(s) PDB(s) usando o comando
kubectl get pdb <pdb-name> -n <pdb-namespace> -o yaml > pdb-name-backup.yaml
e exclua o PDB usando o comandokubectl delete pdb <pdb-name> -n <pdb-namespace>
. Após a conclusão da nova tentativa de atualização, você pode reimplantar o PDB apenas aplicando o arquivo de backup usando o comandokubectl apply -f pdb-name-backup.yaml
.Tente atualizar novamente o cluster do AKS para a mesma versão para a qual você tentou atualizar anteriormente. Esse processo aciona uma reconciliação.
$ az aks upgrade --name <aksName> --resource-group <resourceGroupName> Are you sure you want to perform this operation? (y/N): y Cluster currently in failed state. Proceeding with upgrade to existing version 1.28.3 to attempt resolution of failed cluster state. Since control-plane-only argument is not specified, this will upgrade the control plane AND all nodepools to version . Continue? (y/N): y
Solução 3: Excluir os pods que não podem ser drenados ou reduzir a carga de trabalho para zero (0)
Exclua os pods que não podem ser drenados.
Observação
Se os pods forem criados por uma Implantação ou StatefulSet, eles serão controlados por um ReplicaSet. Se esse for o caso, talvez seja necessário excluir ou dimensionar as réplicas de carga de trabalho para zero (0) da Implantação ou StatefulSet. Antes de fazer isso, recomendamos que você faça um backup:
kubectl get <deployment.apps -or- statefulset.apps> <name> -n <namespace> -o yaml > backup.yaml
.Para reduzir verticalmente, você pode usar
kubectl scale --replicas=0 <deployment.apps -or- statefulset.apps> <name> -n <namespace>
antes da reconciliaçãoTente atualizar novamente o cluster do AKS para a mesma versão para a qual você tentou atualizar anteriormente. Esse processo aciona uma reconciliação.
$ az aks upgrade --name <aksName> --resource-group <resourceGroupName> Are you sure you want to perform this operation? (y/N): y Cluster currently in failed state. Proceeding with upgrade to existing version 1.28.3 to attempt resolution of failed cluster state. Since control-plane-only argument is not specified, this will upgrade the control plane AND all nodepools to version . Continue? (y/N): y
Entre em contato conosco para obter ajuda
Se você tiver dúvidas ou precisar de ajuda, crie uma solicitação de suporte ou peça ajuda à comunidade de suporte do Azure. Você também pode enviar comentários sobre o produto para a comunidade de comentários do Azure.