Какая утилита чаще всего встречается в .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.
Читайте также в нашем блоге: