Rozwiązywanie problemów z błędami UpgradeFailed spowodowanymi błędami eksmisji spowodowanymi przez pliki PDB

Podsumowanie

W tym artykule wyjaśniono, jak identyfikować i rozwiązywać błędy UpgradeFailed, wynikające z niepowodzeń eksmisji spowodowanych przez zasady Pod Disruption Budget (PDB), które występują podczas próby aktualizacji klastra Azure Kubernetes Service (AKS).

Wymagania wstępne

Ten artykuł wymaga interfejsu wiersza polecenia platformy Azure w wersji 2.67.0 lub nowszej. Aby znaleźć numer wersji, uruchom polecenie az --version. Jeśli musisz zainstalować lub uaktualnić Azure CLI, zobacz Jak zainstalować Azure CLI.

Aby uzyskać bardziej szczegółowe informacje na temat procesu uaktualniania, zobacz sekcję "Uaktualnianie klastra AKS" w temacie Uaktualnianie klastra usługi Azure Kubernetes Service (AKS).

Wskazówka

Przed rozpoczęciem uaktualniania usługi AKS uruchom sprawdzanie gotowości uaktualnienia w portalu Azure:

Klaster AKS>Ustawienia>Uaktualnienia>Wersja uaktualnienia

Po wybraniu docelowej wersji rozwiązania Kubernetes wybierz pozycję Sprawdź obok pozycji Gotowość do uaktualnienia. Ta wstępna walidacja pozwala zidentyfikować potencjalne przeszkody w aktualizacji, w tym konfiguracje Pod Disruption Budget (PDB), które mogą uniemożliwić pomyślne opróżnienie węzłów podczas aktualizacji.

Symptomy

Aktualizacja klastra AKS nie powiodła się z powodu jednego z poniższych komunikatów o błędzie:

  • (UpgradeFailed) Opróżnianie node aks-<nodepool-name>-xxxxxxxx-vmssxxxxxx nie powiodło się, gdy eksmitowanie zasobnika <pod-name> nie powiodło się z powodu błędu Zbyt wiele żądań. Ten błąd jest często spowodowany restrykcyjną polityką Pod Disruption Budget (PDB). Zobacz: https://aka.ms/aks/debugdrainfailures. Oryginalny błąd: Nie można usunąć zasobnika, ponieważ naruszałoby to budżet zakłóceń zasobnika. Informacje o debugowaniu pdB: <namespace>/<pod-name> zablokowane przez plik pdb <pdb-name> z 0 nieprzeczytanymi zasobnikami.

  • Kod: UpgradeFailed
    Komunikat: Opróżnianie węzła aks-<nodepool-name>-xxxxxxxx-vmssxxxxxx nie powiodło się, ponieważ próba eksmitowania zasobnika <pod-name> zakończyła się błędem Zbyt wiele żądań. Ten błąd jest często spowodowany restrykcyjną polityką Pod Disruption Budget (PDB). Zobacz: https://aka.ms/aks/debugdrainfailures. Oryginalny błąd: Nie można usunąć zasobnika, ponieważ naruszałoby to budżet zakłóceń zasobnika. Informacje o debugowaniu pdB: <namespace>/<pod-name> zablokowane przez plik pdb <pdb-name> z 0 nieprzeczytanymi zasobnikami.

Przyczyna

Ten błąd występuje, jeśli zasobnik jest chroniony przez politykę Pod Disruption Budget (PDB). W takiej sytuacji zasobnik nie daje się opróżnić. Po kilku próbach operacja aktualizacji kończy się niepowodzeniem, a klaster lub pula węzłów przechodzi w stan Failed.

Sprawdź konfigurację pliku PDB: wartość ALLOWED DISRUPTIONS. Wartość powinna być 1 lub większa. Aby uzyskać więcej informacji, zobacz Planowanie dostępności przy użyciu budżetów zakłóceń podów. Możesz na przykład sprawdzić obciążenie i jego plik PDB w następujący sposób. Powinno się zauważyć, że kolumna ALLOWED DISRUPTIONS nie dopuszcza do żadnych zakłóceń. ALLOWED DISRUPTIONS Jeśli wartość to 0, zasobniki nie są eksmitowane, a opróżnianie węzła kończy się niepowodzeniem podczas procesu uaktualniania:

$ 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

Możesz również sprawdzić, czy w zdarzeniach Kubernetes są jakieś wpisy, za pomocą polecenia kubectl get events | grep -i drain. Podobne dane wyjściowe pokazują komunikat "Eksmisja zablokowana przez zbyt wiele żądań (zazwyczaj 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>

Aby rozwiązać ten problem, użyj jednego z następujących rozwiązań.

Rozwiązanie 1: Włącz opróżnianie podów.

  1. Dostosuj PDB, aby umożliwić opróżnianie podów. Ogólnie rzecz biorąc, dopuszczalny poziom zakłóceń jest kontrolowany za pomocą parametru Min Available / Max unavailable lub Running pods / Replicas. Zmodyfikuj parametr Min Available / Max unavailable na poziomie PDB lub zwiększ liczbę Running pods / Replicas, aby zwiększyć wartość Dopuszczalne zakłócenia do 1 lub wyższej.

  2. Spróbuj ponownie uaktualnić klaster usługi AKS do tej samej wersji, do której próbowano wcześniej przeprowadzić uaktualnienie. Ten proces wyzwala uzgadnianie.

    $ 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
    

Rozwiązanie 2. Tworzenie kopii zapasowej, usuwanie i ponowne wdrażanie pliku PDB

Uwaga

Użyj tego rozwiązania, jeśli edytowanie zasobu PDB nie jest opłacalną opcją.

  1. Wykonaj kopię zapasową plików PDB, uruchamiając następujące polecenie:

    kubectl get pdb <pdb-name> -n <pdb-namespace> -o yaml > pdb-name-backup.yamli

  2. Usuń plik PDB, uruchamiając następujące polecenie:

    kubectl delete pdb <pdb-name> -n <pdb-namespace>

  3. Po zakończeniu nowej próby uaktualnienia ponownie wdróż plik PDB, stosując plik kopii zapasowej przy użyciu następującego polecenia:

    kubectl apply -f pdb-name-backup.yaml.

  4. Spróbuj ponownie uaktualnić klaster usługi AKS do tej samej wersji, do której próbowano przeprowadzić uaktualnienie wcześniej. Ten proces wyzwala uzgadnianie.

    $ 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
    

Rozwiązanie 3: Usuń zasobniki, których nie można opróżnić, albo zmniejsz obciążenie do zera

  1. Usuń zasobniki, których nie można opróżnić.

Uwaga

Jeśli wdrożenie lub StatefulSet tworzy zasobniki, ReplicaSet je kontroluje. Jeśli tak jest, może być konieczne usunięcie obiektu Deployment lub StatefulSet albo przeskalowanie liczby replik obciążenia do zera. Przed wprowadzeniem tej zmiany utwórz kopię zapasową zasobu, uruchamiając polecenie : kubectl get <deployment.apps -or- statefulset.apps> <name> -n <namespace> -o yaml > backup.yaml.

  1. Aby skalować obciążenie w dół, użyj polecenia kubectl scale --replicas=0 <deployment.apps -or- statefulset.apps> <name> -n <namespace>.

  2. Spróbuj ponownie uaktualnić klaster usługi AKS do tej samej wersji, do której próbowano wcześniej przeprowadzić uaktualnienie. Ten proces wyzwala uzgadnianie.

    $ 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