Kubernetes oomklilled

Kubernetes oomklilled
Kiedy Kubernetes działa, jest to niesamowite, ale kiedy tak nie. Jeśli wcześniej pracowałeś z Kubernetes, prawie na pewno napotkałeś błąd. Jeśli nie rozumiesz, jak to działa, debugowanie może być frustrującym doświadczeniem. W tym poście przyjrzymy się oomlefilowanemu problemowi w tym poście.

Warunek wstępny

Aby korzystać z usług Kubernetes, potrzebujesz klastra minikube. Będziesz musiał skonfigurować klaster minikube w swoim systemie, aby ta technika zadziałała. Aby skonfigurować klaster minikube, użyj terminalu wiersza poleceń. Można go używać na dwa sposoby. Poszukaj „terminalu” w sekcji wyszukiwania programu systemu. Ctrl+Alt+T to skrót klawiatury, który można do tego użyć:

W każdym węźle musi być dostępnych co najmniej 300 MIB pamięci. Musisz mieć usługę Metrics-Server uruchomiona w klastrze, aby uzyskać zadania na tej stronie. Możesz pominąć te kroki, jeśli serwer wskaźników już funkcjonuje. Teraz wpisz następujące dołączone polecenie.

Teraz użyj załączonego polecenia.

Wskaźniki reakcji wskaźniki.K8s.IO Jeśli interfejs API wskaźników zasobów jest dostępny, jak pokazano na powyższym zrzucie ekranu.

Kroki utworzenia przestrzeni nazw

Zrób przestrzeń nazw dla zasobów, które utworzysz tutaj, aby oddzielić je od reszty klastra.

Powstaje nowy kapsułek, jak można wyświetlić poniżej.

Podaj pole zasoby: żądania w manifestie zasobu kontenera w celu zdefiniowania żądania pamięci. Uwzględnij zasoby: limity do ustalenia limitu pamięci RAM. Zaprojektujesz kapsułkę z jednym pojemnikiem. Pojemnik ma żądanie pamięci 100 MIB i limit pamięci 200 MIB. Plik konfiguracyjny POD jest następujący:

Po uruchomieniu kontenera sekcja ARGS pliku konfiguracyjnego dostarcza jego parametry. Opcje „-vm-bajty” i „150 m” instruują pojemnik do przydzielania 150 MIB pamięci RAM.

Poniżej możesz zobaczyć, że stworzyliśmy POD:

To polecenie sprawdzi, czy pojemnik POD jest uruchomiony:

Według wyniku pojedynczy kontener POD ma żądanie pamięci 100 MIB i limit pamięci 200 MIB.

Aby uzyskać wskaźniki kapsuła, uruchom polecenie Kubectl Top.

W jaki sposób może zostać przekroczony limit pamięci kontenera?

Jeśli wydaje się, że węzeł ma wystarczającą pamięć, pojemnik może przewyższyć żądanie pamięci. Z drugiej strony pojemnik nie może używać więcej pamięci niż ma. Jeśli pojemnik przyjmuje więcej pamięci niż przypisany, zostanie zakończony. Pojemnik zostanie usunięty, jeśli będzie nadal używać pamięci powyżej limitu. Kubelet ponownie uruchamia zakończony pojemnik, jeśli można go wznowić, podobnie jak każda inna forma awarii w czasie wykonywania.

Tutaj stworzymy kapsułkę. Ten kapsułek będzie próbował przydzielić więcej pamięci niż już.

Plik konfiguracyjny dla POD z jednym kontenerem i żądanie pamięci 50 MIB i limit pamięci 100 MIB jest następujący:

Zgodnie z sekcją ARGS pliku konfiguracyjnego kontener będzie próbował przydzielić 250 MIB pamięci RAM, znacznie powyżej limitu 100 MIB.

Ponownie stworzyliśmy kapsułę tutaj.

Tutaj możesz wyświetlić kompleksowe informacje kapsuła. Pojemnik albo w tym momencie. Powtórzenie poprzedniego polecenia, dopóki kontener nie zostanie zabity, jest wymagane:

Spójrz na status kontenera bardziej dogłębnie. Zgodnie z wyjściem pojemnik został zniszczony, ponieważ zabrakło mu pamięci.

W tym przykładzie kubelet uruchamia pojemnik, ponieważ można go zrestartować. Powtarzaj to polecenie wielokrotnie, aby upewnić się, że kontener zostanie zabity i regularnie uruchamiany. Zgodnie z wyjściem pojemnik jest zabijany, przywrócony, zabity ponownie, inicjowany ponownie itp.

Poniższe polecenie pozwala wyświetlić kompleksowe informacje związane z historią kapsuły.

Wynik ujawnia, że ​​pojemnik stale się zaczyna i zatrzymuje:

Tutaj możesz wyświetlić szczegółowe informacje o węzłach klastra:

Zapis zabijanego kontenera z powodu problemu poza pamięcią znajduje się w wyniku:

To polecenie usuwa kapsułkę, jak widać poniżej.

Co powinieneś zrobić, jeśli masz żądanie pamięci, które jest zbyt duże dla twoich węzłów?

Żądania i ograniczenia pamięci są zwykle powiązane z kontenerami, ale pomocne jest również myślenie o PODS o żądaniach i ograniczeniach pamięci. Żądanie pamięci jest zdefiniowane jako suma wszystkich potrzeb pamięci dla wszystkich kontenerów w POD.
Krągi są zaplanowane i utrzymywane za pośrednictwem żądań.

Tutaj zbudujemy kapsułkę z większym żądaniem pamięci niż jakikolwiek węzeł w pojemności klastra.

Oto plik konfiguracyjny dla POD, w tym jeden kontener i potrzebę pamięci 1000 GIB, która jest prawdopodobnie większa niż jakikolwiek węzeł w klastrze, który może zarządzać.

Poniższe polecenie zastosowania tworzy kapsułkę, jak widać.

Teraz skorzystaj z polecenia „Get Pod”. Status kapsuły jest w toku (patrz wyjście). POD nie jest ustawiony na działanie w żadnym węźle i pozostanie w toku w nieskończoność.

To polecenie pomoże Ci wyświetlić więcej szczegółów na temat POD, w tym nadchodzące wydarzenia:

Wyjście pokazuje, że kontenera nie można zaplanować, ponieważ węzły nie mają wystarczającej pamięci:

Co się stanie, jeśli nie określisz limitu pamięci?

Jeden z poniższych scenariuszy występuje, jeśli nie zdefiniujesz limitu pamięci dla kontenera:

  • Pojemnik nie ma ograniczeń co do tego, ile może użyć pamięci RAM. Killer OOM mógłby zostać uruchomiony, jeśli pojemnik zużywa całą dostępną pamięć w węźle, w którym się uruchomi. Ponadto Acontainer bez ograniczeń zasobów będzie miało większe ryzyko zabicia w przypadku zabójstwa.
  • Kontener jest wykonywany w przestrzeni nazw z domyślnym limitem pamięci, a domyślny limit jest stosowany do kontenera automatycznie. Administratorzy klastrów mogą użyć limitrange, aby ustawić domyślną liczbę dla limitu pamięci.

Wniosek:

W tym artykule przyjrzeliśmy się bliżej błędu Kubernetes. Pomaga Kubernetes w zarządzaniu pamięcią podczas planowania kapsułów i decydującym, które strąki niszczą, gdy zasoby stają się rzadkie.