Консольные помощники для работы с Kubernetes через kubectl

image
Kubectl — основной консольный интерфейс для взаимодействия с Kubernetes и, безусловно, важный инструмент в руках любого администратора/DevOps-инженера, причастного к эксплуатации таких кластеров. Если вы пользуетесь им каждый день и делаете это по-настоящему активно, то, как это свойственно ИТ-специалистам, наверняка задумывались о способах упрощения/автоматизации своих манипуляций. Благо, это мир сисадминов, Open Source и консоли, так что в нём, конечно, уже нашлись и те, кто не только задумывался об этом, но и воплотил свои потребности в жизнь — в виде утилит, доступных теперь и всем «коллегам по цеху». О них и пойдёт речь в этом небольшом обзоре.

kube-shell


  • GitHub
  • Язык: Python*
  • Лицензия: Apache 2.0


Интерактивная оболочка для kubectl, в основе которой — библиотека prompt-toolkit для Python, служащая «заменой для GNU readline и гораздо большим». Эта библиотека реализует автоматическое дополнение вводимых команд с выпадающими пояснениями, подсветку синтаксиса и ряд других возможностей, которые по сути и делают всю «интерактивность» в kube-shell. Тот случай, когда проще один раз увидеть:

n3kjzqji9fyyefnltkzfhldhtbo.gif

Среди других возможностей этой оболочки:

  • автоматические подсказки, появляющиеся по мере ввода команд в стиле fish shell;
  • история введённых команд с поиском по частичным совпадениям;
  • расширенные фичи автодополнения: fuzzy-поиск, подстановка значений из полученных с сервера данных;
  • удобное переключение между кластерами и пространствами имён (висит тикет на добавление аналогичного переключения между пользователям);
  • режим редактирования vi.


В непонятном будущем ожидается также появление поддержки SQL-подобного языка для выполнения через kubectl команд такого вида:

ls  select (property1, property2, property3) where (propery1=value1 and property2=value2) order by property3


Вдохновением для kube-shell послужили похожие оболочки для работы с API в AWS: aws-shell и saws.

* В проекте также используется вспомогательная программа на Go (она забавно называется — python_eats_cobra.go) для генерации JSON-файла с доступными в kubectl командами, аргументами и т.п. В дальнейшем с этим файлом работает основное приложение на Python.

kube-prompt


  • GitHub
  • Язык: Go
  • Лицензия: MIT License


Ещё одна интерактивная оболочка, очень похожая по своей сути на описанную ранее kube-shell и появившаяся на месяц позже (согласно первому коммиту в GitHub, который случился в июле против июня 2017 года). Её главное отличие — использование «родного» для Kubernetes-сообщества языка программирования Go вместо Python. Однако своего prompt-toolkit у Go не было, поэтому… автор (Masashi Shibata из Японии) взял и написал go-prompt, а уже на её основе реализовал новую оболочку. И результатам получился весьма схожим:

qru0elehe4fgmalkediymyujlwu.png
(Набор символов справа снизу — последовательность нажатий на клавиатуре для достижения такого результата. Более наглядно — в этой GIF-анимации на 16 Мб.)

Если сравнивать kube-prompt с его Python-собратом глазами конечного пользователя, то дополнительных фишек у него меньше (например, отсутствует постоянный вывод текущего кластера/пространства имён и быстрое переключение между ними). Зато в нём нет необходимости вводить «kubectl» в начале всех команд и этом сохранена возможность добавления других shell-команд через pipe (»|») — например, grep при получении списка подов.

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

kubectl-repl


  • GitHub
  • Язык: Go
  • Лицензия: Apache 2.0


«REPL» в названии этого приложения — тот самый цикл Read–Eval–Print Loop, реализующий простую интерактивную среду внутри shell. По сути же kubectl-repl представляет собой оригинальную «обёртку», которая после своего запуска предлагает вводить дальнейшие команды без упоминания kubectl и упрощает взаимодействие с этой утилитой благодаря двум возможностям:

  1. Переключение пространств имён (одной командой выбирается текущее, которое затем показывается как актуальное в приглашении и добавляется ко всем последующим вызовам kubectl);
  2. «Номерной» выбор элементов из списков, возвращаемых kubectl get.


Вторая фича реализована таким образом, что всем элементам списков — например, для списка подов, вернувшихся по команде kubectl get pods | grep foobar, — добавляется столбец с переменными вида $1, $2, $3… Эти переменные доступны для использования в дальнейших командах kubectl или shell. Пример из документации:

# kube-system get pods
+ kubectl -n kube-system get pods
   	NAME                        READY     STATUS    RESTARTS   AGE
$1 	kube-dns-3945342221-mwdh6   3/3       Running   0          9d
$2 	kube-dns-3945342221-x3fhn   3/3       Running   0          9d
# kube-system ; echo $(whoami) $2
+  echo $(whoami) kube-dns-3945342221-x3fhn
mikulas kube-dns-3945342221-x3fhn


Утилита kubectl-repl — совсем молодая, разрабатывается одним энтузиастом меньше месяца.

k8sh


  • GitHub
  • Язык: Bash
  • Лицензия: Apache 2.0


Ещё одна попытка сделать простую обёртку вокруг kubectl — на сей раз на обычном Bash. После запуска отображает в своём приглашении текущий контекст (kubectl config current-context) и пространство имён, предлагая короткие команды для их смены (ct и ns соответственно), а также набор из других алиасов. Например:

  • kubectl describek describe
  • kubectl get podspods
  • kubectl get persistentvolumeclaimspvc


btuxiv5siaqb4jwea6k16zpl0ak.png

Подгружаемые с запуском k8sh алиасы можно расширять, создав файл ~/.k8sh_extensions со своим Bash-кодом (в репозитории есть пример, как этим воспользоваться).

kubectl-aliases


  • GitHub
  • Язык: Python, Bash
  • Лицензия: Apache 2.0


Более «хардкорный» вариант Bash/zsh-алиасов для kubectl. Его автор написал скрипт на Python, который автоматически генерирует файл .kubectl_aliases, содержащий сотни (!) строчек следующего вида:

alias k='kubectl'
…
alias ka='kubectl apply -f'
…
alias ksyslo='kubectl --namespace=kube-system logs -f'
…
alias ksysgdep='kubectl --namespace=kube-system get deployment'
…
alias kgno='kubectl get nodes'
…
alias ksysgdepojson='kubectl --namespace=kube-system get deployment -o=json'
…


Как отмечает сам автор, анонсировавший своё детище менее 2 недель назад, «это может выглядеть по-настоящему глупо, однако ОЧЕНЬ ПОЛЕЗНО для меня; [благодаря этим алиасам] я действительно существенно экономлю время в своём ежедневном рабочем процессе».

Другие


  • О kubectx для удобного переключения между кластерами мы уже писали в этом обзоре, а с тех пор утилита была дополнена kubens (см. тот же репозиторий) для аналогичного переключения между пространствами имён.
  • kubeplay — ещё одна реализация REPL, но предлагающая использовать синтаксис Ruby.
  • zsh-kubectl-prompt — простой скрипт для отображения в приглашении zsh текущего контекста и пространства имён Kubernetes.


P.S.


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

  • «Полезные утилиты при работе с Kubernetes»;
  • «Полезные команды и советы при работе с Kubernetes через консольную утилиту kubectl»;
  • «Знакомство с kube-spawn — утилитой для создания локальных Kubernetes-кластеров»;
  • «Обзор GUI-интерфейсов для управления Docker-контейнерами».

© Habrahabr.ru