Какая утилита чаще всего встречается в .bash_history SRE/DevOps-инженера, работающего с Kubernetes? Конечно, kubectl. Это привело к тому, что в сообществе нашлось вдохновение для тех, захотел её улучшить, принести новый опыт использования или даже создать некие производные, нацеленные на более удобное взаимодействие. В рамках этого обзора рассмотрены три таких проекта, которые, возможно, покажутся интересными и вам — или хотя бы откроют какие-то новые подходы в решении типовых задач.

1. fubectl

Для начала посмотрим на 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).

Как работает kex в fubectl
Как работает kex в fubectl

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

Последний приятный нюанс: благодаря уже упомянутой fzf в утилиту повсеместно встроен механизм fuzzy-поиска, который упрощает ввод команд.

Опыт использования: Из простого source-файла мы получаем весьма функциональное и удобное решение, к которому быстро привыкаешь и открываешь для себя новые возможности.

2. Kubelive

Утилита создана с целью упрощения вывода 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

Это решение иного толка: оно позволяет работать с 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.

Читайте также в нашем блоге:

Комментарии (5)