Инструменты для разработчиков приложений, запускаемых в Kubernetes

в 6:47, , рубрики: devops, DevSpace, garden, kubernetes, Skaffold, telepresence, Блог компании Флант, микросервисы, Программирование

Инструменты для разработчиков приложений, запускаемых в Kubernetes - 1

Современный подход к эксплуатации решает множество насущных проблем бизнеса. Контейнеры и оркестраторы позволяют легко масштабировать проекты любой сложности, упрощают релизы новых версий, делают их более надежными, но вместе с тем создают и дополнительные проблемы для разработчиков. Программиста, в первую очередь, заботит его код: архитектура, качество, производительность, элегантность, — а не то, как он поедет в Kubernetes и как его тестировать и отлаживать после внесения даже минимальных правок. Посему весьма закономерно и то, что активно развиваются инструменты для Kubernetes, помогающие решать проблемы даже самых «архаичных» разработчиков и позволяя им сосредоточиться на главном.

В этом обзоре представлена краткая информация о некоторых инструментах, которые упрощают жизнь программисту, чей код крутится в pod’ax Kubernetes-кластера.

Простые помощники

Kubectl-debug

  • Суть: добавь свой контейнер в Pod и посмотри, что в нем происходит.
  • GitHub.
  • Краткая статистика GH: 715 звёзд, 54 коммита, 9 контрибьюторов.
  • Язык: Go.
  • Лицензия: Apache License 2.0.

Этот плагин для kubectl позволяет создать внутри интересующего pod'a дополнительный контейнер, который будет делить пространство имен процессов с остальными контейнерами. В нем можно производить отладку работы pod'а: проверить работу сети, послушать сетевой трафик, сделать strace интересующего процесса и т.п.

Также можно переключиться в контейнер процесса, выполнив chroot /proc/PID/root — это бывает очень удобно, когда нужно получить root shell в контейнере, для которого в манифесте выставлен securityContext.runAs.

Инструмент прост и эффективен, так что может пригодиться каждому разработчику. Подробнее о нём мы писали в отдельной статье.

Telepresence

  • Суть: перенеси приложение на свой компьютер. Разрабатывай и отлаживай локально.
  • Сайт; GitHub.
  • Краткая статистика GH: 2131 звезда, 2712 коммитов, 33 контрибьютора.
  • Язык: Python.
  • Лицензия: Apache License 2.0.

Идея этой оснастки заключается в запуске контейнера с приложением на локальном пользовательском компьютере и проксировании всего трафика из кластера в него и обратно. Такой подход позволяет вести разработку локально, просто изменяя файлы в своей любимой IDE: результаты будут доступны сразу же.

Плюсы локального запуска — удобство правок и моментальный результат, возможность отлаживать приложение привычным способом. Из минусов — требовательность к скорости соединения, что особенно заметно, когда приходится работать с приложением с достаточно высоким RPS и трафиком. Кроме того, у Telepresence есть проблемы с volume mounts в Windows, что может стать решающим ограничителем для разработчиков, привыкшим к этой ОС.

Мы уже делились своим опытом использования Telepresence здесь.

Ksync

  • Суть: почти мгновенная синхронизация кода с контейнером в кластере.
  • GitHub.
  • Краткая статистика GH: 555 звёзд, 362 коммита, 11 контрибьюторов.
  • Язык: Go.
  • Лицензия: Apache License 2.0.

Утилита позволяет синхронизировать содержимое локальной директории с каталогом контейнера, запущенного в кластере. Такой инструмент отлично подойдет для разработчиков на скриптовых языках программирования, основная проблема у которых — доставить код в работающий контейнер. Ksync призван снять эту головную боль.

При однократной инициализации командой ksync init в кластере создается DaemonSet, который используется для отслеживания состояния файловой системы выбранного контейнера. На своем локальном компьютере разработчик запускает команду ksync watch, которая следит за конфигурациями и запускает syncthing, осуществляющую непосредственную синхронизацию файлов с кластером.

Остается проинструктировать ksync, что и с чем синхронизировать. Например, такая команда:

ksync create --name=myproject --namespace=test --selector=app=backend --container=php --reload=false /home/user/myproject/ /var/www/myproject/

… создаст watcher с именем myproject, который будет искать pod с меткой app=backend и пытаться синхронизировать локальную директорию /home/user/myproject/ с каталогом /var/www/myproject/ у контейнера под названием php.

