Przegląd k9s — zaawansowanego interfejsu terminala dla Kubernetes

Przegląd k9s — zaawansowanego interfejsu terminala dla Kubernetes

K9s oferuje interfejs terminala do interakcji z klastrami Kubernetes. Celem tego projektu Open Source jest ułatwienie wygodnej nawigacji po aplikacjach w K8s, ich monitorowanie i zarządzanie nimi. K9s na bieżąco śledzi zmiany w Kubernetes i oferuje szybkie komendy do pracy z obserwowanymi zasobami.

Projekt napisano w języku Go, istnieje już od ponad półtora roku: pierwszy commit został zrobiony 1 lutego 2019 roku. W momencie pisania artykułu ma ponad 9000 gwiazdek na GitHub i około 80 współtwórców. Zobaczmy, co potrafi K9s?

Instalacja i uruchomienie

To aplikacja kliencka (w stosunku do klastra Kubernetes), którą najłatwiej uruchomić jako obraz Docker:

docker run --rm -it -v $KUBECONFIG:/root/.kube/config quay.io/derailed/k9s

Dla niektórych dystrybucji Linux i innych systemów operacyjnych dostępne są również gotowe do instalacji pakiety. W ogólnym przypadku dla systemów Linux można zainstalować plik binarny:

sudo wget -qO- https://github.com/derailed/k9s/releases/download/v0.22.0/k9s_Linux_x86_64.tar.gz | tar zxvf -  -C /tmp/
sudo mv /tmp/k9s /usr/local/bin

Nie ma specyficznych wymagań dotyczących samego klastra K8s. Z opinii wynika, że aplikacja działa nawet z tak starymi wersjami Kubernetes jak 1.12.

Aplikacja uruchamia się, korzystając z domyślnej konfiguracji .kube/config — podobnie jak to robi kubectl.

Nawigacja

Domyślnie otwiera się okno z domyślnym namespace, który jest określony dla kontekstu. To znaczy, że jeśli wpisałeś kubectl config set-context --current --namespace=test, otworzy się namespace test. (O zmianie kontekstów/przestrzeni nazw patrz poniżej.)

Przegląd k9s — zaawansowanego interfejsu terminala dla Kubernetes

Przejście w tryb komend następuje po naciśnięciu «:». Po tym można zarządzać działaniem k9s za pomocą komend — na przykład, aby wyświetlić listę StatefulSets (w bieżącej przestrzeni nazw), można wpisać :sts.

Przegląd k9s — zaawansowanego interfejsu terminala dla Kubernetes

Dla niektórych innych zasobów Kubernetes:

  • :ns — Namespaces;
  • :deploy — Deployments;
  • :ing — Ingresses;
  • :svc — Services.

Aby wyświetlić pełną listę typów zasobów dostępnych do przeglądania, istnieje komenda :aliases.

Wygodnie jest przeglądać także listę komend dostępnych w ramach bieżącego okna za pomocą kombinacji klawiszy: wystarczy nacisnąć «?».

Przegląd k9s — zaawansowanego interfejsu terminala dla Kubernetes

Istnieje również w k9s tryb wyszukiwania, do którego wystarczy wpisać «/». Umożliwia on przeszukiwanie zawartości bieżącego „okna”. Załóżmy, że wcześniej wpisałeś :ns, masz otwartą listę przestrzeni nazw. Jeśli jest ich zbyt wiele, aby nie przewijać długo w dół, wystarczy w oknie z namespaces wpisać /mynamespace.

Aby przeszukiwać zasoby po etykietach, można wybrać wszystkie pod’y w odpowiedniej przestrzeni nazw, a następnie wpisać, na przykład, / -l app=whoami. Otrzymamy listę pod’ów z tą etykietą:

Przegląd k9s — zaawansowanego interfejsu terminala dla Kubernetes

Wyszukiwanie działa we wszystkich typach okien, w tym w logach, podglądzie manifestów YAML i describe dla zasobów — więcej informacji na ten temat znajduje się poniżej.

Jak ogólnie wygląda sekwencja działań w nawigacji?

Za pomocą polecenia :ctx można wybrać kontekst:

Przegląd k9s — zaawansowanego interfejsu terminala dla Kubernetes

Aby wybrać namespace, jest już wspomniana komenda :ns, a następnie można skorzystać z wyszukiwania w potrzebnej przestrzeni: /test.

Jeśli teraz wybierzemy interesujący nas zasób (na przykład ten sam StatefulSet), pojawią się odpowiednie informacje: ile pod’ów zostało uruchomionych, wraz z krótkimi informacjami na ich temat.

Przegląd k9s — zaawansowanego interfejsu terminala dla Kubernetes

Mogą nas interesować tylko pod’y — wtedy wystarczy wpisać :pod. W przypadku ConfigMap’ów (:cm — dla listy tych zasobów) można wybrać interesujący obiekt i nacisnąć „u”, a następnie K9s podpowie, kto konkretnie go (ten CM) używa.

