- PVSM.RU - https://www.pvsm.ru -

Какая утилита чаще всего встречается в .bash_history SRE/DevOps-инженера, работающего с Kubernetes? Конечно, kubectl. Это привело к тому, что в сообществе нашлось вдохновение для тех, захотел её улучшить, принести новый опыт использования или даже создать некие производные, нацеленные на более удобное взаимодействие. В рамках этого обзора рассмотрены три таких проекта, которые, возможно, покажутся интересными и вам — или хотя бы откроют какие-то новые подходы в решении типовых задач.
GitHub [1] (400+ звёзд)
Для начала посмотрим на fubectl, который сам автор называет «fancy-kubectl». Этот проект сходу не назовёшь самостоятельной утилитой, т.к. на первый взгляд — это лишь подготовленный набор алиасов для kubectl. Как тут не вспомнить похожий kubectl-aliases [2], про который мы писали [3] 3,5 года назад, когда fubectl еще даже не существовало?.. Возможно, именно в простых вещах кроется сермяжная правда. Итак, автор обещает, что fubectl сделает вашу работу с кластером K8s более эффективной — давайте попробуем её в действии.
Установка и запуск. Для полноценной работы утилиты потребуется установить пакет fzf [4], а также для выполнения отдельных команд (kexp, ktree, neat) понадобятся плагины к kubectl (они ставятся через kubectl krew [5], для этого есть свой 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 [6] проекта не совсем актуальна [7]. В fubectl можно найти и специальные команды, определенные как shell-функции. Среди них, например:
ksec — для декодирования значения из секрета,
kex — для выполнения команды в контейнере,
konsole — для создания и запуска контейнера с root shell.
(Для работы первых двух потребуется дополнительно поставить плагины к kubectl, что делается также отдельной командой — kinstall).

Полный список поддерживаемых команд можно увидеть, вызвав khelp:

Последний приятный нюанс: благодаря уже упомянутой fzf в утилиту повсеместно встроен механизм fuzzy-поиска [8], который упрощает ввод команд.
Опыт использования: Из простого source-файла мы получаем весьма функциональное и удобное решение, к которому быстро привыкаешь и открываешь для себя новые возможности.
GitHub [9] (500+ звёзд)
Утилита создана с целью упрощения вывода kubectl get pods -w с наглядным отображением статуса pod’а в режиме реального времени. Под капотом этого детища используется Node.js-библиотека @kubernetes/client-node [10].
Установка и запуск. Инсталляция:
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, шапка просто перестает отображать наименования (разработчик об этом знает [11]), а переход между ними добавляет заметную (секунд на 3-5) задержку.
Кроме того, количество pod’ов также имеет значение, т.к. на экране мы увидим только те, которые влезли, — это добавляет неудобств… Также на данный момент нет возможности фильтрации/указания нужного пространства имен, хотя и существуют несколько issue [12] на эту тему. Ещё не хватает возможности отображения других сущностей Kubernetes (Deployment, StatefulSet и т.п.) и их манифестов.
Ко всему прочему, не стоит забывать, что для своей работы утилита требует установки Node.js со всеми ее зависимостями (а их не так мало…). Используя kubelive на больших кластерах, я заметил, как растёт потребление CPU этой утилитой при беглом переключении по вкладкам namespace’ов.
Подводя итог: этот инструмент, существующий с августа 2019 года, показался недостаточно зрелым, но сами реализованные в нем идеи (удобное представление информации о Kubernetes-кластере в консоли), пожалуй, еще найдут свой отклик. Наконец, хотя заявленный проектом Roadmap [13] и может внушить некоторый оптимизм в смысле функциональных перспектив… его единственный разработчик утратил реальную активность с прошлого года, что говорит не в пользу будущего Kubelive.
GitHub [14] (400+ звёзд)
Это решение иного толка: оно позволяет работать с kubectl прямо из браузера и посему не требует его установки на десктопе или серверах. Для этого в Web Kubectl используют собственный форк проекта gotty [15], что позволяет запускать веб-терминал на базе JavaScript.
Установка и запуск. Для запуска приложения предлагается использовать Docker-образ:
docker run --name="webkubectl" -p 8080:8080 -d --privileged kubeoperator/webkubectl
После этого достаточно перейти на localhost:8080 и загрузить kubeconfig-файл или указать service account tokens [16] для доступа к Kubernetes-кластеру:

Применение. Зайдя в одну из сессий, мы получаем возможность использовать терминал с kubectl прямо в браузере:

При этом есть поддержка одновременного использования, т.к. присутствует изоляция сеанса на уровне сессии. У каждого сеанса «под капотом» — свое изолированное пространство (подпроцесс запускается в новом пространстве имен Linux через unshare [17]), которое не доступно для других. Там и создается файл .kube/config. При завершении сеанса предоставленное пространство имен и хранилище удаляются. По умолчанию время сеанса не ограничено по времени, но это можно изменить через gotty.
Помимо штатного kubectl в вашем распоряжении также Helm, k9s [18] (о нем мы уже писали [19]), kubectx и даже уже упомянутый в нашем прошлом обзоре набор алисов [2].
Отдельно выделю наличие 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 [16]:
$ 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 [20]. Таким образом, например, можно настроить доступ к изолированному кластеру в 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 [21] показывает интерес авторов к своему проекту. Во многом этот интерес объясняется тем, что webkubectl — часть более крупного проекта, готового для production дистрибутива Kubernetes под названием KubeOperator [22] от той же китайской компании. Из личных пожеланий проекту отмечу, что было бы здорово иметь возможность группировки сессий, а также административную панель для управления доступом.
Популярность Kubernetes с каждым днем растет, как и количество приложений и сервисов вокруг этой технологии. Всё это формирует развитую экосистему и даёт нам возможность пользоваться удобными инструментами для решения практически любых задач. Этот обзор был посвящен трем проектам, объединенным одной темой — kubectl, — и разным не только по своему назначению, но и тем впечатлениям, что оставили при первом знакомстве с ними. Надеюсь, какие-то из них могут оказаться полезными и для вас.
Читайте также в нашем блоге:
«Kubernetes tips & tricks: удобные заготовки для kubectl [23]»;
«Появилась консольная утилита kubelive для интерактивной работы с Kubernetes [24]»;
«Консольные помощники для работы с Kubernetes через kubectl [3]».
Автор: Sprait
Источник [26]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/sistemnoe-administrirovanie/363595
Ссылки в тексте:
[1] GitHub: https://github.com/kubermatic/fubectl
[2] kubectl-aliases: https://github.com/ahmetb/kubectl-aliases
[3] писали: https://habr.com/ru/company/flant/blog/341606/
[4] fzf: https://github.com/junegunn/fzf
[5] kubectl krew: https://kubernetes-sigs-krew.netlify.app/docs/user-guide/quickstart/
[6] README: https://github.com/kubermatic/fubectl/blob/master/README.md
[7] не совсем актуальна: https://github.com/kubermatic/fubectl/issues/65
[8] fuzzy-поиска: https://en.wikipedia.org/wiki/Approximate_string_matching
[9] GitHub: https://github.com/ameerthehacker/kubelive
[10] @kubernetes/client-node: https://www.npmjs.com/package/%40kubernetes%2Fclient-node
[11] знает: https://github.com/ameerthehacker/kubelive/issues/28
[12] issue: https://github.com/ameerthehacker/kubelive/issues/38
[13] Roadmap: https://github.com/ameerthehacker/kubelive#roadmap
[14] GitHub: https://github.com/KubeOperator/webkubectl
[15] gotty: https://github.com/yudai/gotty
[16] service account tokens: https://kubernetes.io/docs/reference/access-authn-authz/authentication/#service-account-tokens
[17] unshare: https://man7.org/linux/man-pages/man1/unshare.1.html
[18] k9s: https://github.com/derailed/k9s
[19] уже писали: https://habr.com/ru/company/flant/blog/524196/
[20] gotty: https://github.com/KubeOperator/webkubectl/blob/master/gotty/GOTTY_USAGE.md#options
[21] GitHub: https://github.com/KubeOperator/webkubectl/releases
[22] KubeOperator: https://github.com/KubeOperator/KubeOperator
[23] Kubernetes tips & tricks: удобные заготовки для kubectl: https://habr.com/ru/company/flant/blog/512762/
[24] Появилась консольная утилита kubelive для интерактивной работы с Kubernetes: https://habr.com/ru/company/flant/news/t/467433/
[25] kubebox и другие консольные оболочки для Kubernetes: https://habr.com/ru/company/flant/blog/426985/
[26] Источник: https://habr.com/ru/post/551182/?utm_source=habrahabr&utm_medium=rss&utm_campaign=551182
Нажмите здесь для печати.