Проблемы и примечания по ksync из нашего опыта:

  • На узлах Kubernetes-кластера должна использоваться overlay2 в качестве storage driver для Docker. Ни с какими другими утилита работать не будет.
  • При использовании Windows в качестве ОС клиента возможна некорректная работа watcher'а файловой системы. Данный баг замечен при работе с крупными каталогами — с большим количеством вложенных файлов и директорий. Мы создали соответствующий issue в проекте syncthing, но прогресса по нему пока (с начала июля) нет.
  • Используйте файл .stignore для того, чтобы указать пути или шаблоны файлов, которые не нужно синхронизировать (например, каталоги app/cache и .git).
  • По умолчанию ksync будет перезагружать контейнер при каждом изменении файлов. Для Node.js это удобно, а для PHP — совершенно излишне. Лучше выключить opcache и использовать флаг --reload=false.
  • Конфигурацию можно всегда исправить в $HOME/.ksync/ksync.yaml.

Squash

  • Суть: отлаживай процессы прямо в кластере.
  • GitHub.
  • Краткая статистика GH: 1154 звёзд, 279 коммитов, 23 контрибьютора.
  • Язык: Go.
  • Лицензия: Apache License 2.0.

Данный инструмент предназначен для отладки процессов непосредственно в pod'ах. Утилита проста и в интерактивном режиме позволяет выбрать нужный отладчик (см. ниже) и namespace + pod, в процесс которого нужно вмешаться. В настоящее время поддерживаются:

  • delve — для приложений на Go;
  • GDB — через target remote + проброс порта;
  • проброс порта JDWP для отладки Java-приложений.

Со стороны IDE поддержка есть лишь в VScode (с помощью расширения), однако в планах на текущий (2019) год значатся Eclipse и Intellij.

Для отладки процессов Squash запускает на узлах кластера привилегированный контейнер, поэтому необходимо сперва ознакомиться с возможностями безопасного режима во избежание проблем с безопасностью.

Комплексные решения

Переходим к тяжелой артиллерии — более «масштабным» проектам, призванным сразу закрыть многие потребности разработчиков.

NB: В этом списке, безусловно, есть место и нашей Open Source-утилите werf (ранее известной как dapp). Однако мы уже не раз писали и рассказывали о ней, а посему решили не включать в обзор. Для желающих ознакомиться с её возможностями поближе рекомендуем прочитать/послушать доклад «werf — наш инструмент для CI/CD в Kubernetes».

DevSpace

  • Суть: для тех, кто хочет начать работать в Kubernetes, но не хочет глубоко залезать в его дебри.
  • GitHub.
  • Краткая статистика GH: 630 звёзд, 1912 коммитов, 13 контрибьюторов.
  • Язык: Go.
  • Лицензия: Apache License 2.0.

Решение от одноименной компании, предоставляющей managed-кластеры с Kubernetes для командной разработки. Утилита была создана для коммерческих кластеров, однако отлично работает и с любыми другими.

При запуске команды devspace init в каталоге с проектом вам предложат (в интерактивном режиме):

  • выбрать рабочий Kubernetes-кластер,
  • использовать имеющийся Dockerfile (или сгенерировать новый) для создания контейнера на его базе,
  • выбрать репозиторий для хранения образов контейнеров и т.д.

После всех этих подготовительных действий можно начинать разработку, выполнив команду devspace dev. Она соберёт контейнер, загрузит его в репозиторий, выкатит deployment в кластер и запустит проброс портов и синхронизацию контейнера с локальным каталогом.

Опционально будет предложено перейти терминалом в контейнер. Отказываться не стоит, потому как в реальности контейнер стартует с командой sleep, а для реального тестирования приложение требуется запускать вручную.

Наконец, команда devspace deploy выкатывает приложение и связанную с ним инфраструктуру в кластер, после чего все начинает функционировать в боевом режиме.

Вся конфигурация проекта хранится в файле devspace.yaml. Помимо настроек окружения для разработки в нем же можно найти описание инфраструктуры, похожее на стандартные манифесты Kubernetes, только сильно упрощенные.

Инструменты для разработчиков приложений, запускаемых в Kubernetes - 2
Архитектура и основные этапы работы с DevSpace

Кроме того, в проект легко добавить предопределенный компонент (например, СУБД MySQL) или Helm-чарт. Подробнее читайте в документации — она несложная.

Skaffold

  • Сайт; GitHub.
  • Краткая статистика GH: 7423 звезды, 4173 коммита, 136 контрибьюторов.
  • Язык: Go.
  • Лицензия: Apache License 2.0.

Эта утилита от Google претендует на то, чтобы покрыть все потребности разработчика, чей код так или иначе будет запускаться в кластере Kubernetes. Начать пользоваться им не так просто, как devspace'ом: никакой интерактивности, определения языка и автосоздания Dockerfile здесь вам не предложат.

