ProHoster > Blog > administração > Visão geral do k9s - uma interface de terminal avançada para Kubernetes
Visão geral do k9s - uma interface de terminal avançada para Kubernetes
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 os recursos monitorados.
O projeto é escrito em Go e existe há mais de um ano e meio: o primeiro commit foi feito em 1º de fevereiro de 2019. No momento em que escrevo, existem mais de 9000 estrelas no GitHub e cerca de 80 colaboradores. Vamos ver o que k9s pode fazer?
Instalação e lançamento
Este é um aplicativo cliente (em relação ao cluster Kubernetes) que é mais fácil de executar como uma imagem do 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 há versões prontas para instalação пакеты. Em geral, para sistemas Linux, você pode instalar um arquivo binário:
Não há requisitos específicos para o próprio cluster K8s. A julgar pelos comentários, o aplicativo também funciona com versões mais antigas do Kubernetes, como 1.12.
O aplicativo é iniciado usando a configuração padrão .kube/config - semelhante a como ele faz kubectl.
Navegação
Por padrão, uma janela é aberta com o namespace padrão especificado para o contexto. Isto é, se você escreveu kubectl config set-context --current --namespace=test, então o namespace será aberto test. (Veja abaixo para alterar contextos/namespaces.)
Vamos para modo de comando é feito pressionando ":". Depois disso, você pode controlar a operação do k9s usando comandos - por exemplo, para visualizar a lista de StatefulSets (no namespace atual), você pode inserir :sts.
Para alguns outros recursos do Kubernetes:
:ns — espaços de nomes;
:deploy — Implantações;
:ing — Entradas;
:svc - Serviços.
Para exibir uma lista completa de 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: para isso, basta clicar em "?".
Também em k9s há modo de busca, para ir para o qual basta digitar "/". Com ele, é realizada uma busca no conteúdo da "janela" atual. Digamos que se você inseriu anteriormente :ns, você tem uma lista de namespaces abertos. Se houver muitos deles, para não rolar para baixo por muito tempo, basta entrar na janela com namespaces /mynamespace.
Para pesquisar por rótulos, você pode selecionar todos os pods no namespace desejado 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 logs, visualização de manifestos YAML e describe para recursos - veja abaixo para mais detalhes sobre esses recursos.
Como é o fluxo geral de navegação?
Com o comando :ctx você pode escolher um contexto:
Para selecionar um namespace, existe o comando já mencionado :ns, e então você pode usar a busca pelo espaço desejado: /test.
Se agora selecionarmos o recurso que nos interessa (por exemplo, o mesmo StatefulSet), a informação correspondente aparecerá para ele: quantos pods estão rodando com uma breve informação sobre eles.
Apenas pods podem ser de interesse - então é o suficiente para entrar :pod. No caso de ConfigMaps (:cm - para a lista desses recursos), você pode selecionar o objeto de interesse e clicar em "u", após o que o K9s informará quem especificamente o usa (este CM).
Outro recurso útil para visualizar recursos é o "raio-x" (visão de raio-x). Este modo é chamado pelo 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, alterado, feito describe.)
E aqui está a implantação com o Ingress:
Trabalhando com recursos
Você pode obter informações sobre cada recurso em YAML ou seu describe pressionando os atalhos de teclado correspondentes (“y” e “d”, respectivamente). Claro, existem operações ainda mais básicas: sua lista e atalhos de teclado estão sempre visíveis graças a um conveniente “cabeçalho” na interface (oculto pressionando Ctrl + e).
Ao editar qualquer recurso ("e" após sua seleção), é aberto o editor de texto definido nas variáveis de ambiente (export EDITOR=vim).
E aqui está a descrição detalhada do recurso (describe):
Essa saída (ou a saída da visualização do manifesto de recursos YAML) pode ser salva usando o conhecido atalho de teclado Ctrl + s. Onde será salvo será conhecido pela mensagem do K9s:
Você também pode restaurar recursos dos arquivos de backup criados, após remover os rótulos e anotações do sistema. Para fazer isso, você precisa ir ao diretório com eles (:dir /tmp), selecione o arquivo desejado e aplique apply.
A propósito, a qualquer momento você pode reverter para o ReplicaSet anterior se houver problemas com o atual. Para isso, selecione o RS desejado (:rs para sua lista):
... e reverter com Ctrl + l. Devemos receber uma notificação de que tudo correu bem:
k9s/whoami-5cfbdbb469 successfully rolled back
E para escalar as réplicas, basta clicar no "s" (escala) e selecionar o número de instâncias desejado:
Você pode entrar em qualquer um dos containers usando o shell: para isso, vá até o pod desejado, clique em "s" (shell) e selecione o container.
Outras características
Obviamente, a exibição de logs também é suportada ("l" para o recurso selecionado). E para assistir a novos logs, não há necessidade de pressionar Enter constantemente: basta marcar (“m”) e depois rastrear apenas novas mensagens.
Também na mesma janela, você pode selecionar o intervalo de tempo para a saída dos logs:
tecla "1" - por 1 minuto;
"2 minutos;
"3 minutos;
"4 minutos;
"5" - 1 hora;
"0" - para toda a vida útil do pod.
Modo de operação especial Pulso (comando :pulse) mostra informações gerais sobre o cluster do Kubernetes:
Nele você pode ver a quantidade de recursos e seus status (o verde mostra aqueles que possuem o status Running).
Outro recurso legal 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á amostras 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 os lançamentos implantados no cluster:
:helm all # все
:helm $namespace # в конкретном пространстве имен
referência
Mesmo embutido em K9s ei é um gerador de carga de servidor HTTP simples, uma alternativa ao ab mais conhecido (ApacheBench).
Para habilitá-lo, você precisa habilitar o encaminhamento de porta no pod. Para fazer isso, selecione o pod e pressione Shift + f, vá para o submenu de encaminhamento de porta usando o alias "pf".
Depois de selecionar a porta e pressionar Ctrl + b, o próprio benchmark será iniciado. Os resultados de seu trabalho são armazenados em /tmp e estão disponíveis para visualização posterior em K9s.
Para alterar a configuração do benchmark, você precisa criar um arquivo $HOME/.k9s/bench-<my_context>.yml (determinado para cada cluster).
NB: É importante que a extensão de todos os arquivos YAML em um diretório .k9s foi exatamente .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 aparência das colunas 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 não há coluna suficiente para rótulos, para os quais há problema no projeto.
A classificação por colunas é realizada por atalhos de teclado:
Shift + n - pelo 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 - pelo consumo de memória.
Se alguém não gostar do esquema de cores padrão, o K9s ainda suporta peles. Exemplos prontos (7 peças) estão disponíveis aqui. Aqui está um exemplo de uma dessas skins (na Marinha):
plugins
Por fim, o plug-ins permitem que você expanda os recursos do K9s. Eu mesmo usei apenas um deles em meu trabalho - kubectl get all -n $namespace.
Se parece com isso. Criar um arquivo $HOME/.k9s/plugin.yml com conteúdo como este:
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 para o namespace e pressionar "g" para executar com o comando correspondente:
Entre os plugins existem, por exemplo, integrações com kubectl-jq e um utilitário para visualização de logs popa.
Conclusão
Para o meu gosto, o K9s acabou sendo muito prático de se trabalhar: você se acostuma rapidamente a procurar tudo o que 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 é a capacidade de criar plugins e modificar o aplicativo para atender às suas necessidades.
* Embora, com um grande volume de logs, também notei a operação lenta 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? Reversão rápida para a versão anterior (não estamos falando de RS) sem ir ao diretório. Além disso, a recuperação ocorre apenas para apenas recurso: se você excluir uma anotação ou rótulo, terá que excluir e restaurar todo o recurso (é aqui que você precisa ir para o diretório). Outra ninharia - não há data suficiente para esses "backups" salvos.