Kubernetes پر چلنے والی ایپلیکیشنز کے ڈویلپرز کے لیے ٹولز

Kubernetes پر چلنے والی ایپلیکیشنز کے ڈویلپرز کے لیے ٹولز

Современный подход к эксплуатации решает множество насущных проблем бизнеса. Контейнеры и оркестраторы позволяют легко масштабировать проекты любой сложности, упрощают релизы новых версий, делают их более надежными, но вместе с тем создают и дополнительные проблемы для разработчиков. Программиста, в первую очередь, заботит его код: архитектура, качество, производительность, элегантность, — а не то, как он поедет в 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.

Инструмент прост и эффективен, так что может пригодиться каждому разработчику. Подробнее о нём мы писали в علیحدہ مضمون.

ٹیلیفینس

  • جوہر: перенеси приложение на свой компьютер. Разрабатывай и отлаживай локально.
  • سائٹ; 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.

اسکواش

  • جوہر: отлаживай процессы прямо в кластере.
  • 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 Kubernetes میں CI/CD کے لیے ہمارا ٹول ہے۔'.

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 پر چلنے والی ایپلیکیشنز کے ڈویلپرز کے لیے ٹولز
Архитектура и основные этапы работы с DevSpace

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

سکافولڈ

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

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

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

  • Отслеживать изменения исходного кода.
  • Синхронизировать его с контейнером pod’а, если он не требует сборки.
  • Собирать контейнеры с кодом, если ЯП — интерпретируемый, или же компилировать артефакты и упаковывать их в контейнеры.
  • Получившиеся образы автоматически проверять с помощью کنٹینر ساخت کا ٹیسٹ.
  • Тегировать и загружать образы в Docker Registry.
  • Разворачивать приложение в кластере, используя kubectl, Helm или kustomize.
  • Делать проброс портов.
  • Отлаживать приложения, написанные на Java, Node.js, Python.

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

Сборка Docker-контейнеров может осуществляться локально или удаленно: в گوگل کلاؤڈ بلڈ или в кластере с помощью کانیکو. Также поддерживаются Bazel и Jib Maven/Gradle. Для тегирования Skaffold поддерживает множество стратегий: по git commit hash, дате/времени, sha256-сумме исходников и т.п.

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

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

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

Kubernetes پر چلنے والی ایپلیکیشنز کے ڈویلپرز کے لیے ٹولز
Основные этапы работы Skaffold

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

گارڈن

  • سائٹ; 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 پر چلنے والی ایپلیکیشنز کے ڈویلپرز کے لیے ٹولز
Панель для Garden

Есть у этого инструмента и режим hot-reload, который просто синхронизирует изменения скриптов с контейнером в кластере, многократно ускоряя процесс отладки приложения. У Garden хорошая دستاویزات и неплохой набор примеров, позволяющих быстро освоиться и начать пользоваться. Кстати, совсем недавно мы публиковали مضمون کا ترجمہ от его авторов.

حاصل يہ ہوا

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

PS

ہمارے بلاگ پر بھی پڑھیں:

ماخذ: www.habr.com

نیا تبصرہ شامل کریں