
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 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/k9sDla niektórych dystrybucji Linux i innych systemów operacyjnych dostępne są również gotowe do instalacji . 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/binNie 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.)

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.
![]()
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ąć «?».

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ą:
![]()
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:

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.
![]()
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:

(Każdy z tych zasobów można edytować, zmieniać, robić describe.)
A oto Deployment z Ingress:

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).

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):

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):

… i wykonaj rollback za pomocą Ctrl + l. Powinno nastąpić powiadomienie, że wszystko przebiegło pomyślnie:
k9s/whoami-5cfbdbb469 pomyślnie przywróconyAby skalować repliki, wystarczy nacisnąć «s» (scale) i wybrać wymaganą liczbę instancji:

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.

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:

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…

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 — 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».

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.


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 .
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 . Gotowe przykłady (7 sztuk) są dostępne . Oto przykład jednej z takich skórek (in the navy):

Wtyczki
Na koniec, 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ę:

Wśród wtyczek są na przykład integracje z kubectl-jq oraz narzędziem do przeglądania logów .
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