Впрочем, если это не пугает — вот что позволяет делать Skaffold:

  • Отслеживать изменения исходного кода.
  • Синхронизировать его с контейнером pod'а, если он не требует сборки.
  • Собирать контейнеры с кодом, если ЯП — интерпретируемый, или же компилировать артефакты и упаковывать их в контейнеры.
  • Получившиеся образы автоматически проверять с помощью container-structure-test.
  • Тегировать и загружать образы в Docker Registry.
  • Разворачивать приложение в кластере, используя kubectl, Helm или kustomize.
  • Делать проброс портов.
  • Отлаживать приложения, написанные на Java, Node.js, Python.

Workflow в различных вариациях декларативно описывается в файле skaffold.yaml. Для проекта можно также определить несколько профилей, в которых частично или полностью изменять стадии сборки и деплоя. Например, для разработки указать удобный для разработчика базовый образ, а для staging и production — минимальный (+ использовать securityContext у контейнеров или же переопределить кластер, в котором приложение будет развернуто).

Сборка Docker-контейнеров может осуществляться локально или удаленно: в Google Cloud Build или в кластере с помощью Kaniko. Также поддерживаются Bazel и Jib Maven/Gradle. Для тегирования Skaffold поддерживает множество стратегий: по git commit hash, дате/времени, sha256-сумме исходников и т.п.

Отдельно стоит отметить возможность тестирования контейнеров. Уже упомянутый фреймворк container-structure-test предлагает следующие методы проверки:

  • Выполнение команд в контексте контейнера с отслеживанием exit-статусов и проверкой текстового «выхлопа» команды.
  • Проверка наличия файлов в контейнере и соответствия атрибутов указанным.
  • Контроль содержимого файлов по регулярным выражениям.
  • Сверка метаданных образа (ENV, ENTRYPOINT, VOLUMES и т.п.).
  • Проверка совместимости лицензий.

Синхронизация файлов с контейнером осуществляется не самым оптимальным способом: Skaffold просто создает архив с исходниками, копирует его и распаковывает в контейнере (должен быть установлен tar). Поэтому, если ваша основная задача — в синхронизации кода, лучше посмотреть в сторону специализированного решения (ksync).

Инструменты для разработчиков приложений, запускаемых в Kubernetes - 3
Основные этапы работы Skaffold

В целом же инструмент не позволяет абстрагироваться от Kubernetes-манифестов и не имеет какой-либо интерактивности, поэтому может показаться сложным для освоения. Но в этом же и его плюс — большая свобода действий.

Garden

  • Сайт; GitHub.
  • Краткая статистика GH: 1063 звезды, 1927 коммитов, 17 контрибьюторов.
  • Язык: TypeScript (планируется разбить проект на несколько компонентов, некоторые из которых будут на Go, а также сделать SDK для создания дополнений на TypeScript/JavaScript и Go).
  • Лицензия: Apache License 2.0.

Как и Skaffold, Garden нацелен на автоматизацию процессов доставки кода приложения в K8s-кластер. Для этого сперва необходимо описать структуру проекта в YAML-файле, после чего запустить команду garden dev. Она сделает всю магию:

  • Соберет контейнеры с различными частями проекта.
  • Проведет интеграционные и unit-тесты, если таковые были описаны.
  • Выкатит все компоненты проекта в кластер.
  • В случае изменения исходного кода — заново запустит весь пайплайн.

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

Модулем проекта может быть контейнер, Maven-контейнер, Helm-чарт, манифест для kubectl apply или даже OpenFaaS-функция. Причем любой из модулей можно подтянуть из удаленного Git-репозитория. Модуль может определять (а может и нет) сервисы, задачи и тесты. Сервисы и задачи могут иметь зависимости, благодаря чему можно определить последовательность деплоя того или иного сервиса, упорядочить запуск заданий и тестов.

Garden предоставляет пользователю красивый dashboard (пока в экспериментальном состоянии), в котором отображается граф проекта: компоненты, последовательность сборки, выполнения задач и тестов, их связи и зависимости. Прямо в браузере можно просмотреть и логи всех компонентов проекта, проверить, что выдает тот или иной компонент по HTTP (если, конечно, для него объявлен ресурс ingress).

Инструменты для разработчиков приложений, запускаемых в Kubernetes - 4
Панель для Garden

Есть у этого инструмента и режим hot-reload, который просто синхронизирует изменения скриптов с контейнером в кластере, многократно ускоряя процесс отладки приложения. У Garden хорошая документация и неплохой набор примеров, позволяющих быстро освоиться и начать пользоваться. Кстати, совсем недавно мы публиковали перевод статьи от его авторов.

Заключение

Разумеется, данным списком инструментарий для разработки и отладки приложений в Kubernetes не ограничивается. Существует еще много весьма полезных и практичных утилит, достойных если не отдельной статьи, то — как минимум — упоминания. Расскажите, чем пользуетесь вы, с какими проблемами вам доводилось сталкиваться и как вы их решали!

P.S.

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

Автор: Vadim Lazovskiy

Источник

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js