kubebox и другие консольные оболочки для Kubernetes

il_abzn8qiapx4abmrosbpsdptg.png

Мы уже писали о «консольных помощниках» для Kubernetes год назад, а ещё раньше делали обзор других полезных утилит. Однако с развитием K8s и его сообщества претерпевает изменения и сопутствующая экосистема. Поэтому нам снова есть о чём рассказать любителям консоли. Поехали!

kubebox


  • GitHub (400+ stars)
  • Язык: JavaScript (Node.js)
  • Лицензия: MIT


Этот проект и послужил поводом для написания обзора. С одной стороны он является ярким представителем софта категории «гики делают для гиков», но с другой — дорос до того состояния, когда не только радует глаз, но и приносит практическую пользу…

Итак, предназначение kubebox — полноценная работа с Kubernetes в рамках удобного консольного интерфейса, представленного в стиле псевдографики:

image

Под работой подразумеваются такие возможности, как навигация по подам через пространства имён, просмотр логов и даже графиков потребления ключевых ресурсов (CPU, память, сеть), удалённое исполнение команд в контейнерах. Настройки для подключения к кластерам могут забираться из переменной окружения KUBECONFIG или конфигов в $HOME/.kube.

В дальнейших планах разработчиков — поддержка редактирования конфигураций и выполнения CRUD-операций, а также значительная переработка интерфейса для поддержки новых видов примитивов (Services, Deployments и др.) и удобной навигации по ним с выводом дополнительных сведений (в частности, kubectl describe pod).

Важная особенность — наличие онлайн-версии (для подключения к API-серверу Kubernetes потребуются разрешенные cors-allowed-origins). Кроме того, kubebox может запускаться как отдельный исполняемый файл, как клиент in-cluster (через kubectl), а также из сервиса, развёрнутого в кластере Kubernetes или OpenShift (для эмуляции терминала используется Xterm.js).

Разработкой kubebox уже почти 2 года занимается сотрудник Red Hat из Франции (если быть совсем точным, то ещё менее 10% коммитов сделаны его коллегой). Достаточно широкую огласку проект получил только в прошлом месяце (на Reddit и ряде других ресурсов), так что можно ожидать, что это придаст новый импульс его развитию.

kube-shell и kube-prompt


kube-shell


  • GitHub (950+ stars)
  • Язык: Python
  • Лицензия: Apache 2.0


n3kjzqji9fyyefnltkzfhldhtbo.gif
(Внимание, эта GIF’ка на ~2 Мб!)

kube-prompt


  • GitHub (700+ stars)
  • Язык: Go
  • Лицензия: MIT


89kvjjdehyjwvmu4cya6gxiosne.png

Про эти проекты мы уже писали год назад, и на то время они были безоговорочными фаворитами среди полноценных консольных оболочек для работы с Kubernetes. Оба позиционируются как улучшенные (более удобные в работе) интерфейсы к kubectl. В kube-shell для этого используют библиотеку prompt-toolkit для Python, а для kube-prompt взяли и разработали схожую библиотеку на Go (go-prompt).

Если сравнивать их с kubebox, то здесь уже основой интерфейса служит не псевдографика, а привычная консоль для ввода команд (см.скриншоты выше), которую, впрочем, сопровождают весьма интересные «спецэффекты»: всплывающие подсказки с помощью по командам, удобным автоматическим дополнением и т.п.

Несмотря на широкий спектр поддерживаемых возможностей (включая уже упомянутую развитую систему подсказок и автодополнений, поиск по истории команд и vi-подобный режим редактирования), история коммитов в kube-shell говорит о явном замедлении темпов развития проекта. В этом году зафиксировано всего семь коммитов, два из которых — модификации README. Хотя были и полезные — например, долгожданная поддержка переменной KUBECONFIG. Так или иначе, продолжительное отсутствие реакции разработчиков на актуальные для пользователей запросы (см. issues) не внушает должных перспектив.

Ситуация с развитием kube-prompt выглядит незначительно лучше. Хотя этот проект набрал меньше звёздочек на GitHub (если год назад он немного опережал своего Python-конкурента, то теперь заметно отстаёт), коммиты появляются более-менее регулярно, а последний релиз (1.0.5) датируется 18 октября. Однако значимых изменений за последний год не так много — отметим поддержку Kubernetes версии 1.11 и возможность автодополнения для пространства имён. Главное же в том, что сам автор признаёт невозможность уделять развитию kube-prompt достаточное время и ищет себе помощников.