Jeszcze jedną przydatną funkcją do podglądu zasobów jest ich „rentgen” (XRay view). Taki tryb uruchamia się poleceniem :xray RESOURCE i… łatwiej pokazać, jak to działa, niż tłumaczyć. Oto ilustracja dla StatefulSets:

Przegląd k9s — zaawansowanego interfejsu terminala dla Kubernetes
(Każdy z tych zasobów można edytować, zmieniać, robić describe.)

A oto Deployment z Ingress:

Przegląd k9s — zaawansowanego interfejsu terminala dla Kubernetes

Praca z zasobami

O każdym zasobie można uzyskać informacje w formacie YAML lub jego describe naciskając odpowiednie skróty klawiszowe („y” i „d” odpowiednio). Podstawowych operacji, oczywiście, jest jeszcze więcej: ich lista i skróty klawiszowe są zawsze widoczne dzięki wygodnemu „nagłówkowi” w interfejsie (można go ukryć naciskając Ctrl + e).

Przegląd k9s — zaawansowanego interfejsu terminala dla Kubernetes

Podczas edytowania dowolnego zasobu („e” po jego wyborze) otwiera się edytor tekstowy określony w zmiennych środowiskowych (export EDITOR=vim).

Oto jak wygląda szczegółowy opis zasobu (describe):

Przegląd k9s — zaawansowanego interfejsu terminala dla Kubernetes

Taki wynik (lub wynik podglądu manifestu YAML zasobu) można zapisać za pomocą znanego skrótu klawiszowego Ctrl + s. Gdzie on zostanie zapisany, będzie wiadomo z komunikatu K9s:

Log /tmp/k9s-screens-root/kubernetes/Describe-1601244920104133900.yml zapisano pomyślnie!

Z utworzonych plików kopii zapasowych można również przywracać zasoby, wcześniej usuwając systemowe etykiety i adnotacje. W tym celu należy przejść do katalogu z nimi (:dir /tmp), po czym wybrać potrzebny plik i zastosować apply.

W każdej chwili możesz wrócić do poprzedniego ReplicaSet, jeśli obecny sprawia problemy. Aby to zrobić, wybierz odpowiedni RS (:rs z ich listy):

Przegląd k9s — zaawansowanego interfejsu terminala dla Kubernetes

… i wykonaj rollback za pomocą Ctrl + l. Powinno nastąpić powiadomienie, że wszystko przebiegło pomyślnie:

k9s/whoami-5cfbdbb469 pomyślnie przywrócony

Aby skalować repliki, wystarczy nacisnąć «s» (scale) i wybrać wymaganą liczbę instancji:

Przegląd k9s — zaawansowanego interfejsu terminala dla Kubernetes

Do dowolnego z kontenerów możesz wejść za pomocą shell: aby to zrobić, przejdź do odpowiedniego pod’a, naciśnij «s» (shell) i wybierz kontener.

Inne możliwości

Oczywiście wspierane jest również przeglądanie logów («l» dla wybranego zasobu). Aby oglądać nowe logi, nie ma potrzeby ciągłego naciskania Enter: wystarczy oznaczyć («m»), a następnie śledzić tylko nowe wiadomości.

Przegląd k9s — zaawansowanego interfejsu terminala dla Kubernetes

Możesz także wybrać zakres czasowy dla wyjścia logów w tym samym oknie:

  • klawisz «1» — za 1 minutę;
  • «2» — 5 minut;
  • «3» — 15 minut;
  • «4» — 30 minut;
  • «5» — 1 godzina;
  • «0» — przez cały czas życia pod’a.

Specjalny tryb pracy Pulse (komenda :pulse) pokazuje ogólne informacje o klastrze Kubernetes:

Przegląd k9s — zaawansowanego interfejsu terminala dla Kubernetes

Można zobaczyć liczbę zasobów i ich stan (zielonym kolorem pokazane są te, które mają status Running).

Kolejna interesująca funkcja K9s nazywa się Popeye. Sprawdza wszystkie zasoby pod kątem określonych kryteriów poprawności i wyświetla uzyskany «ranking» z wyjaśnieniami. Na przykład można zobaczyć, że brakuje limitów lub zasobów, a jakiś kontener może być uruchamiany pod root…

Przegląd k9s — zaawansowanego interfejsu terminala dla Kubernetes

Obsługuje podstawowe funkcje Helm. Na przykład, można zobaczyć wydania wdrożone w klastrze:

:helm all # wszystko
:helm $namespace # w konkretnym przestrzeni nazw

Benchmark

W K9s wbudowano nawet hey — to prosty generator obciążenia dla serwera HTTP, alternatywa dla bardziej znanego ab (ApacheBench).

Aby go włączyć, należy aktywować port-forward w pod’ie. W tym celu wybierz pod i naciśnij Shift + f, przejdź do podmenu port-forward za pomocą aliasu «pf».

Przegląd k9s — zaawansowanego interfejsu terminala dla Kubernetes

