
O K9s fornece uma interface de usuário de terminal para interagir com clusters Kubernetes. O objetivo deste projeto de código aberto é facilitar a navegação, o monitoramento e o gerenciamento de aplicativos no K8s. O K9s monitora constantemente as mudanças no Kubernetes e oferece comandos rápidos para trabalhar com recursos monitorados.
O projeto está escrito em Go, já existe há mais de um ano e meio: o primeiro commit foi feito em 1º de fevereiro de 2019. No momento em que este livro foi escrito, havia mais de 9.000 estrelas no GitHub e cerca de 80 colaboradores. Vamos ver o que o k9s pode fazer?
Instalação e lançamento
Este é um aplicativo cliente (em relação ao cluster Kubernetes) e é mais fácil de executar como uma imagem Docker:
docker run --rm -it -v $KUBECONFIG:/root/.kube/config quay.io/derailed/k9s
Para algumas distribuições do Linux e outros sistemas operacionais, também existem pacotes prontos para instalação . Em geral, para sistemas Linux, você pode instalar um arquivo binário:
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
Não há requisitos específicos para o cluster K8s em si. Com base nas revisões, o aplicativo funciona com versões mais antigas do Kubernetes, como 1.12.
O aplicativo é iniciado usando a configuração padrão
.kube/config
- da mesma maneira que ele kubectl
.
Navegação
Por padrão, uma janela é aberta com o namespace padrão especificado para o contexto. Ou seja, se você se registrou
kubectl config set-context --current --namespace=test
, o namespace será aberto test
. (Veja abaixo sobre como alterar contextos / namespaces.) Você pode

alternar para o modo de comando clicando em ":". Você pode então controlar a operação de k9s usando comandos - por exemplo, para ver uma lista de StatefulSets (no namespace atual), você pode entrar
:sts
.

Para alguns outros recursos do Kubernetes:
-
:ns
- Namespaces; -
:deploy
- Implantações; -
:ing
- Ingressos; -
:svc
- Serviços.
Para exibir uma lista completa dos tipos de recursos disponíveis para visualização, existe um comando
:aliases
.
Também é conveniente visualizar a lista de comandos disponíveis por combinações de teclas de atalho na janela atual: basta clicar em "?"

Também no k9s existe um modo de pesquisa , para mudar para o qual basta inserir "/". É usado para pesquisar o conteúdo da "janela" atual. Digamos que, se você digitou antes
:ns
, você tem uma lista de namespaces aberta. Se forem muitos, então, para não rolar para baixo por muito tempo, basta entrar na janela com namespaces /mynamespace
.
Para pesquisar rótulos, você pode escolher todos os pod'y no namespace correto e inserir, por exemplo
/ -l app=whoami
. Obteremos uma lista de pods com este rótulo:

A pesquisa funciona em todos os tipos de janelas, incluindo registros, visualização de manifestos YAML e
describe
recursos - veja abaixo mais informações sobre esses recursos.
Qual é a sequência geral de navegação?
Com o comando
:ctx
, você pode selecionar Contexto:

Para selecionar namespace'a já mencionamos a equipe
:ns
, e então você pode procurar o espaço desejado: /test
.
Se agora selecionarmos o recurso no qual estamos interessados (por exemplo, o mesmo StatefulSet), as informações correspondentes serão exibidas para ele: quantos pods estão em execução com breves informações sobre eles.

Apenas pods podem ser interessantes - basta entrar
:pod
. No caso de ConfigMaps (:cm
- para obter uma lista desses recursos), você pode selecionar o objeto de interesse e clicar em "u", após o que K9s irá dizer exatamente quem está usando (este CM).
Outro recurso útil para visualizar recursos é sua visualização XRay . Esse modo é invocado por um comando
:xray RESOURCE
e ... é mais fácil mostrar como funciona do que explicar. Aqui está uma ilustração para StatefulSets:

(Cada um desses recursos pode ser editado, modificado, concluído
describe
.)
E aqui está uma implantação com o Ingress:

Trabalhando com recursos
As informações sobre cada recurso podem ser obtidas em YAML ou
describe
pressionando os atalhos de teclado correspondentes ("y" e "d", respectivamente). Existem, é claro, operações ainda mais básicas: sua lista e atalhos de teclado estão sempre à vista graças a um conveniente "cabeçalho" na interface (oculto pressionando Ctrl + e).

Ao editar algum recurso ("e" após sua seleção
export EDITOR=vim
), abre-se o editor de texto, definido nas variáveis de ambiente ( ).
E aqui está a aparência da descrição detalhada do recurso (
describe
):

Essa saída (ou a saída da visualização do manifesto YAML do recurso) pode ser salva usando o atalho de teclado usual Ctrl + s. O local onde ele será salvo será conhecido pela mensagem K9s:
Log /tmp/k9s-screens-root/kubernetes/Describe-1601244920104133900.yml saved successfully!
A partir dos arquivos de backup criados, você também pode restaurar recursos, após remover os rótulos e anotações do sistema. Para fazer isso, você precisa ir até o diretório com eles (
:dir /tmp
), selecionar o arquivo desejado e aplicar apply
.
A propósito, a qualquer momento, você pode reverter para o ReplicaSet anterior se houver problemas com o atual. Para fazer isso, selecione o RS necessário (
:rs
para sua lista):

... e reverta com Ctrl + l. Devemos receber uma notificação de que tudo correu bem:
k9s/whoami-5cfbdbb469 successfully rolled back
E para dimensionar réplicas, basta clicar em "s" (escala) e selecionar o número necessário de instâncias:

