Přehled k9s — pokročilého terminálového rozhraní pro Kubernetes

Přehled k9s — pokročilého terminálového rozhraní pro Kubernetes

K9s poskytuje terminálové rozhraní pro interakci s Kubernetes klastry. Cílem tohoto open-source projektu je usnadnit uživatelskou navigaci aplikacemi v K8s, jejich sledování a správu. K9s neustále monitoruje změny v Kubernetes a nabízí rychlé příkazy pro práci se sledovanými zdroji.

Projekt je napsán v Go a existuje již více než půl druhého roku: první commit byl proveden 1. února 2019. K datu psaní článku má více než 9000 hvězdiček na GitHub a přibližně 80 přispěvatelů. Podívejme se, co k9s umí?

Instalace a spuštění

Jedná se o klientskou aplikaci (ve vztahu k Kubernetes klastru), kterou je nejjednodušší spustit jako Docker obraz:

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

Pro některé distribuce Linuxu a další operační systémy jsou také k dispozici připravené instalační balíčky. Obecně lze pro linuxové systémy nainstalovat binární soubor:

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

Pro samotný klastr K8s nejsou žádné specifické požadavky. Podle recenzí aplikace funguje i se staršími verzemi Kubernetes, jako je 1.12.

Aplikace se spouští pomocí standardního konfiguračního .kube/config — analogického tomu, jak to dělá kubectl.

Navigace

Ve výchozím nastavení se otevře okno se standardním namespace, který je uveden pro kontext. To znamená, že pokud jste zapsali kubectl config set-context --current --namespace=test, pak se otevře namespace test. (O přepínání kontextů/jmenných prostorů viz níže.)

Přehled k9s — pokročilého terminálového rozhraní pro Kubernetes

Přepnutí do režimu příkazů se provádí stisknutím „:“. Poté lze spravovat práci s k9s pomocí příkazů — například pro zobrazení seznamu StatefulSets (ve vybraném jmenném prostoru) můžete zadat :sts.

Přehled k9s — pokročilého terminálového rozhraní pro Kubernetes

Pro některé další zdroje Kubernetes:

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

Pro zobrazení úplného seznamu typů zdrojů, které jsou k dispozici k zobrazení, existuje příkaz :aliases.

Je také užitečné prohlédnout si seznam příkazů dostupných pomocí klávesových zkratek v rámci aktuálního okna: stačí stisknout „?“.

Přehled k9s — pokročilého terminálového rozhraní pro Kubernetes

V k9s je také režim vyhledávání, pro přechod do kterého stačí zadat „/“. S jeho pomocí se provádí vyhledávání v aktuálním „okně“. Předpokládejme, že jste dříve zadali :ns, máte otevřený seznam jmenných prostorů. Pokud jich je moc, abyste nemuseli dlouze scrollovat dolů, stačí v okně s namespaces zadat /mynamespace.

Pro hledání podle štítků můžete vybrat všechny poděly ve správném jmenném prostoru, poté můžete zadat například / -l app=whoami. Dostaneme seznam podělů s tímto štítkem:

Přehled k9s — pokročilého terminálového rozhraní pro Kubernetes

Hledání funguje ve všech typech oken, včetně protokolů, zobrazení YAML manifestů a popis pro zdroje — více o těchto funkcích viz níže.

Jak celkově vypadá postup navigace?

Pomocí příkazu :ctx můžete vybrat kontext:

Přehled k9s — pokročilého terminálového rozhraní pro Kubernetes

Pro výběr jmenného prostoru je zde již zmiňovaný příkaz :ns, a poté můžete použít hledání pro požadovaný prostor: /test.

Pokud nyní vyberete nás zajímající zdroj (například stejný StatefulSet), zobrazí se odpovídající informace: kolik je spuštěno podělů s krátkými informacemi o nich.

Přehled k9s — pokročilého terminálového rozhraní pro Kubernetes

Mohou být zajímavé pouze poděly — pak stačí zadat :pod. V případě ConfigMapů (:cm — pro seznam těchto zdrojů) můžete vybrat zajímavý objekt a stisknout „u“, po čemž K9s naznačí, kdo konkrétně jej (tento CM) používá.

Další užitečná funkce pro prohlížení zdrojů — jejich „rentgen“ (XRay view). Tento režim se spouští příkazem :xray RESOURCE a… je jednodušší ukázat, jak funguje, než to vysvětlovat. Zde je ilustrace pro StatefulSets:

