
fornisce un'interfaccia terminale per interagire con i cluster Kubernetes. L'obiettivo di questo progetto Open Source è facilitare la navigazione agevole delle applicazioni in K8s, il monitoraggio e la gestione. K9s osserva costantemente i cambiamenti in Kubernetes e offre comandi rapidi per lavorare con le risorse monitorate.
Il progetto è scritto in Go ed esiste da oltre un anno e mezzo: il primo commit è stato effettuato il 1 febbraio 2019. Alla data di scrittura dell'articolo, conta più di 9000 stelle su e circa 80 collaboratori. Vediamo cosa può fare k9s?
Installazione e avvio
È un'applicazione client (rispetto al cluster Kubernetes) che è più semplice avviare come immagine Docker:
docker run --rm -it -v $KUBECONFIG:/root/.kube/config quay.io/derailed/k9sPer alcuni distributori Linux e altri sistemi operativi ci sono anche pacchetti pronti per l'installazione 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
Non ci sono requisiti specifici per il cluster K8s stesso. A quanto si dice, l'applicazione funziona anche con versioni più vecchie di Kubernetes, come la 1.12.Non ci sono requisiti specifici per il cluster K8s. Dai feedback, l'applicazione funziona anche con versioni di Kubernetes così vecchie come la 1.12.
L'applicazione si avvia utilizzando la configurazione standard .kube/config — in modo simile a come fa kubectl.
Navigazione
Per impostazione predefinita, si apre una finestra con il namespace standard specificato per il contesto. Cioè, se hai scritto kubectl config set-context --current --namespace=test, si aprirà il namespace test. (Per il cambiamento di contesti/spazi dei nomi, vedi sotto.)

Passare a modalità comando si realizza premendo «:». Dopo di che, puoi gestire il funzionamento di k9s usando comandi — ad esempio, per visualizzare l'elenco degli StatefulSet (nel namespace corrente) puoi digitare :sts.
![]()
Per alcune altre risorse Kubernetes:
-
:ns— Namespaces; -
:deploy— Deployments; -
:ing— Ingress; -
:svc— Servizi.
Per visualizzare l'elenco completo dei tipi di risorse disponibili per la visualizzazione, usa il comando :aliases.
È utile visualizzare anche l'elenco dei comandi disponibili tramite le combinazioni di tasti nel contesto della finestra corrente: per farlo, basta premere «?».

Inoltre, in k9s c'è una modalità di ricerca, per accedervi è sufficiente digitare «/». Con questa modalità puoi cercare nel contenuto della finestra attuale. Ad esempio, se hai precedentemente digitato :ns, hai aperto un elenco di spazi dei nomi. Se ce ne sono troppi, per non dover scorrere a lungo verso il basso, basta inserire nella finestra degli spazi dei nomi /mynamespace.
Per cercare per etichette, puoi selezionare tutti i pod nel namespace desiderato e poi inserire, ad esempio, / -l app=whoami. Otterremo un elenco di pod con questa etichetta:
![]()
La ricerca funziona in tutti i tipi di finestre, comprese le registrazioni, la visualizzazione dei manifest YAML e describe per le risorse — per maggiori dettagli su queste funzionalità, vedere di seguito.
Come appare in generale la sequenza di azioni per la navigazione?
Utilizzando il comando :ctx puoi selezionare il contesto:

