Поднимаем стенд Spring микросервисов в Kubernetes
Гайд для начинающих по поднятию домашнего стенда для экспериментов c k8s c базовым CI/CD для микросервисов Spring.
3К открытий4К показов
В статье будет описан процесс поднятия домашнего стенда для экспериментов c k8s, c базовым CI/CD для микросервисов Spring.
Автор: Александр Леонов, руководитель группы разработки одной из распределённых команд Usetech.
Дисклеймер Эта статья ориентирована на тех, кто не имеет полной картины разворачивания сервиса на инфраструктуре или является готовым шаблоном для быстрого поднятия своего стенда.
Код статьи c инструкцией установки доступен в репозиториях:
- https://github.com/alexandr-leonov/eda-configuration
- https://github.com/alexandr-leonov/eda-order-service
Итак, вам понадобилось обкатать какое-то решение на практике, но на работе это делать не разрешено/опасно/коллеги не поймут… Тогда самое время развернуть свой стенд для испытаний и экспериментами с инфраструктурой и сервисами.
Дано:
- Кластер на Kubernetes;
- Пару сервисов на Spring с PostgresSQL базой, кешом Redis и взаимодействием по Kafka и REST API;
- Аккаунт на Github (конечно, ближе к настоящей системе поднять свой Gitlab, но т. к. экспериментируем для себя и в одиночку, то Github достаточно);
- Аккаунт на DockerHub.
Найти:
Поднять у себя на локальной машине кластер k8s, который бы по пушу в Github деплоил на стенд необходимый сервис.
Решение:
Для начала поднимем свой кластер k8s. Для домашнего использования и экспериментов достаточно одного миникуба. Для этого установим его и запустим из терминала, с тем количеством памяти, которое вы можете позволить, но желательно не меньше 2‑х гигов.
Отлично, кластер мы подняли и запустили. Теперь создадим неймспейс наших сервисов. Пускай это будет Event Driven Architecture Develop — слишком долго, поэтому укоротим до eda-dev.
Создадим namespace.yaml с неймспейсом:
Применяем конфиг в k8s c помощью команды:
Теперь попробуем установить Postgress, но перед тем как искать нужный yml в документации, необходимо озаботиться тем, где будем хранить секреты. В этой статье не будем затрагивать тему Vault. Для начала используем стандартный механизм k8s для хранения секретов.
Оформим secret.yaml:
Запускаем той же командой:
Теперь найдём эталонный конфиг k8s для Postgres и модифицируем его под себя.
Итоговый файл postgres-cluster.yaml:
Здесь конфиг состоит из двух частей — самого сервиса и плана развёртывания этого сервиса, с указанием секретов и докер образа постгреса. Для экономии ресурсов выделим 1 реплику на БД.
Далее применяем yaml.
- zookeeper-cluster.yaml, устанавливающий zookeeper (если используете не самую последнюю версию Kafka);
- kafka-broker.yaml, устанавливает Kafka.
Исходный код:
- https://github.com/alexandr-leonov/eda-configuration/blob/master/dev/kafka/zookeeper-cluster.yaml
- https://github.com/alexandr-leonov/eda-configuration/blob/master/dev/kafka/kafka-broker.yaml
После применим наши конфиги по очереди — сначала zookeeper, потом Kafka.
Помимо установки стандартным путём, можно пойти другим путём, воспользовавшись helm чартами, готовыми сборками компонент, которые можно развернуть одной командой как есть или же переопределить какую-то часть пропертей в values.yaml.
Установим Redis через helm.
Для начала установим сам helm, в терминале Ubuntu это делается установкой snap пакета:
Далее добавим репозиторий с компонентами. Довольно распространены сборки компонент от компании Bitnami.
А теперь установим полноценный Redis, как есть с указанием неймспейса:
Готово! Установка helm с переопределением некоторых переменных на примере Mongo DB выглядит так:
Пример конфига переопределённых переменных.
Отлично, теперь напишем один из пары микросервисов. Пускай это будет сервис заказов, написанный с использованием Kotlin, Spring Boot, Webflux, Gradle. Так как написание такого сервиса не является целью этой статьи, то можно воспользоваться готовым кодом.
Теперь, когда код сервиса написан, осталось настроить его CI/CD в кластер Kubernetes. Для CI части будем использовать Github Actions, в то время как для CD части обычно используют Webhook. Однако представим, что у нас не белый ip и мы вообще не хотим предоставлять какие-то данные наружу и готовы пожертвовать частью удобств, дабы не увлечься и не сожрать лимиты бесплатного использования service registry, в качестве, которого будем использовать Docker Hub, настроим крон джобу, которая периодически будет обновлять стенд самыми новыми образами сервисов.
Итак, CI делаем на стороне order-service, сначала подготовим Dockerfile для образа приложения:
Затем, модифицируя стандартный github-ci конфиг, а также используя стандартные секреты Github для хранения логинов и паролей, получим:
Данный конфиг будет собирать образ и публиковать его Docker Hub при каждом пуше в мастер.
Настало время CD части.
Создадим order-service.yaml, который будет разворачивать наше приложение в k8s с заданными настройками:
Так как конфиги лежат в отдельной Github репе, то креды Docker Hub скрыты подобным образом. Однако при локальной работе их нужно будет заменить настоящими значениями. Значения вида $(POSTGRES_SERVICE_HOST) стандартные, их можно не менять.
Применим конфиг:
Готово, сервис пошёл тянуть образ из Docker Hub. Смотрим поды:
Ждём, когда сервис стартанёт.
Готово, сервис поднят, теперь можно стучаться к сваггеру. Для этого определим какой ip адрес у ноды k8s, а затем найдём порт, по которому доступно приложение:
Открываем сваггер:
В целом можно остановиться. Но, не каждый же раз руками вызывать деплой сервиса! Поэтому автоматизируем и этот процесс так, как договорились ранее.
Перед тем как создавать шедуллер джобу, надо отметить, что она должна выполняться, как системный процесс, а значит её необходимо наделить соответствующими правами, используя политику RBAC k8s.
Создадим конфиг прав для плана order-service-deployment — rights.yaml:
Теперь создадим джобу scheduler.yaml, которая будет каждые 4 часа обновлять order-service в кластере, если в Docker Hub появились новые образы.
Применим данные конфиги:
Ура! Мы развернули кластер с микросервисом Spring, с полноценным CI/CD процессом, познакомились с некоторыми сущностями k8s, helm и подняли тестовый стенд для экспериментов.
Если вам понравилась эта статья, то скоро выйдет продолжение, где мы рассмотрим более сложную работу микросервисов в Kubernetes с балансировкой через Spring Cloud Gateway, хранением конфигураций приложений в Spring Config Service, фиксированием инцидентов через Sentry.
3К открытий4К показов