Rozwiązywanie problemów ze zmianą w węźle w dobrej kondycji na stan Brak gotowości
W tym artykule omówiono scenariusz, w którym stan węzła klastra usługi Azure Kubernetes Service (AKS) zmienia się na Nie gotowe po tym, jak węzeł jest w dobrej kondycji przez jakiś czas. W tym artykule opisano konkretną przyczynę i przedstawiono możliwe rozwiązanie.
Wymagania wstępne
- Narzędzie Kubernetes kubectl . Aby zainstalować narzędzie kubectl przy użyciu interfejsu wiersza polecenia platformy Azure, uruchom polecenie az aks install-cli .
- Narzędzie Kubernetes kubelet .
- Narzędzie kontenerowe Kubernetes.
- Następujące narzędzia systemu Linux:
Symptomy
Stan węzła klastra, który ma stan dobrej kondycji (wszystkie uruchomione usługi) nieoczekiwanie zmienia się na Nie gotowe. Aby wyświetlić stan węzła, uruchom następujące polecenie kubectl describe :
kubectl describe nodes
Przyczyna
Narzędzie kubelet przestało publikować stan Gotowe .
Sprawdź dane wyjściowe kubectl describe nodes
polecenia, aby znaleźć pole Warunki oraz bloki Pojemność i Allocatable . Czy zawartość tych pól jest wyświetlana zgodnie z oczekiwaniami? (Na przykład w obiekcie Pole Warunki , czy message
właściwość zawiera ciąg "kubelet publikuje gotowy stan"? W takim przypadku, jeśli masz bezpośredni dostęp protokołu Secure Shell (SSH) do węzła, sprawdź ostatnie zdarzenia, aby zrozumieć błąd. Zajrzyj do pliku /var/log/messages . Możesz też wygenerować pliki dziennika kubelet i demona kontenera, uruchamiając następujące polecenia powłoki:
# To check messages file,
cat /var/log/messages
# To check kubelet and containerd daemon logs,
journalctl -u kubelet > kubelet.log
journalctl -u containerd > containerd.log
Po uruchomieniu tych poleceń sprawdź komunikaty i pliki dziennika demona, aby uzyskać więcej informacji na temat błędu.
Rozwiązanie
Krok 1. Sprawdzanie zmian na poziomie sieci
Jeśli wszystkie węzły klastra mają regresję do stanu Nie wszystko gotowe , sprawdź, czy na poziomie sieci wystąpiły jakiekolwiek zmiany. Przykłady zmian na poziomie sieci obejmują:
- Zmiany w systemie nazw domen (DNS)
- Zmiany reguły zapory, takie jak port, w pełni kwalifikowane nazwy domen (FQDN) itd.
- Dodane sieciowe grupy zabezpieczeń (NSG)
- Zastosowane lub zmienione konfiguracje tabeli tras dla ruchu usługi AKS
Jeśli nastąpiły zmiany na poziomie sieci, wprowadź niezbędne poprawki. Jeśli masz bezpośredni dostęp protokołu Secure Shell (SSH) do węzła, możesz użyć curl
polecenia lub telnet
, aby sprawdzić łączność z wymaganiami ruchu wychodzącego usługi AKS. Po rozwiązaniu problemów zatrzymaj i uruchom ponownie węzły. Jeśli węzły pozostają w dobrej kondycji po tych poprawkach, można bezpiecznie pominąć pozostałe kroki.
Krok 2. Zatrzymywanie i ponowne uruchamianie węzłów
Jeśli tylko kilka węzłów ulegnie regresji do stanu Nie wszystko gotowe , po prostu zatrzymaj i uruchom ponownie węzły. Ta akcja może spowodować przywrócenie węzłów do dobrej kondycji. Następnie zapoznaj się z omówieniem diagnostyki usługi Azure Kubernetes Service, aby ustalić, czy występują jakieś problemy, takie jak następujące problemy:
- Błędy węzła
- Błędy translacji adresów sieciowych źródła (SNAT)
- Problemy z wydajnością operacji wejścia/wyjścia węzła na sekundę (IOPS)
- Inne problemy
Jeśli diagnostyka nie wykryje żadnych podstawowych problemów, a węzły powróciły do stanu Gotowe, możesz bezpiecznie pominąć pozostałe kroki.
Krok 3. Rozwiązywanie problemów z siecią SNAT dla publicznych klastrów interfejsu API usługi AKS
Czy diagnostyka usługi AKS wykryła jakieś problemy z siecią SNAT? Jeśli tak, wykonaj niektóre z następujących akcji, odpowiednio:
Sprawdź, czy połączenia pozostają bezczynne przez długi czas i korzystają z domyślnego limitu czasu bezczynności, aby zwolnić port. Jeśli połączenia wykazują to zachowanie, może być konieczne skrócenie domyślnego limitu czasu 30 minut.
Określ sposób tworzenia łączności wychodzącej przez aplikację. Czy na przykład używa on przeglądu kodu lub przechwytywania pakietów?
Ustal, czy to działanie reprezentuje oczekiwane zachowanie, czy też pokazuje, że aplikacja działa nieprawidłowo. Użyj metryk i dzienników w usłudze Azure Monitor, aby uzasadnić wyniki. Na przykład możesz użyć kategorii Niepowodzenie jako metryki Połączenia SNAT.
Oceń, czy są przestrzegane odpowiednie wzorce.
Oceń, czy należy ograniczyć wyczerpywanie portów SNAT przy użyciu dodatkowych wychodzących adresów IP i większej liczby przydzielonych portów wychodzących. Aby uzyskać więcej informacji, zobacz Skalowanie liczby zarządzanych publicznych adresów IP wychodzących i Konfigurowanie przydzielonych portów wychodzących.
Aby uzyskać więcej informacji na temat rozwiązywania problemów z ekshaution portów SNAT, zobacz Rozwiązywanie problemów z wyczerpaniem portów SNAT w węzłach usługi AKS.
Krok 4. Rozwiązywanie problemów z wydajnością operacji we/wy na sekundę
Jeśli diagnostyka usługi AKS odkryje problemy, które zmniejszają wydajność operacji we/wy na sekundę, wykonaj niektóre z następujących akcji, odpowiednio:
Aby zwiększyć liczbę operacji we/wy na sekundę w zestawach skalowania maszyn wirtualnych, wybierz większy rozmiar dysku, który zapewnia lepszą wydajność operacji we/wy na sekundę, wdrażając nową pulę węzłów. Bezpośrednie zmienianie rozmiaru zestawu skalowania maszyn wirtualnych nie jest obsługiwane. Aby uzyskać więcej informacji na temat zmiany rozmiaru pul węzłów, zobacz Zmienianie rozmiaru pul węzłów w usłudze Azure Kubernetes Service (AKS).
Zwiększ rozmiar jednostki SKU węzła, aby uzyskać więcej pamięci i możliwości przetwarzania procesora CPU.
Rozważ użycie efemerycznego systemu operacyjnego.
Ogranicz użycie procesora CPU i pamięci dla zasobników. Te limity pomagają zapobiegać zużywaniu procesora CPU węzła i zbyt małej ilości pamięci.
Użyj metod topologii planowania, aby dodać więcej węzłów i rozłożyć obciążenie między węzły. Aby uzyskać więcej informacji, zobacz Ograniczenia rozprzestrzeniania topologii zasobnika.
Krok 5. Rozwiązywanie problemów z wątkami
Składniki platformy Kubernetes, takie jak kubelets i środowiska uruchomieniowe kontenerów , intensywnie korzystają z wątków i regularnie tworzą nowe wątki. Jeśli alokacja nowych wątków nie powiedzie się, ten błąd może mieć wpływ na gotowość usługi w następujący sposób:
Stan węzła zmienia się na Nie gotowe, ale jest ponownie uruchamiany przez narzędzie korygujące i jest w stanie odzyskać.
W plikach dziennika /var/log/messages i /var/log/syslog występują powtarzające się wystąpienia następujących wpisów o błędach:
pthread_create nie powiodło się: zasób tymczasowo niedostępny z powodu różnych procesów
Cytowane procesy obejmują kontenery i ewentualnie kubelet.
Stan węzła zmieni się na Nie gotowe wkrótce po
pthread_create
zapisaniu wpisów awarii w plikach dziennika.
Identyfikatory procesów (PID) reprezentują wątki. Domyślna liczba identyfikatorów PID, których może używać zasobnik, może być zależna od systemu operacyjnego. Jednak domyślna liczba to co najmniej 32 768. Jest ona większa niż wystarczająca liczba identyfikatorów PID w większości sytuacji. Czy istnieją znane wymagania aplikacji dotyczące wyższych zasobów piD? Jeśli tak nie jest, nawet ośmiokrotny wzrost do 262 144 PID może nie wystarczyć, aby pomieścić aplikację o wysokim zużyciu zasobów.
Zamiast tego zidentyfikuj aplikację sprawiającą problemy, a następnie podejmij odpowiednie działania. Rozważ inne opcje, takie jak zwiększenie rozmiaru maszyny wirtualnej lub uaktualnienie usługi AKS. Te działania mogą tymczasowo rozwiązać ten problem, ale nie są one gwarancją, że problem się nie powtórzy.
Aby monitorować liczbę wątków dla każdej grupy kontrolnej (cgroup) i wyświetlić osiem pierwszych grup cgroup, uruchom następujące polecenie powłoki:
watch 'ps -e -w -o "thcount,cgname" --no-headers | awk "{a[\$2] += \$1} END{for (i in a) print a[i], i}" | sort --numeric-sort --reverse | head --lines=8'
Aby uzyskać więcej informacji, zobacz Limity identyfikatorów procesu i rezerwacje.
Platforma Kubernetes oferuje dwie metody zarządzania wyczerpaniem identyfikatorów PID na poziomie węzła:
Skonfiguruj maksymalną liczbę identyfikatorów PID dozwolonych na zasobniku w ramach narzędzia kubelet przy użyciu parametru
--pod-max-pids
. Ta konfiguracja ustawiapids.max
ustawienie w grupie cgroup każdego zasobnika. Można również użyć--system-reserved
parametrów i--kube-reserved
, aby odpowiednio skonfigurować limity systemu i kubeletu.Konfigurowanie eksmisji opartej na usłudze PID.
Uwaga 16.
Domyślnie żadna z tych metod nie jest skonfigurowana. Ponadto nie można obecnie skonfigurować żadnej metody przy użyciu konfiguracji węzła dla pul węzłów usługi AKS.
Krok 6. Używanie wyższej warstwy usługi
Upewnij się, że serwer interfejsu API usługi AKS ma wysoką dostępność przy użyciu wyższej warstwy usługi. Aby uzyskać więcej informacji, zobacz Umowa SLA dotycząca czasu działania usługi Azure Kubernetes Service (AKS).
Więcej informacji
Aby wyświetlić kondycję i wydajność serwera interfejsu API usługi AKS i narzędzia kubelets, zobacz Zarządzane składniki usługi AKS.
Ogólne kroki rozwiązywania problemów można znaleźć w temacie Podstawowe rozwiązywanie problemów dotyczących niepowodzeń węzła.