Per scegliere il namespace, c'è il comando già menzionato :ns, e poi puoi utilizzare la ricerca per lo spazio desiderato: /test.
Se ora selezioni la risorsa di nostro interesse (ad esempio, lo stesso StatefulSet), appariranno le informazioni corrispondenti: quanti pod sono in esecuzione con brevi dettagli su di essi.
![]()
Potrebbero interessare solo i pod — in questo caso, basta inserire :pod. Nel caso dei ConfigMap (:cm — per l'elenco di queste risorse) puoi scegliere l'oggetto di interesse e premere «u», dopo di che K9s ti dirà chi lo utilizza specificamente (questo CM).
Un'altra comoda funzionalità per visualizzare le risorse è il loro «raggio X» (XRay view). Questo stato è attivato dal comando :xray RESOURCE e… è più facile mostrare come funziona piuttosto che spiegarlo. Ecco un'illustrazione per gli StatefulSets:

(Ognuno di questi risorse può essere modificato, cambiato, fatto describe.)
Ecco un Deployment con Ingress:

Gestione delle risorse
Di ogni risorsa si può ottenere informazioni in YAML o nella sua describe premendo le relative combinazioni di tasti («y» e «d» rispettivamente). Ci sono sicuramente più operazioni di base: la loro lista e le combinazioni di tasti sono sempre visibili grazie all'utile «header» nell'interfaccia (si nasconde premendo Ctrl + e).

Quando si modifica qualsiasi risorsa («e» dopo la sua selezione) si apre un editor di testo, definito nelle variabili d'ambiente (export EDITOR=vim).
Ecco come appare una descrizione dettagliata della risorsa (describe):

Questo output (o l'output del progetto YAML della risorsa) può essere salvato con la consueta combinazione di tasti Ctrl + s. Dove verrà salvato, sarà noto dal messaggio di K9s:
Log /tmp/k9s-screens-root/kubernetes/Describe-1601244920104133900.yml salvato con successo! Dai file di backup creati è possibile anche ripristinare le risorse, eliminando preventivamente le etichette e le annotazioni di sistema. Per fare ciò è necessario andare nella directory con loro (:dir /tmp), dopo di che selezionare il file desiderato e applicarlo applica.
A proposito, è possibile tornare a un ReplicaSet precedente in qualsiasi momento, se ci sono problemi con quello attuale. Per farlo, è necessario selezionare il RS desiderato (:rs per la loro lista):

… ed eseguire il rollback utilizzando Ctrl + l. Dobbiamo ricevere una notifica che tutto è andato a buon fine:
k9s/whoami-5cfbdbb469 è stato ripristinato con successoE per scalare le repliche, basta premere «s» (scale) e scegliere il numero di istanze desiderato:

È possibile accedere a qualsiasi contenitore tramite shell: per farlo, passare al pod desiderato, premere «s» (shell) e scegliere il contenitore.
Altre funzionalità
Certo, è supportata anche la visualizzazione dei log («l» per la risorsa selezionata). E per visualizzare i nuovi log, non è necessario premere Enter continuamente: basta contrassegnare («m»), dopodiché si possono monitorare solo i nuovi messaggi.

In questa stessa finestra è possibile selezionare un intervallo di tempo per l'output dei log:
- tasto «1» — per 1 minuto;
- «2» — 5 minuti;
- «3» — 15 minuti;
- «4» — 30 minuti;
- «5» — 1 ora;
- «0» — per tutta la durata del pod.
La modalità di lavoro speciale Pulse (comando :pulse) mostra informazioni generali sul cluster Kubernetes:

In esso è possibile vedere la quantità di risorse e il loro stato (quelle con stato mostrato in verde) Esecuzione).
Un'altra funzione interessante di K9s si chiama Popeye. Essa verifica tutte le risorse rispetto a determinati criteri di correttezza e restituisce un 'rating' con spiegazioni. Ad esempio, è possibile vedere che mancano spazi o limiti, e alcuni container possono essere eseguiti come root...

C'è un supporto di base per Helm. Ad esempio, è possibile controllare i rilasci distribuiti nel cluster:
:helm all # tutti
:helm $namespace # in uno spazio dei nomi specifico
Benchmark
In K9s hanno integrato anche — è un semplice generatore di carico per server HTTP, un'alternativa al più noto ab (ApacheBench).
Per attivarlo, è necessaria l'attivazione del port-forward nel pod. Per fare ciò, selezioniamo il pod e premiamo Shift + f, quindi accediamo al sottomenu port-forward usando l'alias 'pf'.

Dopo aver selezionato la porta e premuto Ctrl + b, il benchmark partirà. I risultati del suo lavoro vengono salvati in /tmp e sono disponibili per la consultazione successiva in K9s.


Per modificare la configurazione del benchmark è necessario creare un file $HOME/.k9s/bench-.yml (definito per ogni cluster).
NB: È importante che l'estensione di tutti i file YAML nella directory .k9s sia proprio .yml (.yaml non funziona correttamente).
Esempio di configurazione:
benchmarks:
defaults:
# Numero di thread
concurrency: 2
# Numero di richieste
requests: 1000
containers:
# Impostazioni per il contenitore del benchmark
# Il contenitore è definito come 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:
# È possibile eseguire benchmark su servizi di tipo NodePort e LoadBalancer
# Sintassi: namespace/service-name
default/nginx:
concurrency: 5
requests: 500
http:
method: GET
path: /auth
auth:
user: flant
password: s3cr3tp455w0rd
Interfaccia
La visualizzazione delle colonne per le liste delle risorse è modificata creando un file $HOME/.k9s/views.yml. Esempio del suo contenuto:
k9s:
views:
v1/pods:
columns:
- AGE
- NAMESPACE
- NAME
- IP
- NODE
- STATUS
- READY
v1/services:
columns:
- AGE
- NAMESPACE
- NAME
- TYPE
- CLUSTER-IP
Tuttavia, manca la colonna per le etichette, su cui esiste .
L'ordinamento per colonne viene effettuato mediante combinazioni di tasti:
- Shift + n — per nome;
- Shift + o — per nodi;
- Shift + i — per IP;
- Shift + a — per tempo di vita del contenitore;
- Shift + t — per numero di riavvii;
- Shift + r — per stato di prontezza;
- Shift + c — per utilizzo della CPU;
- Shift + m — per l'uso della memoria.
Se a qualcuno non piace il design predefinito, K9s supporta anche . Sono disponibili esempi pronti (7 in totale) . Ecco un esempio di una di queste skin (in the navy):

Plugin
Infine, che espandono le possibilità di K9s. Personalmente ho utilizzato solo una di esse — kubectl get all -n $namespace.
Appare in questo modo. Creiamo un file $HOME/.k9s/plugin.yml con il seguente contenuto:
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"Ora puoi passare allo spazio dei nomi e premere «g» per eseguire il comando corrispondente:

Tra i plugin ci sono, ad esempio, integrazioni con kubectl-jq e l'utility per visualizzare i log .
Conclusione
A mio avviso, K9s si è rivelata molto comoda da usare: ci si abitua rapidamente a cercare tutto senza utilizzare kubectl. Mi ha colpito la visualizzazione dei log e il loro salvataggio, l'editing rapido delle risorse, la velocità complessiva*, si è rivelato utile il comando Popeye. Merita una menzione a parte la possibilità di creare plugin e personalizzare l'applicazione secondo le proprie esigenze.
* Anche se con un grande volume di log ho notato un funzionamento lento di K9s. In quei momenti, l'utility consumava 2 core di Intel Xeon E312xx e poteva persino bloccarsi.
Di cosa abbiamo bisogno al momento? Di un ripristino veloce alla versione precedente (non parlo di RS) senza dover entrare nella directory. Inoltre, il ripristino avviene solo per tutto il risorsa: se hai eliminato un'annotazione o un'etichetta, dovrai eliminare e ripristinare l'intera risorsa (qui sarà necessario entrare nella directory). Un altro piccolo dettaglio: manca la data dei backup salvati.
P.S.
Leggete anche nel nostro blog:
- «»;
- «»;
- «».
Fonte: habr.com
