
fornisce un'interfaccia utente del terminale per interagire con i cluster Kubernetes. L'obiettivo di questo progetto Open Source è semplificare la navigazione tra le applicazioni in K8s, il loro monitoraggio e gestione. K9s tiene costantemente d'occhio i cambiamenti in Kubernetes e propone comandi rapidi per lavorare con le risorse monitorate.
Il progetto è scritto in Go e esiste da oltre un anno e mezzo: il primo commit è stato effettuato il 1 febbraio 2019. Al momento della scrittura di questo articolo, conta oltre 9000 stelle su e circa 80 contributori. Cosa può fare k9s?
Installazione e avvio
Questa è un'applicazione client (rispetto al cluster Kubernetes) che può essere avviata più facilmente come immagine Docker:
docker run --rm -it -v $KUBECONFIG:/root/.kube/config quay.io/derailed/k9sPer alcune distribuzioni Linux e altri sistemi operativi ci sono anche installatori pronti all'uso . In generale, per i sistemi Linux è possibile installare il file binario:
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/binNon ci sono requisiti specifici per il cluster K8s stesso. A giudicare dai feedback, l'applicazione funziona anche con versioni più vecchie di Kubernetes, come la 1.12.
L'applicazione si avvia utilizzando la configurazione standard .kube/config — similmente a come fa kubectl.
Navigazione
Di default si apre una finestra con il namespace standard specificato per il contesto. Quindi, se hai scritto kubectl config set-context --current --namespace=test, si aprirà il namespace test. (Per il cambio di contesti/spazi dei nomi, vedi sotto.)

Navigare in modalità comandi avviene premendo il tasto «:». Dopo di che, puoi gestire il funzionamento di k9s tramite comandi: ad esempio, per visualizzare l'elenco degli StatefulSets (nel namespace corrente) puoi digitare :sts.
![]()
Per alcune altre risorse Kubernetes:
-
:ns— Namespaces; -
:deploy— Deployments; -
:ing— Ingresses; -
:svc— Services.
Per ottenere un elenco completo dei tipi di risorse disponibili per la visualizzazione, c'è il comando :aliases.
È comodo visualizzare anche l'elenco dei comandi disponibili tramite combinazioni di tasti rapidi all'interno della finestra corrente: basta premere il tasto «?».

Inoltre, k9s ha una modalità di ricerca, per passare alla quale è sufficiente digitare «/». Questo consente di cercare nel contenuto della finestra corrente. Supponiamo che tu abbia precedentemente digitato :ns, ti si aprirà l'elenco degli spazi dei nomi. Se ce ne sono troppi, per non dover scorrere a lungo verso il basso, è sufficiente digitare nella finestra con i namespaces /mynamespace.
Per cercare tra i label, puoi selezionare tutti i pod nell'namespace desiderato, dopodiché puoi inserire, ad esempio, / -l app=whoami. Otterremo un elenco di pod con questo label:
![]()
La ricerca funziona in tutte le tipologie di finestre, comprese le registrazioni, la visualizzazione dei manifesti YAML e describe per le risorse — maggiori dettagli su queste funzionalità sono disponibili qui sotto.
Come appare in generale la sequenza di azioni per la navigazione?
Utilizzando il comando :ctx puoi selezionare il contesto:

