Какая утилита чаще всего встречается в
.bash_history
SRE/DevOps-инженера, работающего с
Kubernetes? Конечно, kubectl
. Это привело к тому, что
в сообществе нашлось вдохновение для тех, захотел её улучшить,
принести новый опыт использования или даже создать некие
производные, нацеленные на более удобное взаимодействие. В рамках
этого обзора рассмотрены три таких проекта, которые, возможно,
покажутся интересными и вам или хотя бы откроют какие-то новые
подходы в решении типовых задач.
1. fubectl
-
GitHub (400+ звёзд)
Для начала посмотрим на fubectl, который сам автор называет fancy-kubectl. Этот проект сходу не назовёшь самостоятельной утилитой, т.к. на первый взгляд это лишь подготовленный набор алиасов для kubectl. Как тут не вспомнить похожий kubectl-aliases, про который мы писали 3,5 года назад, когда fubectl еще даже не существовало?.. Возможно, именно в простых вещах кроется сермяжная правда. Итак, автор обещает, что fubectl сделает вашу работу с кластером K8s более эффективной давайте попробуем её в действии.
Установка и запуск. Для полноценной работы утилиты потребуется установить пакет fzf, а также для выполнения отдельных команд (kexp, ktree, neat) понадобятся плагины к kubectl (они ставятся через kubectl krew, для этого есть свой alias об этом чуть ниже).
Основной процесс установки прост и заключается в скачивании одного файла:
curl -LO https://rawgit.com/kubermatic/fubectl/master/fubectl.source
и его добавлению в .bashrc
или
.zshrc
:
[ -f <path-to>/fubectl.source ] && source <path-to>/fubectl.source
Кроме того, для ZSH есть альтернативный путь установки с помощью предпочтительного менеджера плагинов.
Применение. Главный и основной алиас это
банальный k
, заменяющий команду kubectl
.
Соответственно, все команды, которыми мы привыкли пользоваться,
сокращаются до:
-
k get nodes
-
k get deploy -A
-
k -n mynamespace get pods
Это удобно и практически не требует привыкания. Помимо этого, присутствует набор дополнительных алиасов на команды, которые могут часто использоваться в работе. Например:
-
kw
алиас для watch:-
kw nodes
-
kw pods
-
kw nodes,pods,services
-
-
kdes
describe ресурсов; -
kdel
удаление ресурсов; -
klog
вывод логов контейнера podа.
Обратите внимание, что документация в README проекта не совсем актуальна. В fubectl можно найти и специальные команды, определенные как shell-функции. Среди них, например:
-
ksec
для декодирования значения из секрета, -
kex
для выполнения команды в контейнере, -
konsole
для создания и запуска контейнера с root shell.
(Для работы первых двух потребуется дополнительно поставить
плагины к kubectl, что делается также отдельной командой
kinstall
).
Полный список поддерживаемых команд можно увидеть, вызвав
khelp
:
Последний приятный нюанс: благодаря уже упомянутой fzf в утилиту повсеместно встроен механизм fuzzy-поиска, который упрощает ввод команд.
Опыт использования: Из простого source-файла мы получаем весьма функциональное и удобное решение, к которому быстро привыкаешь и открываешь для себя новые возможности.
2. Kubelive
-
GitHub (500+ звёзд)
Утилита создана с целью упрощения вывода kubectl get pods
-w
с наглядным отображением статуса podа в режиме реального
времени. Под капотом этого детища используется Node.js-библиотека
@kubernetes/client-node.
Установка и запуск. Инсталляция:
npm install -g kubelive
Для работы потребуется Node.js не ниже версии v10.
Если kubectl уже настроен на хосте, то больше ничего не
требуется.По аналогии с kubectl будет использоваться стандартный
.kube/config
(или путь, указанный в переменной
окружения KUBECONFIG
).
Применение. При запуске kubelive
мы получаем интерактивную консоль с возможностью переключения между
пространствами имен с помощью стрелок на клавиатуре. Также доступны
с помощью быстрых клавиш некоторые базовые операции: рестарт podа,
копирование его имени, выход из приложения/интерактивного
режима:
[D]: Delete [C]: Copy [Q]: Quit
Для получения общего представления об интерфейсе достаточно посмотреть на демонстрацию из README проекта:
Список поддерживаемых команд на текущий момент так ограничен, что можно полностью привести его в статье:
-
kubelive get pods
(или простоkubelive
) список podов в кластере;
-
kubelive get services
список сервисов;
-
kubelive get replicationcontrollers
список ReplicationController;
-
kubelive get nodes
список узлов;
-
kubelive get <resource> --context <name>
список ресурсов в разных контекстах.
Опыт использования. Мы имеем простой по функциям инструмент, по сути реализующий единственную вещь (отображение статуса), вокруг которой уже строятся всевозможные дополнения (возможность перезагрузки podов и т.п.). Однако при работе с kubelive я столкнулся с рядом проблем. В частности, при большом количестве namespaceов их имена в шапке схлопываются:
Если количество namespaceов превышает 30, шапка просто перестает отображать наименования (разработчик об этом знает), а переход между ними добавляет заметную (секунд на 3-5) задержку.
Кроме того, количество podов также имеет значение, т.к. на экране мы увидим только те, которые влезли, это добавляет неудобств Также на данный момент нет возможности фильтрации/указания нужного пространства имен, хотя и существуют несколько issue на эту тему. Ещё не хватает возможности отображения других сущностей Kubernetes (Deployment, StatefulSet и т.п.) и их манифестов.
Ко всему прочему, не стоит забывать, что для своей работы утилита требует установки Node.js со всеми ее зависимостями (а их не так мало). Используя kubelive на больших кластерах, я заметил, как растёт потребление CPU этой утилитой при беглом переключении по вкладкам namespaceов.
Подводя итог: этот инструмент, существующий с августа 2019 года, показался недостаточно зрелым, но сами реализованные в нем идеи (удобное представление информации о Kubernetes-кластере в консоли), пожалуй, еще найдут свой отклик. Наконец, хотя заявленный проектом Roadmap и может внушить некоторый оптимизм в смысле функциональных перспектив его единственный разработчик утратил реальную активность с прошлого года, что говорит не в пользу будущего Kubelive.
3. Web Kubectl
-
GitHub (400+ звёзд)
Это решение иного толка: оно позволяет работать с kubectl прямо из браузера и посему не требует его установки на десктопе или серверах. Для этого в Web Kubectl используют собственный форк проекта gotty, что позволяет запускать веб-терминал на базе JavaScript.
Установка и запуск. Для запуска приложения предлагается использовать Docker-образ:
docker run --name="webkubectl" -p 8080:8080 -d --privileged kubeoperator/webkubectl
После этого достаточно перейти на localhost:8080
и
загрузить kubeconfig-файл или указать
service account tokens для доступа к
Kubernetes-кластеру:
Применение. Зайдя в одну из сессий, мы получаем
возможность использовать терминал с kubectl
прямо в
браузере:
При этом есть поддержка одновременного использования, т.к.
присутствует изоляция сеанса на уровне сессии. У каждого сеанса под
капотом свое изолированное пространство (подпроцесс запускается в
новом пространстве имен Linux через
unshare), которое не доступно для других. Там и
создается файл .kube/config
. При завершении сеанса
предоставленное пространство имен и хранилище удаляются. По
умолчанию время сеанса не ограничено по времени, но это можно
изменить через gotty.
Помимо штатного kubectl в вашем распоряжении также Helm, k9s (о нем мы уже писали), kubectx и даже уже упомянутый в нашем прошлом обзоре набор алисов.
Отдельно выделю наличие API, с помощью которого можно
осуществлять доступ к веб-терминалу. Для этого потребуется
сформировать токен с содержимым kubeconfig в base64 (cat
~/.kube/config.yaml | base64 -w0
):
$ curl http://<webkubectl-address>:<port>/api/kube-config -X POST -d '{"name":"k8s-cluster-bj1","kubeConfig":"<kubeconfig file content base64 encoded>"}'
Ту же самую операцию можно осуществить через запрос к Kubernetes API server и bearer token:
$ curl http://<webkubectl-address>:<port>/api/kube-token -X POST -d '{"name":"gks-hk-dev","apiServer":"https://k8s-cluster:6443","token":"token-content"}'
Если все сделано правильно, в ответе будет получен токен:
{"success":true,"token":"lgfgbp1wkjxzmmbuypbj","message":""}
Его можно разово использовать для терминала с доступом в кластер:
http://<webkubectl-address>:<port>/terminal/?token=<token fetched from api>
Токен перестает быть действительным сразу после первого использования или же через 5 минут простоя.
Если же вы захотите запускать Web Kubectl не локально, обратите внимание, что по умолчанию трафик между сервером и клиентом не защищен: использовать SSL-сертификат и добавлять базовую авторизацию рекомендуется через все тот же gotty. Таким образом, например, можно настроить доступ к изолированному кластеру в VPC вот схема из документации проекта:
_______________________________________________________________________| Local Network | DMZ | VPC/Datacenter || | | || | _______________ | ---------------- || --------------- | | | /~~~~~>| Kubernetes A | || | Your Laptop |~~~~~~~>| Web Kubectl | / | ---------------- || --------------- | | | \ | || | --------------- \ | ---------------- || | \~~~~>| Kubernetes B | || | | ---------------- |-----------------------------------------------------------------------
Для запуска Web Kubectl также доступны дополнительные переменные среды с говорящими за себя названиями:
-
SESSION_STORAGE_SIZE
-
KUBECTL_INSECURE_SKIP_TLS_VERIFY
-
GOTTY_OPTIONS
-
WELCOME_BANNER
Опыт использования. Инструмент показал себя с хорошей стороны и оставил приятные впечатления по быстродействию. Наличие API дает возможность интегрировать webkubectl в свое приложение, а частота релизов на GitHub показывает интерес авторов к своему проекту. Во многом этот интерес объясняется тем, что webkubectl часть более крупного проекта, готового для production дистрибутива Kubernetes под названием KubeOperator от той же китайской компании. Из личных пожеланий проекту отмечу, что было бы здорово иметь возможность группировки сессий, а также административную панель для управления доступом.
Заключение
Популярность Kubernetes с каждым днем растет, как и количество приложений и сервисов вокруг этой технологии. Всё это формирует развитую экосистему и даёт нам возможность пользоваться удобными инструментами для решения практически любых задач. Этот обзор был посвящен трем проектам, объединенным одной темой kubectl, и разным не только по своему назначению, но и тем впечатлениям, что оставили при первом знакомстве с ними. Надеюсь, какие-то из них могут оказаться полезными и для вас.
P.S.
Читайте также в нашем блоге: