{"id":97736,"date":"2020-10-21T14:42:17","date_gmt":"2020-10-21T12:42:17","guid":{"rendered":"https:\/\/prohoster.info\/blog\/administrirovanie\/obzor-k9s-prodvinutogo-terminalnogo-interfejsa-dlya-kubernetes"},"modified":"2020-10-21T14:42:17","modified_gmt":"2020-10-21T12:42:17","slug":"obzor-k9s-prodvinutogo-terminalnogo-interfejsa-dlya-kubernetes","status":"publish","type":"post","link":"https:\/\/prohoster.info\/pt\/blog\/administrirovanie\/obzor-k9s-prodvinutogo-terminalnogo-interfejsa-dlya-kubernetes","title":{"rendered":"Revis\u00e3o do k9s \u2014 uma interface de terminal avan\u00e7ada para Kubernetes","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"Revis\u00e3o do k9s \u2014 uma interface de terminal avan\u00e7ada para Kubernetes\" src=\"\/wp-content\/uploads\/2020\/10\/11274841ee84b0e2c3ac74c9c738faba.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n<noindex><a rel=\"nofollow\" href=\"https:\/\/k9scli.io\/\">K9s<\/a><\/noindex> fornece uma interface de terminal para interagir com clusters Kubernetes. O objetivo deste projeto Open Source \u00e9 facilitar a navega\u00e7\u00e3o em aplicativos no K8s, monitor\u00e0-los e gerenci\u00e1-los. K9s monitora constantemente mudan\u00e7as no Kubernetes e oferece comandos r\u00e1pidos para trabalhar com os recursos observados.<\/p>\n<p>O projeto foi escrito em Go e existe h\u00e1 mais de um ano e meio: o primeiro commit foi feito em 1\u00ba de fevereiro de 2019. No momento da reda\u00e7\u00e3o deste artigo, h\u00e1 mais de 9000 estrelas no <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/derailed\/k9s\">GitHub<\/a><\/noindex> e cerca de 80 colaboradores. Vamos ver o que o k9s pode fazer?<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h2>Instala\u00e7\u00e3o e execu\u00e7\u00e3o<\/h2>\n<p>\nEste \u00e9 um aplicativo cliente (em rela\u00e7\u00e3o ao cluster Kubernetes) que \u00e9 mais f\u00e1cil de executar como uma imagem Docker:<\/p>\n<pre><code class=\"bash\">docker run --rm -it -v $KUBECONFIG:\/root\/.kube\/config quay.io\/derailed\/k9s<\/code><\/pre>\n<p>\nPara algumas distribui\u00e7\u00f5es Linux e outros sistemas operacionais, tamb\u00e9m h\u00e1 pacotes prontos para instala\u00e7\u00e3o <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/derailed\/k9s#installation\">pacotes<\/a><\/noindex>. Em geral, para sistemas Linux, voc\u00ea pode instalar o arquivo bin\u00e1rio:<\/p>\n<pre><code class=\"bash\">sudo wget -qO- https:\/\/github.com\/derailed\/k9s\/releases\/download\/v0.22.0\/k9s_Linux_x86_64.tar.gz | tar zxvf - -C \/tmp\/\nsudo mv \/tmp\/k9s \/usr\/local\/bin<\/code><\/pre>\n<p>\nN\u00e3o h\u00e1 requisitos espec\u00edficos para o pr\u00f3prio cluster K8s. Segundo relatos, o aplicativo funciona at\u00e9 mesmo com vers\u00f5es antigas do Kubernetes, como 1.12.<\/p>\n<p>O aplicativo \u00e9 iniciado usando a configura\u00e7\u00e3o padr\u00e3o <code>.kube\/config<\/code> \u2014 similar ao que faz <code>kubectl<\/code>.<\/p>\n<h2>Navega\u00e7\u00e3o<\/h2>\n<p>\nPor padr\u00e3o, uma janela \u00e9 aberta com o namespace padr\u00e3o que \u00e9 especificado para o contexto. Ou seja, se voc\u00ea especificou <code>kubectl config set-context --current --namespace=test<\/code>, ent\u00e3o o namespace <code>test<\/code>. <i>ser\u00e1 aberto (sobre como trocar entre contextos\/namespaces, veja abaixo). <\/i><\/p>\n<p><img decoding=\"async\" alt=\"Revis\u00e3o do k9s \u2014 uma interface de terminal avan\u00e7ada para Kubernetes\" src=\"\/wp-content\/uploads\/2020\/10\/820fcbdd376abc95d67bf202f34c880c.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nEntrar no <b>modo comandos<\/b> \u00e9 feito pressionando \u201c:\u201d. Ap\u00f3s isso, voc\u00ea pode gerenciar o k9s usando comandos \u2014 por exemplo, para ver a lista de StatefulSets (no namespace atual), voc\u00ea pode digitar <code>:sts<\/code>.<\/p>\n<p><img decoding=\"async\" alt=\"Revis\u00e3o do k9s \u2014 uma interface de terminal avan\u00e7ada para Kubernetes\" src=\"\/wp-content\/uploads\/2020\/10\/840724fc656b22e67519c53983065862.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nPara alguns outros recursos do Kubernetes:<\/p>\n<ul>\n<li> <code>:ns<\/code> \u2014 Namespaces;<\/li>\n<li> <code>:deploy<\/code> \u2014 Deployments;<\/li>\n<li> <code>:ing<\/code> \u2014 Ingresses;<\/li>\n<li> <code>:svc<\/code> \u2014 Services.<\/li>\n<\/ul>\n<p>\nPara listar todos os tipos de recursos dispon\u00edveis para visualiza\u00e7\u00e3o, existe o comando <code>:aliases<\/code>.<\/p>\n<p>\u00c9 conveniente visualizar a lista de comandos dispon\u00edveis por combina\u00e7\u00f5es de teclas dentro da janela atual: para isso, basta pressionar \u201c?\u201d.<\/p>\n<p><img decoding=\"async\" alt=\"Revis\u00e3o do k9s \u2014 uma interface de terminal avan\u00e7ada para Kubernetes\" src=\"\/wp-content\/uploads\/2020\/10\/54d329f9eeda2424f457aef6b977ae63.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nO k9s tamb\u00e9m possui <b>modo de busca<\/b>, para o qual voc\u00ea pode acessar simplesmente digitando \u201c\/\u201d. Isso permite pesquisar no conte\u00fado da janela atual. Por exemplo, se voc\u00ea tiver digitado <code>:ns<\/code>, voc\u00ea ter\u00e1 uma lista de namespaces aberta. Se houver muitos, para n\u00e3o rolar longamente para baixo, basta digitar na janela de namespaces. <code>\/mynamespace<\/code>.<\/p>\n<p>Para buscar por r\u00f3tulos, voc\u00ea pode selecionar todos os pods no namespace desejado e depois inserir, por exemplo, <code>\/ -l app=whoami<\/code>. N\u00f3s obteremos uma lista de pods com esse r\u00f3tulo:<\/p>\n<p><img decoding=\"async\" alt=\"Revis\u00e3o do k9s \u2014 uma interface de terminal avan\u00e7ada para Kubernetes\" src=\"\/wp-content\/uploads\/2020\/10\/88b8e09a5b7819bcf49334bf351b040b.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nA busca funciona em todos os tipos de janelas, incluindo logs, visualiza\u00e7\u00e3o de manifestos YAML e <code>describe<\/code> para recursos \u2014 veja mais sobre essas funcionalidades abaixo.<\/p>\n<p>Como \u00e9, em geral, a sequ\u00eancia de a\u00e7\u00f5es para navega\u00e7\u00e3o?<\/p>\n<p>Com o comando <code>:ctx<\/code> \u00e9 poss\u00edvel selecionar o contexto:<\/p>\n<p><img decoding=\"async\" alt=\"Revis\u00e3o do k9s \u2014 uma interface de terminal avan\u00e7ada para Kubernetes\" src=\"\/wp-content\/uploads\/2020\/10\/a5e780a3fc98961913c966222e167d51.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nPara selecionar o namespace, j\u00e1 existe o comando mencionado anteriormente <code>:ns<\/code>, e depois voc\u00ea pode usar a busca para o namespace necess\u00e1rio: <code>\/test<\/code>.<\/p>\n<p>Se agora selecionar o recurso que nos interessa (por exemplo, o StatefulSet), as informa\u00e7\u00f5es correspondentes aparecer\u00e3o: quantos pods est\u00e3o em execu\u00e7\u00e3o com um resumo sobre eles.<\/p>\n<p><img decoding=\"async\" alt=\"Revis\u00e3o do k9s \u2014 uma interface de terminal avan\u00e7ada para Kubernetes\" src=\"\/wp-content\/uploads\/2020\/10\/8e0d8c41b8673b7c29f2605d3ae59503.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nPodem ser interessantes apenas os pods \u2014 ent\u00e3o basta digitar <code>:pod<\/code>. No caso dos ConfigMaps (<code>:cm<\/code> \u2014 para a lista desses recursos) voc\u00ea pode escolher o objeto de interesse e pressionar 'u', ap\u00f3s o que o K9s indicar\u00e1 quem especificamente utiliza (este CM).<\/p>\n<p>Mais um recurso conveniente para visualizar recursos \u2014 seu <b>\u2018raio X\u2019 (XRay view)<\/b>. Esse modo \u00e9 chamado pelo comando <code>:xray RESOURCE<\/code> e\u2026 \u00e9 mais f\u00e1cil mostrar como funciona do que explicar. Aqui est\u00e1 uma ilustra\u00e7\u00e3o para StatefulSets:<\/p>\n<p><img decoding=\"async\" alt=\"Revis\u00e3o do k9s \u2014 uma interface de terminal avan\u00e7ada para Kubernetes\" src=\"\/wp-content\/uploads\/2020\/10\/de40ebfe06ca935d2bc36323b3f16f3e.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>(Cada um desses recursos pode ser editado, alterado, feito <code>describe<\/code>.)<\/i><\/p>\n<p>Aqui est\u00e1 um Deployment com Ingress:<\/p>\n<p><img decoding=\"async\" alt=\"Revis\u00e3o do k9s \u2014 uma interface de terminal avan\u00e7ada para Kubernetes\" src=\"\/wp-content\/uploads\/2020\/10\/598c1b25b787dcb1cf9660fa730d74c5.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<h2>Trabalho com recursos<\/h2>\n<p>\nSobre cada recurso, voc\u00ea pode obter informa\u00e7\u00f5es em YAML ou <code>describe<\/code> pressionando as combina\u00e7\u00f5es de teclas correspondentes ('y' e 'd', respectivamente). As opera\u00e7\u00f5es b\u00e1sicas, \u00e9 claro, s\u00e3o ainda mais numerosas: sua lista e combina\u00e7\u00f5es de teclas est\u00e3o sempre \u00e0 vista gra\u00e7as ao conveniente \u2018cabe\u00e7alho\u2019 na interface (esconde-se pressionando Ctrl + e).<\/p>\n<p><img decoding=\"async\" alt=\"Revis\u00e3o do k9s \u2014 uma interface de terminal avan\u00e7ada para Kubernetes\" src=\"\/wp-content\/uploads\/2020\/10\/6bbe4ca07442e1e14a462586d14ef98d.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nAo editar qualquer recurso ('e' ap\u00f3s sua sele\u00e7\u00e3o) um editor de texto \u00e9 aberto, definido nas vari\u00e1veis de ambiente (<code>export EDITOR=vim<\/code>).<\/p>\n<p>Aqui est\u00e1 como aparece a descri\u00e7\u00e3o detalhada do recurso (<code>describe<\/code>):<\/p>\n<p><img decoding=\"async\" alt=\"Revis\u00e3o do k9s \u2014 uma interface de terminal avan\u00e7ada para Kubernetes\" src=\"\/wp-content\/uploads\/2020\/10\/05fdb57e3b85d1b81c9bfc6414aca117.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nEssa sa\u00edda (ou a sa\u00edda visualizando o manifesto YAML do recurso) pode ser salva com a combina\u00e7\u00e3o de teclas familiar Ctrl + s. Para onde ser\u00e1 salva, voc\u00ea saber\u00e1 pela mensagem do K9s:<\/p>\n<pre><code class=\"plaintext\">Log \/tmp\/k9s-screens-root\/kubernetes\/Describe-1601244920104133900.yml salvo com sucesso!<\/code><\/pre>\n<p>\nA partir dos arquivos de backup criados, voc\u00ea tamb\u00e9m pode restaurar recursos, removendo previamente os r\u00f3tulos e anota\u00e7\u00f5es do sistema. Para isso, voc\u00ea precisar\u00e1 acessar o diret\u00f3rio com eles (<code>:dir \/tmp<\/code>), ap\u00f3s o que dever\u00e1 selecionar o arquivo desejado e aplicar <code>apply<\/code>.<\/p>\n<p>Vale lembrar que voc\u00ea pode reverter a qualquer momento para um ReplicaSet anterior se houver problemas com o atual. Para isso, \u00e9 necess\u00e1rio escolher o RS desejado (<code>:rs<\/code> da lista deles):<\/p>\n<p><img decoding=\"async\" alt=\"Revis\u00e3o do k9s \u2014 uma interface de terminal avan\u00e7ada para Kubernetes\" src=\"\/wp-content\/uploads\/2020\/10\/de0ea37d970c51514559288661bdc6f2.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n\u2026 e executar o rollback pressionando Ctrl + l. Devemos receber uma notifica\u00e7\u00e3o de que tudo foi bem-sucedido:<\/p>\n<pre><code class=\"plaintext\">k9s\/whoami-5cfbdbb469 revertido com sucesso<\/code><\/pre>\n<p>\nPara escalar as r\u00e9plicas, basta pressionar \"s\" (scale) e escolher o n\u00famero desejado de inst\u00e2ncias:<\/p>\n<p><img decoding=\"async\" alt=\"Revis\u00e3o do k9s \u2014 uma interface de terminal avan\u00e7ada para Kubernetes\" src=\"\/wp-content\/uploads\/2020\/10\/145093030db754c9ef85810cbba3ed5c.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n\u00c9 poss\u00edvel acessar qualquer um dos cont\u00eaineres usando shell: para isso, v\u00e1 para o pod desejado, pressione \"s\" (shell) e escolha o cont\u00eainer.<\/p>\n<h2>Outras possibilidades<\/h2>\n<p>\nClaro, tamb\u00e9m \u00e9 poss\u00edvel visualizar logs (\"l\" para o recurso selecionado). Para visualizar novos logs, n\u00e3o \u00e9 necess\u00e1rio pressionar Enter constantemente: basta marcar (\"m\"), e depois acompanhar apenas as novas mensagens.<\/p>\n<p><img decoding=\"async\" alt=\"Revis\u00e3o do k9s \u2014 uma interface de terminal avan\u00e7ada para Kubernetes\" src=\"\/wp-content\/uploads\/2020\/10\/05aa9657f744b9e3d09034862e1befe7.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nNeste mesmo painel, \u00e9 poss\u00edvel escolher um intervalo de tempo para a exibi\u00e7\u00e3o dos logs:<\/p>\n<ul>\n<li> a tecla \"1\" \u2014 para 1 minuto;<\/li>\n<li> \"2\" \u2014 para 5 minutos;<\/li>\n<li> \"3\" \u2014 para 15 minutos;<\/li>\n<li> \"4\" \u2014 para 30 minutos;<\/li>\n<li> \"5\" \u2014 para 1 hora;<\/li>\n<li> \"0\" \u2014 por toda a vida do pod.<\/li>\n<\/ul>\n<p>\nUm modo de opera\u00e7\u00e3o especial chamado Pulse (comando <code>:pulse<\/code>) exibe informa\u00e7\u00f5es gerais sobre o cluster Kubernetes:<\/p>\n<p><img decoding=\"async\" alt=\"Revis\u00e3o do k9s \u2014 uma interface de terminal avan\u00e7ada para Kubernetes\" src=\"\/wp-content\/uploads\/2020\/10\/413d241ad7518f49c523fa59f51702a6.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nNele, \u00e9 poss\u00edvel ver a quantidade de recursos e seu estado (aqueles que est\u00e3o com status s\u00e3o mostrados em verde <code>Em execu\u00e7\u00e3o<\/code>).<\/p>\n<p>Outra fun\u00e7\u00e3o interessante do K9s \u00e9 chamada <b>Popeye<\/b>. Ela verifica todos os recursos com base em determinados crit\u00e9rios de corre\u00e7\u00e3o e exibe a \"classifica\u00e7\u00e3o\" resultante com explica\u00e7\u00f5es. Por exemplo, \u00e9 poss\u00edvel ver que faltam probes ou limites, e que algum cont\u00eainer pode ser executado como root...<\/p>\n<p><img decoding=\"async\" alt=\"Revis\u00e3o do k9s \u2014 uma interface de terminal avan\u00e7ada para Kubernetes\" src=\"\/wp-content\/uploads\/2020\/10\/a6bc5ea45b5749fb4e1038b82374b3c4.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nH\u00e1 suporte b\u00e1sico para Helm. Por exemplo, \u00e9 poss\u00edvel ver os releases implantados no cluster:<\/p>\n<pre><code class=\"bash\">:helm all # tudo\n:helm $namespace # em um namespace espec\u00edfico\n<\/code><\/pre>\n<p><\/p>\n<h2>Benchmark<\/h2>\n<p>\nO K9s at\u00e9 inclui <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/rakyll\/hey\">hey<\/a><\/noindex> \u2014 um gerador simples de carga para o servidor HTTP, alternativa ao mais conhecido ab (ApacheBench).<\/p>\n<p>Para ativ\u00e1-lo, ser\u00e1 necess\u00e1rio ativar a port-forward no pod. Para isso, escolha o pod e pressione Shift + f, passando para o submenu de port-forward atrav\u00e9s do alias \"pf\".<\/p>\n<p><img decoding=\"async\" alt=\"Revis\u00e3o do k9s \u2014 uma interface de terminal avan\u00e7ada para Kubernetes\" src=\"\/wp-content\/uploads\/2020\/10\/651f25269c0998c716ab9c0c4b5e0455.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nAp\u00f3s escolher a porta e pressionar Ctrl + b, o benchmark ser\u00e1 iniciado. Os resultados de seu funcionamento s\u00e3o salvos em <code>\/tmp<\/code> e est\u00e3o dispon\u00edveis para visualiza\u00e7\u00e3o posterior no K9s. <\/p>\n<p><img decoding=\"async\" alt=\"Revis\u00e3o do k9s \u2014 uma interface de terminal avan\u00e7ada para Kubernetes\" src=\"\/wp-content\/uploads\/2020\/10\/57b2fe1d078e9aca1c6afccd318094da.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<img decoding=\"async\" alt=\"Revis\u00e3o do k9s \u2014 uma interface de terminal avan\u00e7ada para Kubernetes\" src=\"\/wp-content\/uploads\/2020\/10\/3b2bf031e8442e47eb3482187ac5b64d.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nPara alterar a configura\u00e7\u00e3o do benchmark, \u00e9 necess\u00e1rio criar um arquivo <code>$HOME\/.k9s\/bench-.yml<\/code> (definido para cada cluster).<\/p>\n<p><i>NB: \u00c9 importante que a extens\u00e3o de todos os arquivos YAML no diret\u00f3rio <code>.k9s<\/code> seja exatamente <code>.yml<\/code> (<code>.yaml<\/code> (n\u00e3o funciona corretamente).<\/i><\/p>\n<p>Exemplo de configura\u00e7\u00e3o:<\/p>\n<pre><code class=\"bash\">benchmarks:\n  defaults:\n    # N\u00famero de threads\n    concurrency: 2\n    # N\u00famero de requisi\u00e7\u00f5es\n    requests: 1000\n  containers:\n    # Configura\u00e7\u00f5es para o container de benchmarking\n    # O container \u00e9 definido como namespace\/pod-name:container-name\n    default\/nginx:nginx:\n      concurrency: 2\n      requests: 10000\n      http:\n        path: \/\n        method: POST\n        body:\n          {\"foo\":\"bar\"}\n        header:\n          Accept:\n            - text\/html\n          Content-Type:\n            - application\/json\n services:\n    # \u00c9 poss\u00edvel realizar benchmarking em servi\u00e7os do tipo NodePort e LoadBalancer\n    # Sintaxe: namespace\/service-name\n    default\/nginx:\n      concurrency: 5\n      requests: 500\n      http:\n        method: GET\n        path: \/auth\n      auth:\n        user: flant\n        password: s3cr3tp455w0rd\n<\/code><\/pre>\n<p><\/p>\n<h2>Interface<\/h2>\n<p>\nO formato das colunas para listas de recursos \u00e9 modificado criando um arquivo <code>$HOME\/.k9s\/views.yml<\/code>. Um exemplo do seu conte\u00fado:<\/p>\n<pre><code class=\"plaintext\">k9s:\n vis\u00f5es:\n   v1\/pods:\n     colunas:\n       - IDADE\n       - NAMESPACE\n       - NOME\n       - IP\n       - N\u00d3\n       - STATUS\n       - PRONTO\n   v1\/servi\u00e7os:\n     colunas:\n       - IDADE\n       - NAMESPACE\n       - NOME\n       - TIPO\n       - CLUSTER-IP\n<\/code><\/pre>\n<p>\n<i>Na verdade, falta uma coluna para os r\u00f3tulos, sobre a qual h\u00e1 <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/derailed\/k9s\/issues\/605\">uma quest\u00e3o no projeto<\/a><\/noindex>.<\/i><\/p>\n<p>A ordena\u00e7\u00e3o por colunas \u00e9 feita com combina\u00e7\u00f5es de teclas:<\/p>\n<ul>\n<li> Shift + n \u2014 por nome;<\/li>\n<li> Shift + o \u2014 por n\u00f3s;<\/li>\n<li> Shift + i \u2014 por IP;<\/li>\n<li> Shift + a \u2014 por tempo de vida do cont\u00eainer;<\/li>\n<li> Shift + t \u2014 por n\u00famero de reinicializa\u00e7\u00f5es;<\/li>\n<li> Shift + r \u2014 por status de prontid\u00e3o;<\/li>\n<li> Shift + c \u2014 por uso de CPU;<\/li>\n<li> Shift + m \u2014 por uso de mem\u00f3ria.<\/li>\n<\/ul>\n<p>\nSe algu\u00e9m n\u00e3o gosta do esquema de cores padr\u00e3o, o K9s at\u00e9 suporta <noindex><a rel=\"nofollow\" href=\"https:\/\/k9scli.io\/topics\/skins\/\">skins<\/a><\/noindex>. Exemplos prontos (7 no total) est\u00e3o dispon\u00edveis <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/derailed\/k9s\/tree\/master\/skins\">aqui<\/a><\/noindex>. Aqui est\u00e1 um exemplo de um desses skins <i>(na marinha)<\/i>:<\/p>\n<p><img decoding=\"async\" alt=\"Revis\u00e3o do k9s \u2014 uma interface de terminal avan\u00e7ada para Kubernetes\" src=\"\/wp-content\/uploads\/2020\/10\/4a4378f2c2d36eb3985e2b71d733c444.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<h2>Plugins<\/h2>\n<p>\nFinalmente, <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/derailed\/k9s\/tree\/master\/plugins\">plugins<\/a><\/noindex> eles permitem expandir as funcionalidades do K9s. Eu mesmo usei apenas um deles no meu trabalho \u2014 <code>kubectl get all -n $namespace<\/code>.<\/p>\n<p>Isso fica assim. Criamos um arquivo <code>$HOME\/.k9s\/plugin.yml<\/code> com o seguinte conte\u00fado:<\/p>\n<pre><code class=\"bash\">plugin:\n get-all:\n   shortCut: g    \n   confirm: false    \n   description: get all\n   scopes:\n   - all\n   command: sh\n   background: false\n   args:\n   - -c\n   - \"kubectl -n $NAMESPACE get all -o wide | less\"<\/code><\/pre>\n<p>\nAgora pode-se entrar no espa\u00e7o de nomes e pressionar \"g\" para executar o comando correspondente:<\/p>\n<p><img decoding=\"async\" alt=\"Revis\u00e3o do k9s \u2014 uma interface de terminal avan\u00e7ada para Kubernetes\" src=\"\/wp-content\/uploads\/2020\/10\/c79bbf26b6c321a97cedabf22f1699b9.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nEntre os plugins, h\u00e1, por exemplo, integra\u00e7\u00f5es com kubectl-jq e uma ferramenta para visualizar logs <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/wercker\/stern\">stern<\/a><\/noindex>.<\/p>\n<h2>Conclus\u00e3o<\/h2>\n<p>\nNa minha opini\u00e3o, o K9s se mostrou muito conveniente de usar: \u00e9 bastante r\u00e1pido se acostumar a buscar tudo que \u00e9 necess\u00e1rio sem usar <code>kubectl<\/code>. Fiquei satisfeito com a visualiza\u00e7\u00e3o e o armazenamento de logs, a edi\u00e7\u00e3o r\u00e1pida de recursos e a velocidade geral de opera\u00e7\u00e3o; o modo Popeye foi \u00fatil. Vale mencionar as possibilidades de criar plugins e adaptar o aplicativo para as suas necessidades.<\/p>\n<p><i>* Embora tenha notado um desempenho lento do K9s com um grande volume de logs. Nessas horas, a ferramenta consumia 2 n\u00facleos de um Intel Xeon E312xx e podia at\u00e9 travar.<\/i><\/p>\n<p>O que falta atualmente? Um rollback r\u00e1pido para a vers\u00e3o anterior (n\u00e3o me refiro ao RS) sem ter que acessar o diret\u00f3rio. Al\u00e9m disso, a recupera\u00e7\u00e3o acontece apenas para <i>todos<\/i> os recursos: se voc\u00ea excluiu uma anota\u00e7\u00e3o ou um r\u00f3tulo, ser\u00e1 necess\u00e1rio excluir e restaurar todo o recurso (\u00e9 aqui que ser\u00e1 preciso acessar o diret\u00f3rio). Outro detalhe \u2014 falta a data desses 'backups' salvos.<\/p>\n<h2>P.S.<\/h2>\n<p>\nConfira tamb\u00e9m em nosso blog:<\/p>\n<ul>\n<li> \u00ab<noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/flant\/blog\/506948\/\">Revis\u00e3o de interfaces gr\u00e1ficas para Kubernetes<\/a><\/noindex>\u00bb;<\/li>\n<li> \u00ab<noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/flant\/blog\/468041\/\">An\u00fancio da interface web Kubernetes Web View (e uma breve revis\u00e3o de outras UIs web para Kubernetes)<\/a><\/noindex>\u00bb;<\/li>\n<li> \u00ab<noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/flant\/blog\/426985\/\">kubebox e outras interfaces de console para Kubernetes<\/a><\/noindex>\u00bb.<\/li>\n<\/ul>\n<p>Fonte: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/flant\/blog\/524196\/\">habr.com<\/a> <\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>K9s \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u0439 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b\u0430 \u0434\u043b\u044f \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u0441 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0430\u043c\u0438 Kubernetes. \u0426\u0435\u043b\u044c \u044d\u0442\u043e\u0433\u043e Open Source-\u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u2014 \u043e\u0431\u043b\u0435\u0433\u0447\u0438\u0442\u044c \u0443\u0434\u043e\u0431\u043d\u0443\u044e \u043d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u044e \u043f\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f\u043c \u0432 K8s, \u043d\u0430\u0431\u043b\u044e\u0434\u0435\u043d\u0438\u0435 \u0437\u0430 \u043d\u0438\u043c\u0438 \u0438 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0438\u043c\u0438. K9s \u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u043e \u0441\u043b\u0435\u0434\u0438\u0442 \u0437\u0430 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f\u043c\u0438 \u0432 Kubernetes \u0438 \u043f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u0435\u0442 \u0431\u044b\u0441\u0442\u0440\u044b\u0435 \u043a\u043e\u043c\u0430\u043d\u0434\u044b \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u043d\u0430\u0431\u043b\u044e\u0434\u0430\u0435\u043c\u044b\u043c\u0438 \u0440\u0435\u0441\u0443\u0440\u0441\u0430\u043c\u0438. \u041f\u0440\u043e\u0435\u043a\u0442 \u043d\u0430\u043f\u0438\u0441\u0430\u043d \u043d\u0430 Go, \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u0443\u0436\u0435 \u0431\u043e\u043b\u0435\u0435 \u043f\u043e\u043b\u0443\u0442\u043e\u0440\u0430 \u043b\u0435\u0442: \u043f\u0435\u0440\u0432\u044b\u0439 \u043a\u043e\u043c\u043c\u0438\u0442 [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":97737,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-97736","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-administrirovanie"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.3 - aioseo.com -->\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Yuri Gagarin\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/prohoster.info\/pt\/blog\/administrirovanie\/obzor-k9s-prodvinutogo-terminalnogo-interfejsa-dlya-kubernetes\" \/>\n\t\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.3\" \/>\n\t\t<meta property=\"og:locale\" content=\"pt_PT\" \/>\n\t\t<meta property=\"og:site_name\" content=\"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"\ud83e\udd47\u041e\u0431\u0437\u043e\u0440 k9s \u2014 \u043f\u0440\u043e\u0434\u0432\u0438\u043d\u0443\u0442\u043e\u0433\u043e \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430 \u0434\u043b\u044f Kubernetes | ProHoster\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/pt\/blog\/administrirovanie\/obzor-k9s-prodvinutogo-terminalnogo-interfejsa-dlya-kubernetes\" \/>\n\t\t<meta property=\"og:image\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:secure_url\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:width\" content=\"350\" \/>\n\t\t<meta property=\"og:image:height\" content=\"350\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2020-10-21T12:42:17+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2020-10-21T12:42:17+00:00\" \/>\n\t\t<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"\ud83e\udd47Revis\u00e3o do k9s \u2014 uma interface de terminal avan\u00e7ada para Kubernetes | ProHoster","description":"","canonical_url":"https:\/\/prohoster.info\/pt\/blog\/administrirovanie\/obzor-k9s-prodvinutogo-terminalnogo-interfejsa-dlya-kubernetes","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"pt_PT","og:site_name":"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b","og:type":"article","og:title":"\ud83e\udd47\u041e\u0431\u0437\u043e\u0440 k9s \u2014 \u043f\u0440\u043e\u0434\u0432\u0438\u043d\u0443\u0442\u043e\u0433\u043e \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430 \u0434\u043b\u044f Kubernetes | ProHoster","og:url":"https:\/\/prohoster.info\/pt\/blog\/administrirovanie\/obzor-k9s-prodvinutogo-terminalnogo-interfejsa-dlya-kubernetes","og:image":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:secure_url":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:width":350,"og:image:height":350,"article:published_time":"2020-10-21T12:42:17+00:00","article:modified_time":"2020-10-21T12:42:17+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"97736","title":null,"description":null,"keywords":null,"keyphrases":null,"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":null,"og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"","isEnabled":true},"graphs":[]},"schema_type":null,"schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":null,"robots_max_videopreview":null,"robots_max_imagepreview":"large","priority":null,"frequency":null,"local_seo":null,"seo_analyzer_scan_date":null,"breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-02-28 10:14:39","updated":"2022-10-03 07:12:05","focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/posts\/97736","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/comments?post=97736"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/posts\/97736\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/media\/97737"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/media?parent=97736"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/categories?post=97736"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/tags?post=97736"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}