Per selezionare l'namespace c'è già il comando menzionato :ns, e poi puoi utilizzare la ricerca per l'namespace desiderato: /test.
Se ora selezioni la risorsa di interesse (ad esempio, il solito StatefulSet), apparirà l'informazione corrispondente: quanti pod sono in esecuzione con brevi dettagli su di essi.
![]()
Potrebbero interessare solo i pod — allora basta inserire :pod. Nel caso dei ConfigMap (:cm — per l'elenco di queste risorse) puoi selezionare l'oggetto di interesse e premere "u", dopo di che K9s suggerirà chi lo utilizza specificamente (questo CM).
Un'altra comoda funzione per visualizzare le risorse è il loro "XRay" (vista XRay). Questa modalità viene attivata con il comando :xray RESOURCE e... è più semplice mostrare come funziona piuttosto che spiegarlo. Ecco un'illustrazione per gli StatefulSets:

(Ognuna di queste risorse può essere modificata, cambiata, creata describe.)
Ecco un Deployment con Ingress:

Lavorare con le risorse
Su ogni risorsa puoi ottenere informazioni in YAML o i suoi describe premendo le corrispondenti combinazioni di tasti ("y" e "d" rispettivamente). Le operazioni di base, ovviamente, sono ancora di più: il loro elenco e le combinazioni di tasti sono sempre in vista grazie alla comoda "testata" nell'interfaccia (si nasconde premendo Ctrl + e).

Quando modifichi qualsiasi risorsa ("e" dopo la sua selezione) si apre un editor di testo definito nelle variabili ambientali (export EDITOR=vim).
Ecco come appare la descrizione dettagliata della risorsa (describe):

Questo output (o l'output di visualizzazione del manifesto YAML della risorsa) può essere salvato utilizzando la nota combinazione di tasti Ctrl + s. Dove verrà salvato, sarà indicato dal messaggio di K9s:
Log /tmp/k9s-screens-root/kubernetes/Describe-1601244920104133900.yml salvato con successo! Dai file di backup creati puoi anche ripristinare risorse, previa rimozione delle etichette e annotazioni di sistema. Per farlo, sarà necessario accedere alla directory contenente questi file (:dir /tmp), dopodiché selezionare il file desiderato e applicarlo apply.
A proposito, in qualsiasi momento è possibile tornare a un ReplicaSet precedente se ci sono problemi con quello attuale. Per farlo, è necessario selezionare il RS desiderato (:rs per la loro lista):

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

In qualsiasi contenitore è possibile accedere con la shell: per farlo, vai al pod desiderato, premi «s» (shell) e seleziona il contenitore.
Altre possibilità
Certo, è supportata anche la visualizzazione dei log («l» per la risorsa selezionata). E per visualizzare i nuovi log, non è necessario premere continuamente Invio: basta fare un mark («m») e poi monitorare solo i nuovi messaggi.

In questa stessa finestra è possibile selezionare l'intervallo di tempo per visualizzare i log:
- il 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 funzionamento speciale Pulse (comando :pulse) mostra informazioni generali sul cluster Kubernetes:

In esso è possibile vedere il numero di risorse e il loro stato (quelle con stato mostrato in verde) Esecuzione).
Un'altra interessante funzione di K9s si chiama Popeye. Controlla tutte le risorse in base a specifici criteri di correttezza e restituisce un «rating» con spiegazioni. Ad esempio, puoi vedere che mancano i limiti o le richieste, o che un contenitore potrebbe essere eseguito come root…

C'è un supporto base per Helm. Ad esempio, puoi vedere i rilasci distribuiti nel cluster:
:helm all # tutti
:helm $namespace # in uno spazio dei nomi specifico
Benchmark
In K9s è integrato anche — è un semplice generatore di carico per server HTTP, un'alternativa al più noto ab (ApacheBench).
Per attivarlo, sarà necessario attivare il port-forward nel pod. Per farlo, scegli il pod e premi Shift + f, quindi vai nel sottomenu port-forward usando l'alias «pf».

Dopo aver selezionato la porta e premuto Ctrl + b, verrà avviato il benchmark. I risultati della sua esecuzione vengono salvati in /tmp e sono disponibili per la visualizzazione successiva in K9s.


Per modificare la configurazione del benchmark, è necessario creare il 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:
benchmark:
predefiniti:
# Numero di thread
concorrenza: 2
# Numero di richieste
richieste: 1000
contenitori:
# Impostazioni per il contenitore del benchmark
# Il contenitore è definito come namespace/pod-name:container-name
default/nginx:nginx:
concorrenza: 2
richieste: 10000
http:
percorso: /
metodo: POST
corpo:
{"foo":"bar"}
intestazione:
Accetta:
- text/html
Content-Type:
- application/json
servizi:
# È possibile eseguire benchmark su servizi del tipo NodePort e LoadBalancer
# Sintassi: namespace/service-name
default/nginx:
concorrenza: 5
richieste: 500
http:
metodo: GET
percorso: /auth
auth:
utente: flant
password: s3cr3tp455w0rd
Document
Il tipo di colonne per le liste delle risorse viene modificato creando un file $HOME/.k9s/views.yml. Ecco un esempio del suo contenuto:
k9s:
viste:
v1/pods:
colonne:
- ETÀ
- NAMESPACE
- NOME
- IP
- NODO
- STATO
- PRONTO
v1/services:
colonne:
- ETÀ
- NAMESPACE
- NOME
- TIPO
- CLUSTER-IP
Certo, manca una colonna per le etichette, su cui c'è .
L'ordinamento per colonne avviene tramite 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 consumo di CPU;
- Shift + m — per consumo di memoria.
Se a qualcuno non piace il tema di default, K9s supporta anche Esempi pronti (7 in totale) sono disponibili . Ecco un esempio di uno di questi skin (in the navy):

Plugin
Infine, permettono di estendere le funzionalità di K9s. Io stesso ho usato solo uno di essi nella mia attività — kubectl get all -n $namespace.
Questo appare in questo modo. Creiamo un file $HOME/.k9s/plugin.yml con il seguente contenuto:
plugin:
get-all:
scorciatoia: g
conferma: false
descrizione: ottieni tutto
ambiti:
- all
comando: sh
background: false
argomenti:
- -c
- "kubectl -n $NAMESPACE get all -o wide | less"Ora si può passare nello spazio dei nomi e premere «g» per eseguire il comando corrispondente:

Tra i plugin ci sono, ad esempio, integrazioni con kubectl-jq e lo strumento per visualizzare i log .
Conclusione
A mio avviso, K9s si è rivelato molto comodo da utilizzare: ci si abitua rapidamente a cercare tutto il necessario senza dover utilizzare kubectl. Mi ha colpito la visualizzazione dei log e il loro salvataggio, la rapida modifica delle risorse, la velocità di lavoro in generale*, la modalità Popeye si è rivelata utile. Vale la pena menzionare le possibilità di creare plugin e adattare l'applicazione alle proprie esigenze.
* Anche se con un grande volume di log sento che K9s lavora lentamente. In questi momenti l'utilità "mangiava" 2 core su Intel Xeon E312xx e poteva persino bloccarsi.
Cosa manca al momento? Un rapido rollback alla versione precedente (non si parla di RS) senza dover accedere alla 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 accedere alla directory). Un'altra piccola cosa — manca la data di questi "backup" salvati.
P.S.
Leggi anche nel nostro blog:
- «»;
- «»;
- «».
Fonte: habr.com
