Поделиться через


Устранение ошибок UpgradeFailed из-за сбоев вытеснения, вызванных PDF-файлами

В этой статье описывается, как определить и устранить ошибки UpgradeFailed из-за сбоев вытеснения, вызванных бюджетами нарушений pod (PDB), которые возникают при попытке обновить кластер Служба Azure Kubernetes (AKS).

Необходимые условия

Для этой статьи требуется Azure CLI версии 2.67.0 или более поздней версии. Чтобы найти номер версии, выполните команду az --version. Если вам нужно установить или обновить Azure CLI, см. инструкции по установке Azure CLI.

Дополнительные сведения о процессе обновления см. в разделе "Обновление кластера AKS" в разделе об обновлении кластера Служба Azure Kubernetes (AKS).

Симптомы

Операция обновления кластера AKS завершается сбоем с одним из следующих сообщений об ошибках:

  • (UpgradeFailed) Сбой очистки node aks-<nodepool-name>-xxxxxxxx-vmssxxxxxx при удалении модуля pod <pod-name> с ошибкой слишком большого количества запросов. Это часто вызвано политикой ограниченного бюджета прерывания pod (PDB). См. раздел https://aka.ms/aks/debugdrainfailures. Исходная ошибка: не удается вытеснить pod, так как это нарушает бюджет сбоя pod. Сведения об отладке PDB: <namespace>/<pod-name> заблокированы pdb <pdb-name> с 0 непрочитанными модулями pod.

  • Код: UpgradeFailed
    Сообщение: сбой узла aks-<nodepool-name>-xxxxxxxx-vmssxxxxxx очистки при удалении модуля pod <pod-name> с ошибкой "Слишком много запросов". Это часто вызвано политикой ограниченного бюджета прерывания pod (PDB). См. раздел https://aka.ms/aks/debugdrainfailures. Исходная ошибка: не удается вытеснить pod, так как это нарушает бюджет сбоя pod. Сведения об отладке PDB: <namespace>/<pod-name> заблокированы pdb <pdb-name> с 0 непрочитанными модулями pod.

Причина

Эта ошибка может возникать, если модуль pod защищен политикой "Бюджет сбоя pod" (PDB). В этой ситуации модуль pod сопротивляется очистке, и после нескольких попыток операция обновления завершается сбоем, и пул кластеров или узлов попадает в Failed состояние.

Проверьте конфигурацию PDB: ALLOWED DISRUPTIONS значение. Значение должно быть 1 или больше. Дополнительные сведения см. в разделе "Планирование доступности с помощью бюджетов нарушений pod". Например, можно проверить рабочую нагрузку и ее PDB следующим образом. Вы должны наблюдать, что ALLOWED DISRUPTIONS столбец не допускает каких-либо нарушений. ALLOWED DISRUPTIONS Если значение равно0, модули pod не вытеснили, и при обновлении не удается выполнить очистку узлов:

$ 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

Вы также можете проверить наличие записей в событиях Kubernetes с помощью команды kubectl get events | grep -i drain. Аналогичные выходные данные показывают сообщение "Вытеснение заблокировано слишком большим количеством запросов (обычно 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>

Чтобы устранить эту проблему, используйте одно из следующих решений.

Решение 1. Включение очистки модулей pod

  1. Настройте PDB, чтобы включить очистку модулей pod. Как правило, разрешенное нарушение контролируется параметром или Running pods / Replicas параметромMin Available / Max unavailable. Параметр можно изменить Min Available / Max unavailable на уровне PDB или увеличить число для отправки допустимого Running pods / Replicas значения прерывания до 1 или больше.

  2. Повторите попытку обновления кластера AKS до той же версии, до которую вы пытались обновить ранее. Этот процесс вызывает выверку.

    $ 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
    

Решение 2. Резервное копирование, удаление и повторное развертывание PDB

  1. Создайте резервную копию PDB с помощью команды kubectl get pdb <pdb-name> -n <pdb-namespace> -o yaml > pdb-name-backup.yaml, а затем удалите PDB с помощью команды kubectl delete pdb <pdb-name> -n <pdb-namespace>. После завершения новой попытки обновления можно повторно развернуть PDB только применив файл резервной копии с помощью команды kubectl apply -f pdb-name-backup.yaml.

  2. Повторите попытку обновления кластера AKS до той же версии, до которую вы пытались обновить ранее. Этот процесс вызывает выверку.

    $ 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
    

Решение 3. Удаление модулей pod, которые не могут быть удалены или масштабируйте рабочую нагрузку до нуля (0)

  1. Удалите модули pod, которые нельзя удалить.

    Примечание.

    Если модули pod создаются с помощью deployment или StatefulSet, они будут управляться репликой. В этом случае может потребоваться удалить или масштабировать реплики рабочей нагрузки до нуля (0) развертывания или StatefulSet. Перед этим рекомендуется создать резервную копию: kubectl get <deployment.apps -or- statefulset.apps> <name> -n <namespace> -o yaml > backup.yaml

  2. Чтобы уменьшить масштаб, можно использовать kubectl scale --replicas=0 <deployment.apps -or- statefulset.apps> <name> -n <namespace> перед выверкой

  3. Повторите попытку обновления кластера AKS до той же версии, до которую вы пытались обновить ранее. Этот процесс вызывает выверку.

    $ 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
    

Свяжитесь с нами для получения помощи

Если у вас есть вопросы или вам нужна помощь, создайте запрос в службу поддержки или обратитесь за поддержкой сообщества Azure. Вы также можете отправить отзыв о продукте в сообщество отзывов Azure.