Устранение ошибок 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
Настройте PDB, чтобы включить очистку модулей pod. Как правило, разрешенное нарушение контролируется параметром или
Running pods / Replicas
параметромMin Available / Max unavailable
. Параметр можно изменитьMin Available / Max unavailable
на уровне PDB или увеличить число для отправки допустимогоRunning pods / Replicas
значения прерывания до 1 или больше.Повторите попытку обновления кластера 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
Создайте резервную копию 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
.Повторите попытку обновления кластера 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)
Удалите модули pod, которые нельзя удалить.
Примечание.
Если модули pod создаются с помощью deployment или StatefulSet, они будут управляться репликой. В этом случае может потребоваться удалить или масштабировать реплики рабочей нагрузки до нуля (0) развертывания или StatefulSet. Перед этим рекомендуется создать резервную копию:
kubectl get <deployment.apps -or- statefulset.apps> <name> -n <namespace> -o yaml > backup.yaml
Чтобы уменьшить масштаб, можно использовать
kubectl scale --replicas=0 <deployment.apps -or- statefulset.apps> <name> -n <namespace>
перед выверкойПовторите попытку обновления кластера 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.