Po wyborze portu i naciśnięciu Ctrl + b uruchomi się benchmark. Wyniki jego pracy są zapisywane w /tmp i dostępne do późniejszego przeglądania w K9s.

Przegląd k9s — zaawansowanego interfejsu terminala dla Kubernetes
Przegląd k9s — zaawansowanego interfejsu terminala dla Kubernetes

Aby zmienić konfigurację benchmark’a, musisz utworzyć plik $HOME/.k9s/bench-.yml (określany dla każdego klastra).

NB: Ważne, aby rozszerzenie wszystkich plików YAML w katalogu .k9s było identycznie .yml (.yaml nie działa poprawnie).

Przykład konfiguracji:

wyniki:
  domyślne:
    # Liczba wątków
    concurrency: 2
    # Liczba zapytań
    requests: 1000
  kontenery:
    # Ustawienia dla kontenera z benchmarkiem
    # Kontener definiowany jest jako namespace/pod-name:container-name
    default/nginx:nginx:
      concurrency: 2
      requests: 10000
      http:
        path: /
        method: POST
        body:
          {"foo":"bar"}
        header:
          Accept:
            - text/html
          Content-Type:
            - application/json
 usługi:
    # Można przeprowadzać benchmarki na usługach typu NodePort i LoadBalancer
    # Składnia: namespace/nazwa-usługi
    default/nginx:
      concurrency: 5
      requests: 500
      http:
        method: GET
        path: /auth
      auth:
        user: flant
        password: s3cr3tp455w0rd

Interfejs

Rodzaj kolumn w listach zasobów modyfikuje się, tworząc plik $HOME/.k9s/views.yml. Przykład jego zawartości:

k9s:
 views:
   v1/pods:
     columns:
       - AGE
       - NAMESPACE
       - NAME
       - IP
       - NODE
       - STATUS
       - READY
   v1/services:
     columns:
       - AGE
       - NAMESPACE
       - NAME
       - TYPE
       - CLUSTER-IP

Rzeczywiście, brakuje kolumny z etykietami, co jest kwestią w projekcie.

Sortowanie według kolumn odbywa się za pomocą kombinacji klawiszy:

  • Shift + n — według nazwy;
  • Shift + o — według węzłów;
  • Shift + i — według IP;
  • Shift + a — według czasu życia kontenera;
  • Shift + t — według liczby restartów;
  • Shift + r — według statusu gotowości;
  • Shift + c — według zużycia CPU;
  • Shift + m — według zużycia pamięci.

Jeśli ktoś nie lubi domyślnego kolorystycznego nadania, w K9s wspierane są nawet skórki. Gotowe przykłady (7 sztuk) są dostępne tutaj. Oto przykład jednej z takich skórek (in the navy):

Przegląd k9s — zaawansowanego interfejsu terminala dla Kubernetes

Wtyczki

Na koniec, wtyczki pozwalają na rozszerzenie możliwości K9s. Osobiście w pracy używałem tylko jednej z nich — kubectl get all -n $namespace.

Wygląda to następująco. Tworzymy plik $HOME/.k9s/plugin.yml z taką zawartością:

plugin:
 get-all:
   shortCut: g    
   confirm: false    
   description: get all
   scopes:
   - all
   command: sh
   background: false
   args:
   - -c
   - "kubectl -n $NAMESPACE get all -o wide | less"

Teraz można przejść do przestrzeni nazw i nacisnąć «g», aby wykonać powiązaną komendę:

Przegląd k9s — zaawansowanego interfejsu terminala dla Kubernetes

Wśród wtyczek są na przykład integracje z kubectl-jq oraz narzędziem do przeglądania logów stern.

Podsumowanie

Moim zdaniem K9s okazało się bardzo praktyczne w pracy: dość szybko można przyzwyczaić się do wyszukiwania wszystkiego potrzebnego bez użycia kubectl. Cieszyło mnie przeglądanie logów oraz ich zapis, szybka edycja zasobów, ogólna szybkość działania*, przydatny okazał się tryb Popeye. Osobnej wzmianki wymaga możliwość tworzenia wtyczek i dostosowywania aplikacji do własnych potrzeb.

* Choć przy dużej ilości logów zauważyłem również wolne działanie K9s. W takich momentach narzędzie „pożerało” 2 rdzenie w procesorze Intel Xeon E312xx i potrafiło nawet zawieszać się.

Czego brakuje w tej chwili? Szybkiego powrotu do poprzedniej wersji (mowa nie o RS) bez przechodzenia do katalogu. Poza tym, przywracanie odbywa się tylko dla przez zasobu: jeśli usuniesz adnotację lub etykietę, będziesz musiał usunąć i przywrócić cały zasób (tutaj konieczne będzie przejście do katalogu). Inna drobnostka — brakuje daty takich zapisanych „kopii zapasowych”.

P.S.

Przeczytaj także na naszym blogu:

Źródło: habr.com

Kup solidny hosting stron z ochroną przed DDoS, serwery VPS VDS 🔥 Kup solidny hosting stron z ochroną przed DDoS, serwery VPS VDS | ProHoster