Консольные помощники для работы с Kubernetes через kubectl
Kubectl — основной консольный интерфейс для взаимодействия с Kubernetes и, безусловно, важный инструмент в руках любого администратора/DevOps-инженера, причастного к эксплуатации таких кластеров. Если вы пользуетесь им каждый день и делаете это по-настоящему активно, то, как это свойственно ИТ-специалистам, наверняка задумывались о способах упрощения/автоматизации своих манипуляций. Благо, это мир сисадминов, Open Source и консоли, так что в нём, конечно, уже нашлись и те, кто не только задумывался об этом, но и воплотил свои потребности в жизнь — в виде утилит, доступных теперь и всем «коллегам по цеху». О них и пойдёт речь в этом небольшом обзоре.
kube-shell
- GitHub
- Язык: Python*
- Лицензия: Apache 2.0
Интерактивная оболочка для kubectl, в основе которой — библиотека prompt-toolkit для Python, служащая «заменой для GNU readline и гораздо большим». Эта библиотека реализует автоматическое дополнение вводимых команд с выпадающими пояснениями, подсветку синтаксиса и ряд других возможностей, которые по сути и делают всю «интерактивность» в kube-shell. Тот случай, когда проще один раз увидеть:
Среди других возможностей этой оболочки:
- автоматические подсказки, появляющиеся по мере ввода команд в стиле 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, а уже на её основе реализовал новую оболочку. И результатам получился весьма схожим:
(Набор символов справа снизу — последовательность нажатий на клавиатуре для достижения такого результата. Более наглядно — в этой 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 и упрощает взаимодействие с этой утилитой благодаря двум возможностям:
- Переключение пространств имён (одной командой выбирается текущее, которое затем показывается как актуальное в приглашении и добавляется ко всем последующим вызовам kubectl);
- «Номерной» выбор элементов из списков, возвращаемых
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 describe
→k describe
-
kubectl get pods
→pods
-
kubectl get persistentvolumeclaims
→pvc
Подгружаемые с запуском 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-контейнерами».