Solución de problemas de errores upgradeFailed debido a errores de expulsión causados por PDB
En este artículo se describe cómo identificar y resolver errores upgradeFailed debido a errores de expulsión causados por presupuestos de interrupciones de pods (PDB) que se producen al intentar actualizar un clúster de Azure Kubernetes Service (AKS).
Requisitos previos
En este artículo se requiere la versión 2.67.0 de la CLI de Azure o una versión posterior. Para buscar el número de versión, ejecute az --version
. Si tiene que instalar o actualizar la CLI de Azure, consulte Instalación de la CLI de Azure.
Para más información sobre el proceso de actualización, consulte la sección "Actualización de un clúster de AKS" en Actualización de un clúster de Azure Kubernetes Service (AKS).
Síntomas
Se produce un error en una operación de actualización del clúster de AKS con uno de los siguientes mensajes de error:
-
(UpgradeFailed) Error de purga
node aks-<nodepool-name>-xxxxxxxx-vmssxxxxxx
al expulsar el pod<pod-name>
con un error de demasiadas solicitudes. Esto suele deberse a una directiva restrictiva de presupuesto de interrupción del pod (PDB). Vea https://aka.ms/aks/debugdrainfailures. Error original: no se puede expulsar el pod, ya que infringiría el presupuesto de interrupción del pod. Información de depuración de PDB:<namespace>/<pod-name>
bloqueada por pdb<pdb-name>
con 0 pods no leídos. -
Código: UpgradeFailed
Mensaje: Error en el nodoaks-<nodepool-name>-xxxxxxxx-vmssxxxxxx
de purga al expulsar el pod<pod-name>
con un error de demasiadas solicitudes. Esto suele deberse a una directiva restrictiva de presupuesto de interrupción del pod (PDB). Vea https://aka.ms/aks/debugdrainfailures. Error original: no se puede expulsar el pod, ya que infringiría el presupuesto de interrupción del pod. Información de depuración de PDB:<namespace>/<pod-name>
bloqueada por pdb<pdb-name>
con 0 pods no leídos.
Causa
Este error puede producirse si un pod está protegido por la directiva de presupuesto de interrupciones de pods (PDB). En esta situación, el pod se resiste a purgarse y, después de varios intentos, se produce un error en la operación de actualización y el grupo de clústeres o nodos entra en un Failed
estado.
Compruebe la configuración de PDB: ALLOWED DISRUPTIONS
valor. El valor debe ser 1
o mayor. Para obtener más información, consulte Planear la disponibilidad mediante presupuestos de interrupciones de pod. Por ejemplo, puede comprobar la carga de trabajo y su PDB de la siguiente manera. Debe observar que la ALLOWED DISRUPTIONS
columna no permite ninguna interrupción. Si el ALLOWED DISRUPTIONS
valor es 0
, los pods no se expulsan y se produce un error en la purga de nodos durante el proceso de actualización:
$ 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
También puede comprobar si hay entradas en eventos de Kubernetes mediante el comando kubectl get events | grep -i drain
. Una salida similar muestra el mensaje "Expulsión bloqueada por demasiadas solicitudes (normalmente 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 el problema, utilice una de las siguientes soluciones.
Solución 1: Habilitar pods para purgar
Ajuste la PDB para habilitar la purga de pods. Por lo general, la interrupción permitida se controla mediante el
Min Available / Max unavailable
parámetro oRunning pods / Replicas
. Puede modificar elMin Available / Max unavailable
parámetro en el nivel de PDB o aumentar el número deRunning pods / Replicas
para insertar el valor de Interrupción permitida en 1 o superior.Inténtelo de nuevo para actualizar el clúster de AKS a la misma versión a la que intentó actualizar previamente. Este proceso desencadena una conciliación.
$ 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
Solución 2: Copia de seguridad, eliminación y reimplementación de PDB
Realice una copia de seguridad de las PDB mediante el comando
kubectl get pdb <pdb-name> -n <pdb-namespace> -o yaml > pdb-name-backup.yaml
y, a continuación, elimine la PDB mediante el comandokubectl delete pdb <pdb-name> -n <pdb-namespace>
. Una vez finalizado el nuevo intento de actualización, puede volver a implementar la PDB simplemente aplicando el archivo de copia de seguridad mediante el comandokubectl apply -f pdb-name-backup.yaml
.Inténtelo de nuevo para actualizar el clúster de AKS a la misma versión a la que intentó actualizar previamente. Este proceso desencadena una conciliación.
$ 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
Solución 3: Eliminación de los pods que no se pueden purgar ni reducir verticalmente la carga de trabajo a cero (0)
Elimine los pods que no se pueden purgar.
Nota:
Si un objeto Deployment o StatefulSet crean los pods, estos se controlarán mediante ReplicaSet. Si es así, es posible que tenga que eliminar o escalar las réplicas de carga de trabajo a cero (0) de Deployment o StatefulSet. Antes de hacerlo, se recomienda realizar una copia de seguridad:
kubectl get <deployment.apps -or- statefulset.apps> <name> -n <namespace> -o yaml > backup.yaml
.Para reducir verticalmente, puede usar
kubectl scale --replicas=0 <deployment.apps -or- statefulset.apps> <name> -n <namespace>
antes de la conciliación.Inténtelo de nuevo para actualizar el clúster de AKS a la misma versión a la que intentó actualizar previamente. Este proceso desencadena una conciliación.
$ 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
Ponte en contacto con nosotros para obtener ayuda
Si tiene preguntas o necesita ayuda, cree una solicitud de soporte o busque consejo en la comunidad de Azure. También puede enviar comentarios sobre el producto con los comentarios de la comunidad de Azure.