Přehled k9s — pokročilého terminálového rozhraní pro Kubernetes
(Každý z těchto zdrojů lze upravovat, měnit, provádět popis.)

A tady je Deployment s Ingress:

Přehled k9s — pokročilého terminálového rozhraní pro Kubernetes

Práce se zdroji

O každém zdroji lze získat informace v YAML nebo jeho popis stiskem příslušných klávesových zkratek („y“ a „d“ resp.). Základních operací je samozřejmě ještě víc: jejich seznam a klávesové zkratky jsou vždy na očích díky praktické „hlavičce“ v rozhraní (skryje se stiskem Ctrl + e).

Přehled k9s — pokročilého terminálového rozhraní pro Kubernetes

Při úpravách jakéhokoliv zdroje („e“ po jeho vybrání) se otevře textový editor definovaný v proměnných prostředí (export EDITOR=vim).

A takto vypadá podrobný popis zdroje (popis):

Přehled k9s — pokročilého terminálového rozhraní pro Kubernetes

Takový výstup (nebo výstup z prohlížení YAML manifestu zdroje) lze uložit pomocí obvyklé klávesové zkratky Ctrl + s. Kde bude uložen, bude známo z zprávy K9s:

Log /tmp/k9s-screens-root/kubernetes/Describe-1601244920104133900.yml was saved successfully!

Z vytvořených zálohovacích souborů lze také obnovovat zdroje, přičemž předtím je třeba odstranit systémové štítky a anotace. K tomu je nutné přejít do adresáře s nimi (:dir /tmp), poté vybrat požadovaný soubor a použít apply.

Mimochodem, kdykoli se můžete vrátit k předchozímu ReplicaSetu, pokud máte s aktuálním problém. K tomu je potřeba vybrat požadovaný RS (:rs pro jejich seznam):

Přehled k9s — pokročilého terminálového rozhraní pro Kubernetes

… a provést rollback pomocí Ctrl + l. Měli bychom dostat oznámení, že všechno proběhlo úspěšně:

k9s/whoami-5cfbdbb469 úspěšně vrácen zpět

A pro škálování replik stačí stisknout „s“ (scale) a vybrat požadovaný počet instancí:

Přehled k9s — pokročilého terminálového rozhraní pro Kubernetes

Do jakéhokoli z kontejnerů se můžete dostat pomocí shellu: k tomu přejděte k požadovanému podu, stiskněte „s“ (shell) a vyberte kontejner.

Další možnosti

Samozřejmě, že je podporováno i prohlížení logů („l“ pro vybraný zdroj). A abyste viděli nové logy, není potřeba neustále mačkat Enter: stačí udělat značkování („m“), po kterém se budou sledovat pouze nové zprávy.

Přehled k9s — pokročilého terminálového rozhraní pro Kubernetes

Také v tomto okně můžete vybrat časové období pro výstup logů:

  • klávesa „1“ — za 1 minutu;
  • „2“ — 5 minut;
  • „3“ — 15 minut;
  • „4“ — 30 minut;
  • „5“ — 1 hodina;
  • „0“ — za celou dobu života podu.

Speciální pracovní režim Pulse (příkaz :pulse) zobrazuje obecné informace o Kubernetes klastru:

Přehled k9s — pokročilého terminálového rozhraní pro Kubernetes

V něm můžete vidět množství zdrojů a jejich stav (zeleně jsou zobrazeny ty, které mají status Dokončeno).

Další zajímavou funkcí K9s se nazývá Popeye. Kontroluje všechny zdroje podle určitých kritérií správnosti a vyhodnocuje výsledný „rating“ s vysvětlením. Například lze vidět, že chybí limity nebo že nějaký kontejner může běžet pod rootem…

Přehled k9s — pokročilého terminálového rozhraní pro Kubernetes

Existuje základní podpora pro Helm. Například takto můžete zobrazit vydání nasazená v klastru:

:helm all # všechna
:helm $namespace # ve konkrétním jmenném prostoru

Benchmark

V K9s je dokonce zabudovaný hey — to je jednoduchý generátor zátěže pro HTTP server, alternativa známějšímu ab (ApacheBench).

