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
Dostosuj pdB, aby włączyć opróżnianie zasobnika. Ogólnie rzecz biorąc, dozwolone zakłócenia są kontrolowane przez
Min Available / Max unavailable
parametr orRunning 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.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
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 poleceniakubectl 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 poleceniakubectl apply -f pdb-name-backup.yaml
.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)
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
.Aby skalować w dół, możesz użyć
kubectl scale --replicas=0 <deployment.apps -or- statefulset.apps> <name> -n <namespace>
polecenia przed uzgadnianiemSpró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.