Udostępnij za pośrednictwem


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

W tym artykule omówiono sposób identyfikowania i rozwiązywania problemów z błędami upgradeFailed spowodowanymi błędami eksmisji spowodowanymi przez budżety zakłóceń zasobników (PDB), które występują podczas próby uaktualnienia klastra usługi 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ć interfejs wiersza polecenia platformy Azure, zobacz Jak zainstalować interfejs wiersza polecenia platformy Azure.

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

Symptomy

Operacja uaktualniania klastra usługi AKS kończy się niepowodzeniem z jednym z następujących komunikatów o błędach:

  • (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ń. Jest to często spowodowane restrykcyjnymi zasadami budżetu zakłóceń zasobników (PDB). Zobacz: https://aka.ms/aks/debugdrainfailures. Oryginalny błąd: Nie można wykluczyć 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: Węzeł aks-<nodepool-name>-xxxxxxxx-vmssxxxxxx opróżniania nie powiódł się, gdy eksmitowanie zasobnika <pod-name> nie powiodło się z powodu błędu Zbyt wiele żądań. Jest to często spowodowane restrykcyjnymi zasadami budżetu zakłóceń zasobników (PDB). Zobacz: https://aka.ms/aks/debugdrainfailures. Oryginalny błąd: Nie można wykluczyć 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 może wystąpić, jeśli zasobnik jest chroniony przez zasady Budżetu zakłóceń zasobników (PDB). W takiej sytuacji zasobnik opiera się na opróżnianiu, a po kilku próbach operacja uaktualniania kończy się niepowodzeniem Failed , a pula klastrów/węzłów znajduje się w stanie.

Sprawdź konfigurację pliku PDB: ALLOWED DISRUPTIONS wartość. 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ń zasobników. Możesz na przykład sprawdzić obciążenie i jego plik PDB w następujący sposób. Należy obserwować, że kolumna ALLOWED DISRUPTIONS nie zezwala na żadne zakłócenia. 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ć wszystkie wpisy w zdarzeniach kubernetes przy użyciu 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łączanie opróżniania zasobników

  1. Dostosuj pdB, aby włączyć opróżnianie zasobnika. Ogólnie rzecz biorąc, dozwolone zakłócenia są kontrolowane przez Min Available / Max unavailable parametr or Running pods / Replicas . Możesz zmodyfikować Min Available / Max unavailable parametr na poziomie pdB lub zwiększyć liczbę Running pods / Replicas , aby wypchnąć wartość Dozwolone zakłócenia do 1 lub większej.

  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

  1. Utwórz kopię zapasową plików PDB przy użyciu polecenia kubectl get pdb <pdb-name> -n <pdb-namespace> -o yaml > pdb-name-backup.yaml, a następnie usuń plik PDB przy użyciu polecenia kubectl delete pdb <pdb-name> -n <pdb-namespace>. Po zakończeniu nowej próby uaktualnienia można ponownie wdrożyć plik PDB, stosując plik kopii zapasowej przy użyciu polecenia kubectl apply -f pdb-name-backup.yaml.

  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 3. Usuwanie zasobników, których nie można opróżnić ani skalować obciążenia w dół do zera (0)

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

    Uwaga

    Jeśli zasobniki są tworzone przez element Deployment lub StatefulSet, będą one kontrolowane przez zestaw replik. Jeśli tak jest, może być konieczne usunięcie lub skalowanie replik obciążenia do zera (0) wdrożenia lub zestawu stanowego. Przed wykonaniem tej czynności zalecamy utworzenie kopii zapasowej: kubectl get <deployment.apps -or- statefulset.apps> <name> -n <namespace> -o yaml > backup.yaml.

  2. Aby skalować w dół, możesz użyć kubectl scale --replicas=0 <deployment.apps -or- statefulset.apps> <name> -n <namespace> polecenia przed uzgadnianiem

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

Skontaktuj się z nami, aby uzyskać pomoc

Jeśli masz pytania lub potrzebujesz pomocy, utwórz wniosek o pomoc techniczną lub zadaj pytanie w społeczności wsparcia dla platformy Azure. Możesz również przesłać opinię o produkcie do społeczności opinii na temat platformy Azure.