Você pode inserir qualquer um dos contêineres usando o shell: para fazer isso, vá para o pod desejado, clique em "s" (shell) e selecione o contêiner ...
Outras possibilidades
Obviamente, a visualização dos registros também é compatível ("l" para o recurso selecionado). E para assistir novos logs, não há necessidade de pressionar Enter constantemente: basta marcar ("m"), e depois rastrear apenas as novas mensagens.

Também na mesma janela, você pode selecionar o intervalo de tempo para a exibição de registros:
- tecla "1" - em 1 minuto;
- "25 minutos;
- "3" - 15 minutos;
- "4" - 30 minutos;
- "5" - 1 hora;
- "0" - para toda a vida útil do pod.
O modo especial de operação Pulso (comando
:pulse
) mostra informações gerais sobre o cluster Kubernetes:

você pode ver o número de recursos e seu estado (aqueles que têm um status são mostrados em verde
Running
).
Outro recurso interessante do K9s é chamado Popeye . Ele verifica todos os recursos para determinados critérios de correção e exibe a "classificação" resultante com explicações. Por exemplo, você pode ver que não há probes ou limites suficientes e alguns contêineres podem ser executados como root ...

Há suporte básico ao Helm. Por exemplo, é assim que você pode ver as versões implantadas no cluster:
:helm all #
:helm $namespace #
Benchmark
Até mesmo hey foi integrado ao K9s - é um gerador de carga de servidor HTTP simples, uma alternativa ao mais famoso ab (ApacheBench).
Para habilitá-lo, você precisa da ativação de encaminhamento de porta no pod. Para fazer isso, selecione pod e pressione Shift + f, vá para o submenu de encaminhamento de porta com o alias "pf".

Depois de selecionar uma porta e pressionar Ctrl + b, o próprio benchmark será iniciado. Os resultados de seu trabalho são salvos
/tmp
e disponibilizados para visualização posterior no K9s.


Para alterar a configuração do benchmark, você precisa criar um arquivo
$HOME/.k9s/bench-<my_context>.yml
(definido para cada cluster).
NB: É importante que a extensão de todos os arquivos YAML do diretório seja
.k9s
exata .yml
( .yaml
não funciona corretamente).
Exemplo de configuração:
benchmarks:
defaults:
#
concurrency: 2
#
requests: 1000
containers:
#
# 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:
# NodePort LoadBalancer
# : namespace/service-name
default/nginx:
concurrency: 5
requests: 500
http:
method: GET
path: /auth
auth:
user: flant
password: s3cr3tp455w0rd
Interface
A exibição de coluna para listas de recursos é modificada criando um arquivo
$HOME/.k9s/views.yml
. Um exemplo de seu conteúdo:
k9s:
views:
v1/pods:
columns:
- AGE
- NAMESPACE
- NAME
- IP
- NODE
- STATUS
- READY
v1/services:
columns:
- AGE
- NAMESPACE
- NAME
- TYPE
- CLUSTER-IP
É verdade que falta uma coluna para rótulos, para o que há um problema no projeto .
A classificação por colunas é realizada por atalhos de teclado:
- Shift + n - por nome;
- Shift + o - por nós;
- Shift + i - por IP;
- Shift + a - pela vida útil do contêiner;
- Shift + t - pelo número de reinicializações;
- Shift + r - por status de prontidão;
- Shift + c - por consumo de CPU;
- Shift + m - por consumo de memória.
Se alguém não gosta do esquema de cores padrão, K9s até suporta skins . Exemplos prontos (7 peças) estão disponíveis aqui . Aqui está um exemplo de uma dessas skins (na marinha) :

Plugins
Por fim, os plug-ins permitem estender os recursos do K9s. Eu mesmo usei apenas um deles no meu trabalho -
kubectl get all -n $namespace
.
Se parece com isso. Crie um arquivo
$HOME/.k9s/plugin.yml
com o seguinte conteúdo:
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"
Agora você pode ir ao namespace e pressionar "g" para executar com o comando correspondente:

Entre os plugins estão, por exemplo, a integração com kubectl-jq e o utilitário para visualização de logs stern .
Conclusão
Para meu gosto, o K9s acabou sendo muito conveniente de se trabalhar: com ele é muito rápido se acostumar a procurar tudo o que você precisa sem usar
kubectl
. Fiquei satisfeito com a visualização dos logs e seu salvamento, edição rápida de recursos, velocidade de trabalho em geral *, o modo Popeye acabou sendo útil. Uma menção especial é feita à capacidade de criar plug-ins e modificar o aplicativo para atender às suas necessidades.
* Embora com um grande volume de logs, também notei o trabalho lento dos K9s. Nesses momentos, o utilitário “comeu” 2 núcleos do Intel Xeon E312xx e pode até congelar.
O que está faltando no momento? Retrocesso rápido para a versão anterior (não sobre RS) sem ir para o diretório. Além disso, a recuperação só acontece para tudo.recurso: se você excluiu a anotação ou rótulo, terá que excluir e restaurar todo o recurso (aqui você precisará ir para o diretório). Outra bagatela é que não há data suficiente para esses "backups" salvos.
PS
Leia também em nosso blog:
- " Visão geral de GUIs para Kubernetes ";
- " Anúncio da interface da Web do Kubernetes Web View (e uma breve visão geral de outras IUs da Web para Kubernetes) ";
- " Kubebox e outros shells de console para Kubernetes ".