Pro jeho aktivaci je potřeba povolit port-forward v podu. K tomu vyberte pod a stiskněte Shift + f, přejděte do podmenu port-forward pomocí aliasu „pf“.

Přehled k9s — pokročilého terminálového rozhraní pro Kubernetes

Po výběru portu a stisknutí Ctrl + b se benchmark spustí. Výsledky jeho práce jsou uloženy v /tmp a jsou k dispozici pro následné prohlížení v K9s.

Přehled k9s — pokročilého terminálového rozhraní pro Kubernetes
Přehled k9s — pokročilého terminálového rozhraní pro Kubernetes

Pro změnu konfigurace benchmarku je potřeba vytvořit soubor $HOME/.k9s/bench-.yml (definovaný pro každý klastr).

NB: Důležité je, aby přípona všech YAML souborů v adresáři .k9s byla přesně .yml (.yaml nefunguje správně).

Příklad konfigurace:

benchmarks:
  defaults:
    # Počet vláken
    concurrency: 2
    # Počet požadavků
    requests: 1000
  containers:
    # Nastavení pro kontejner s benchmarkem
    # Kontejner je definován 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
 services:
    # Je možné provádět benchmark na službách typu NodePort a LoadBalancer
    # Syntaxe: namespace/service-name
    default/nginx:
      concurrency: 5
      requests: 500
      http:
        method: GET
        path: /auth
      auth:
        user: flant
        password: s3cr3tp455w0rd

Rozhraní

Zobrazení sloupců pro seznamy zdrojů se mění vytvořením souboru $HOME/.k9s/views.yml. Příklad jeho obsahu:

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

Opravdu, chybí sloupec pro labely, na což je issue v projektu.

Řazení podle sloupců se provádí klávesovými zkratkami:

  • Shift + n — podle jména;
  • Shift + o — podle uzlů;
  • Shift + i — podle IP;
  • Shift + a — podle doby životnosti kontejneru;
  • Shift + t — podle počtu restartů;
  • Shift + r — podle stavu připravenosti;
  • Shift + c — podle spotřeby CPU;
  • Shift + m — podle spotřeby paměti.

Pokud se někomu nelíbí výchozí barevné schéma, v K9s je dokonce podporováno skinů. Hotové příklady (7 kusů) jsou k dispozici zde. Zde je příklad jednoho z těchto skinů (in the navy):

Přehled k9s — pokročilého terminálového rozhraní pro Kubernetes

Pluginy

Nakonec plugins umožňují rozšířit funkčnost K9s. Sám jsem v práci používal pouze jeden z nich — kubectl get all -n $namespace.

Vypadá to takto. Vytvořte soubor $HOME/.k9s/plugin.yml s tímto obsahem:

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"

Nyní se můžete přepnout do prostoru jmen a stisknout „g“ pro provedení příslušného příkazu:

Přehled k9s — pokročilého terminálového rozhraní pro Kubernetes

Mezi pluginy jsou například integrace s kubectl-jq a nástrojem pro prohlížení logů stern.

Závěr

Podle mého názoru je K9s velmi pohodlné pro práci: rychle si zvyknete na hledání všech potřebných informací bez použití kubectl. Potěšilo mě prohlížení logů a jejich ukládání, rychlé upravování zdrojů, celková rychlost práce, režim Popeye se ukázal jako užitečný. Stojí za zmínku možnosti vytváření pluginů a přizpůsobení aplikace vlastním potřebám.

* I když jsem si při velkém objemu logů také všiml pomalého fungování K9s. V takových chvílích nástroj „zabíral“ 2 jádra na Intel Xeon E312xx a někdy dokonce zamrzal.

Co v tuto chvíli chybí? Rychlé vrácení se na předchozí verzi (nejde o RS) bez přechodu do adresáře. Kromě toho se obnova provádí pouze pro celé zdroje: pokud odstraníte anotaci nebo štítek, budete muset odstranit a obnovit celý zdroj (zde bude nutné přejít do adresáře). Další drobnost — chybí datum takových uložených „záloh“.

P.S.

Přečtěte si také náš blog:

Zdroj: habr.com

Koupit spolehlivý hosting pro webové stránky s ochranou proti DDoS, VPS VDS servery 🔥 Koupit spolehlivý hosting pro webové stránky s ochranou proti DDoS, VPS VDS servery | ProHoster