- PVSM.RU - https://www.pvsm.ru -
Kubectl — основной консольный интерфейс для взаимодействия с Kubernetes и, безусловно, важный инструмент в руках любого администратора/DevOps-инженера, причастного к эксплуатации таких кластеров. Если вы пользуетесь им каждый день и делаете это по-настоящему активно, то, как это свойственно ИТ-специалистам, наверняка задумывались о способах упрощения/автоматизации своих манипуляций. Благо, это мир сисадминов, Open Source и консоли, так что в нём, конечно, уже нашлись и те, кто не только задумывался об этом, но и воплотил свои потребности в жизнь — в виде утилит, доступных теперь и всем «коллегам по цеху». О них и пойдёт речь в этом небольшом обзоре.
Интерактивная оболочка для kubectl, в основе которой — библиотека prompt-toolkit [2] для Python, служащая «заменой для GNU readline и гораздо большим». Эта библиотека реализует автоматическое дополнение вводимых команд с выпадающими пояснениями, подсветку синтаксиса и ряд других возможностей, которые по сути и делают всю «интерактивность» в kube-shell. Тот случай, когда проще один раз увидеть:
Среди других возможностей этой оболочки:
В непонятном будущем ожидается [5] также появление поддержки SQL-подобного языка для выполнения через kubectl команд такого вида:
ls <resource-name> select (property1, property2, property3) where (propery1=value1 and property2=value2) order by property3
Вдохновением для kube-shell послужили похожие оболочки для работы с API в AWS: aws-shell [6] и saws [7].
* В проекте также используется вспомогательная программа на Go (она забавно называется — python_eats_cobra.go [8]) для генерации JSON-файла с доступными в kubectl командами, аргументами и т.п. В дальнейшем с этим файлом работает основное приложение на Python.
Ещё одна интерактивная оболочка, очень похожая по своей сути на описанную ранее kube-shell и появившаяся на месяц позже (согласно первому коммиту в GitHub, который случился в июле против июня 2017 года). Её главное отличие — использование «родного» для Kubernetes-сообщества языка программирования Go вместо Python. Однако своего prompt-toolkit у Go не было, поэтому… автор (Masashi Shibata из Японии) взял и написал go-prompt [10], а уже на её основе реализовал новую оболочку. И результатам получился весьма схожим:
(Набор символов справа снизу — последовательность нажатий на клавиатуре для достижения такого результата. Более наглядно — в этой GIF-анимации [11] на 16 Мб.)
Если сравнивать kube-prompt с его Python-собратом глазами конечного пользователя, то дополнительных фишек у него меньше (например, отсутствует постоянный вывод текущего кластера/пространства имён и быстрое переключение между ними). Зато в нём нет необходимости вводить «kubectl» в начале всех команд и этом сохранена возможность добавления других shell-команд через pipe («|») — например, grep при получении списка подов.
Тем не менее, несмотря на то, что kube-prompt разрабатывается единственным человеком и чуть меньше по времени, по количеству звёздочек на GitHub он уже немного впереди, так что перспективы дальнейшего развития у этих конкурентных решений не столь очевидны.
«REPL» в названии этого приложения — тот самый цикл Read–Eval–Print Loop [13], реализующий простую интерактивную среду внутри shell. По сути же kubectl-repl представляет собой оригинальную «обёртку», которая после своего запуска предлагает вводить дальнейшие команды без упоминания 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 — совсем молодая, разрабатывается одним энтузиастом меньше месяца.
Ещё одна попытка сделать простую обёртку вокруг kubectl — на сей раз на обычном Bash. После запуска отображает в своём приглашении текущий контекст (kubectl config current-context
) и пространство имён, предлагая короткие команды для их смены (ct
и ns
соответственно), а также набор из других алиасов. Например:
kubectl describe
→ k describe
kubectl get pods
→ pods
kubectl get persistentvolumeclaims
→ pvc
Подгружаемые с запуском k8sh алиасы можно расширять, создав файл ~/.k8sh_extensions
со своим Bash-кодом (в репозитории есть пример [15], как этим воспользоваться).
Более «хардкорный» вариант 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'
…
Как отмечает сам автор, анонсировавший [17] своё детище менее 2 недель назад, «это может выглядеть по-настоящему глупо, однако ОЧЕНЬ ПОЛЕЗНО для меня; [благодаря этим алиасам] я действительно существенно экономлю время в своём ежедневном рабочем процессе».
Читайте также в нашем блоге:
Автор: shurup
Источник [25]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/bash/267690
Ссылки в тексте:
[1] GitHub: https://github.com/cloudnativelabs/kube-shell
[2] prompt-toolkit: https://github.com/jonathanslenders/python-prompt-toolkit
[3] fish shell: http://fishshell.com/
[4] тикет: https://github.com/cloudnativelabs/kube-shell/issues/22
[5] ожидается: https://github.com/cloudnativelabs/kube-shell/wiki/Proposal:-SQL-like-query-language
[6] aws-shell: https://github.com/awslabs/aws-shell
[7] saws: https://github.com/donnemartin/saws
[8] python_eats_cobra.go: https://github.com/cloudnativelabs/kube-shell/blob/master/misc/python_eats_cobra.go
[9] GitHub: https://github.com/c-bata/kube-prompt
[10] go-prompt: https://github.com/c-bata/go-prompt
[11] этой GIF-анимации: https://github.com/c-bata/assets/raw/master/kube-prompt/kube-prompt.gif
[12] GitHub: https://github.com/Mikulas/kubectl-repl
[13] Read–Eval–Print Loop: https://en.wikipedia.org/wiki/Read%E2%80%93eval%E2%80%93print_loop
[14] GitHub: https://github.com/Comcast/k8sh
[15] пример: https://github.com/Comcast/k8sh/blob/master/examples/k8sh_extensions
[16] GitHub: https://github.com/ahmetb/kubectl-aliases
[17] анонсировавший: https://ahmet.im/blog/kubectl-aliases/
[18] kubectx: https://github.com/ahmetb/kubectx
[19] этом обзоре: https://habrahabr.ru/company/flant/blog/330198/
[20] kubeplay: https://github.com/errordeveloper/kubeplay
[21] zsh-kubectl-prompt: https://github.com/superbrothers/zsh-kubectl-prompt
[22] Полезные команды и советы при работе с Kubernetes через консольную утилиту kubectl: https://habrahabr.ru/company/flant/blog/333956/
[23] Знакомство с kube-spawn — утилитой для создания локальных Kubernetes-кластеров: https://habrahabr.ru/company/flant/blog/338132/
[24] Обзор GUI-интерфейсов для управления Docker-контейнерами: https://habrahabr.ru/company/flant/blog/338332/
[25] Источник: https://habrahabr.ru/post/341606/
Нажмите здесь для печати.