Uma visão geral do k9s - uma interface de terminal avançada para Kubernetes





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 describerecursos - 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 RESOURCEe ... é 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 describepressionando 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 ( :rspara 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 /tmpe 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 .k9sexata .yml( .yamlnã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.ymlcom 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 ".



All Articles