Подводя итоги по этим двум проектам, можно сказать, что kube-shell сохранил лидерство в плане поддерживаемых возможностей и вышел вперёд по популярности, но вот с перспективами у обоих оболочек не всё ясно. Впрочем, если вас устраивает то, как они работают сейчас, нет причин не взять их на вооружение, т.к. иных альтернатив в аналогичном исполнении не появилось.

Click


  • GitHub (750+ stars)
  • Язык: Rust
  • Лицензия: Apache 2.0


Click — довольно молодой проект: в виде бета-версии он был представлен в конце марта — и очень по-своему интересный. Его концепция сводится к тому, чтобы использовать kubectl в цикле REPL, который упрощает жизнь тем, что поддерживает постоянное окружение. Последнее заключается в том, что Click «помнит» текущий контекст, namespace, под и т.п., предлагая пользователю выполнить нужную команду для данного ресурса без необходимости повторно указывать весь этот «путь».

t43lkqunutszqz8ujqwuuwonqas.png

Идея проекта зародилась в компании Databricks, где активно используют Kubernetes и устали наблюдать однотипный сценарий работы с kubectl, требующий постоянного введения предшествующих данных. При этом саму утилиту kubectl — как и консоль вообще — инженеры очень любят. Так и появилась эта надстройка, не претендующая на замену kubectl, а лишь помогающая в работе с ним. Примерный сценарий использования Click таков:

pods // запросить список подов для текущего контекста и пространства имён
2 // выбрать второй под из списка
describe // вывести описание этого пода
events // посмотреть недавние события
logs -c foo > /tmp/podfoo.log // сохранить логи в файл
delete // удалить под (с запросом на подтверждение операции)

Если заинтересовались — смотрите также небольшой скринкаст, демонстрирующий работу Click с текстовыми комментариями.

Работа с логами


Как бонус — не оболочки, но консольные инструменты для работы с логами в Kubernetes. Ещё год назад в качестве таковых мы упоминали лишь k8stail, но прошедшее время показало, что проблема актуальна, и для её решения есть другие достойные внимания решения.

Stern


  • GitHub (~1300 stars)
  • Язык: Go
  • Лицензия: Apache 2.0


Stern — безусловный фаворит категории «tail для подов в Kubernetes». Для наглядности при выводе логов используются разные цветовые обозначения:

rt7vyx02t6pn1vmmavbsoocksrs.png

Другой его важной особенностью является использование регулярных выражений для удобной фильтрации подов без потребности знать конкретные ID (например, отобрать все с названием web-\w+). Аналогично (т.е. регэкспами) можно фильтровать и определённые контейнеры для запрашиваемых подов. Среди прочих возможностей stern:

  • поддержка кастомных Go-шаблонов для выводимых логов (есть несколько предопределённых стандартно);
  • поддержка label selectors;
  • ограничение вывода логов заданным значением времени --since и/или заданным количеством строк;
  • поддержка автодополнения для bash и zsh, а также динамической подстановки значений пространств имён и контекстов.


Kubetail


  • GitHub (~950 stars)
  • Язык: Shell
  • Лицензия: Apache 2.0


Схожее решение, написанное на обычном Bash и чуть более активно развиваемое в последний год. Как и stern, поддерживает выделение цветом названия подов (или же всей строки, что настраивается):

apiqg3mlf-y2do6jonpcrm-kwxy.png

Тоже позволяет фильтровать поды и контейнеры как по полным названиям, так и по регулярным выражениям, а также использовать селекторы, ограничивать вывод временем и количеством строк, поддерживает автодополнение для Bash, zsh и fish. Среди других возможностей:

  • отключаемый режим --follow для обновления данных из логов в реальном времени (как в tail -f);
  • --dry-run для вывода списка подходящих подов и контейнеров без выполнения каких-либо других действий;
  • поддержка jq-селектора для парсинга вывода в JSON.


Kail


  • GitHub (~500 stars)
  • Язык: Go
  • Лицензия: MIT


Ещё одна реализация, у которой за последний год наблюдается наименьшая активность в кодовой базе. Тем не менее, у неё есть интересные функциональные особенности, отличающие от своих конкурентов, а именно:

  • ограничение по запросу подов названиями их Service, ReplicationController, ReplicaSet, Deployment, Node и/или Ingress (т.е. подов, принадлежащих сервисам, на которые ведёт указанный Ingress);
  • возможность не только выбирать по селекторам, но и исключать по ним;
  • определение уровня логирования (--log-level).


som5kdohirqy2powyzwfrmunfq8.png

Но есть и минусы: kail не выделяет поды цветами, не поддерживает регулярные выражения для фильтров.

P.S.


Спасибо за интерес и, конечно же, будем рады информации о ваших находках в комментариях!

Читайте также в нашем блоге:

© Habrahabr.ru