Compartir a través de


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 nodo aks-<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

  1. 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 o Running pods / Replicas . Puede modificar el Min Available / Max unavailable parámetro en el nivel de PDB o aumentar el número de Running pods / Replicas para insertar el valor de Interrupción permitida en 1 o superior.

  2. 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

  1. Realice una copia de seguridad de las PDB mediante el comando kubectl get pdb <pdb-name> -n <pdb-namespace> -o yaml > pdb-name-backup.yamly, a continuación, elimine la PDB mediante el comando kubectl 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 comando kubectl apply -f pdb-name-backup.yaml.

  2. 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)

  1. 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.

  2. Para reducir verticalmente, puede usar kubectl scale --replicas=0 <deployment.apps -or- statefulset.apps> <name> -n <namespace> antes de la conciliación.

  3. 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.