Notatka
Dostęp do tej strony wymaga autoryzacji. Może spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
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-vmssxxxxxxnie 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łaaks-<nodepool-name>-xxxxxxxx-vmssxxxxxxnie 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.
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 unavailablelubRunning pods / Replicas. Zmodyfikuj parametrMin Available / Max unavailablena poziomie PDB lub zwiększ liczbęRunning pods / Replicas, aby zwiększyć wartość Dopuszczalne zakłócenia do 1 lub wyższej.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ą.
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.yamliUsuń plik PDB, uruchamiając następujące polecenie:
kubectl delete pdb <pdb-name> -n <pdb-namespace>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.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
- 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.
Aby skalować obciążenie w dół, użyj polecenia
kubectl scale --replicas=0 <deployment.apps -or- statefulset.apps> <name> -n <namespace>.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