GitLab runner in Kubernetes with Werf
https://habr.com/ru/articles/679826/
Интро
Сегодня хочу рассказать о связке GitLab + K8S + Werf и как с помощью него быстро собрать и задеплоить свое приложение в одну команду. Этот пост будет иметь формат мини-туториала.
Думаю большинство набредших на эту статью знают, что такое Gitlab и Kubernetes. Не знаете - гугл в помощь. В этой статье это out of scope.
Что такое Werf? Werf - это утилита, объединяющая CI/CD системы (типа Gitlab, Github Actions), docker и helm в одном флаконе и позволяющая одной командой собрать образ контейнера, запушить его в репозиторий контейнеров и задеплоить с помощью helm.
Итак, поехали.
Пост будет коротким и максимально сухим. Поделим его на две части:
Настройка окружения
Пример деплоя приложения
Приступим к первой части.
Настройка окружения
Надеюсь у вас уже есть Gitlab. Если нет, то разверните. У меня гитлаб развернут с помощью docker-compose.
O подключении Kubernetes к Gitlab
💡 Gitlab начиная с 15 версии объявил метод подключения K8S через сертификаты как deprecated и предлагает теперь единственный способ подключения кластеров через gitlab-agent и kubernetes agent server (он же kas). Подробнее тут.
Если у вас еще на подключен kubernetes agent server - подключайте так
То есть в gitlab.rb это будет просто gitlab_kas['enable'] = true
. Не забываем делать gitlab-ctl reconfigure
.
Kubernetes кластер нам тоже понадобится. Надеюсь, что он у вас тоже есть. Если нет - советую попробовать Managed Service For Kubernetes от Yandex.Cloud. Можно выбрать компактные, недорогие и к тому же вымещаемые (самые бюджетные) инстансы.
Теперь необходимо запустить gitlab-agent
для kubernetes. Для этого создаем репозиторий infra и теперь добавляем файл по пути:
Вместо group_id или project_id проставляем пути к проектам или группам, где этот kubernetes кластер будет доступен. Например для группы infra
и проекта my-group/my-app
это будет выглядеть так:
После этого идем в Infrastructure > Kubernetes Clusters > Connect a cluster, выбираем из выпадающего списка нужного агента. Gitlab покажет для установки gitlab-agent через helm. Выглядеть будет так:
Готово. Можете проверить gitlab-agent в Infrastructure > Kubernetes Clusters списке. Должно быть состоянии connected
.
Теперь установим в кластер kubernetes необходимые компоненты для работы Werf. В репозитории на Github я выложил манифесты для деплоя этих компонент (плюс там все для раскатки окружения). Эти манифесты я взял с официального сайта из этого раздела.
Если вы скачали репозиторий, то просто выполните
Дело за малым, осталось установить gitlab-runner.
В этом же репозитории values.yaml
файл для официального gitlab-runner. Чтобы добавить shared runner зайдите в Gitlab > Admin > Shared Runners > Register an instance runner. Скопируем registration token. Теперь в скопированном репозитории делаем
Проверяем, что раннер появился. Я специально поставил тег werf, чтобы вы потом не потерялись.
Окружение готово. На данном этапе у нас получается такая схема:
Деплой приложения
Установим werf локально к себе на компьютер. Это поможет в будущем быстрее разрабатывать приложения, смотеть рендер манифестов и работать с секретами helm.
Используем эту ссылку на официальный сайт.
Проверим версию
Создаем проект в Gitlab, называем my-app-werf (к примеру). Добавляем в проект файл werf.yaml
Если у вас монорепо для микросервисов, то werf без проблем с этим справится. werf.yaml
будет тогда выглядеть как-то так:
Для наглядности сделаем простой веб сервер на Go:
Напишем Dockerfile
Создаем шаблоны helm для деплоя по пути .helm/templates
:
Лично я использую nginx ingress с cert-manager поэтому в аннотациях указан cluster issuer.
Добавьте .dockerignore
чтобы не копировать лишнее и кешировать только нужное.
Остается вишенка на торте: gitlab CI/CD. Werf собирает все переменные окружения Gitlab и использует их при сборке и рендере манифестов. Плюс используется особый вид сборки, подробнее тут. Это опять же out of scope.
Пишем .gitlab-ci.yml
и удивляемся как компактно он выглядит
Одна команда werf converge
делает все разом: собирает docker образ, пушит в registry и деплоит приложение из собранного образа.
Предлагаю сверится по структуре проекта
Перед пушем можно проверить как будут выглядеть манифесты локально следующей командой.
Коммитим изменения, пушим. Вуаля! Так выглядит пайплайн в Gitlab CI/CD:
Скриншот уже закешированной сборки
У нас получилась такая схема:
Плюсы и минусы
Плюсы
Быстрое развертывание и простая интеграция.
Минусы
Нет поддержания конфигурации в актуальном состоянии как у ArgoCD
Откровенно говоря, ArgoCD и Werf могут друг друга дополнять. Подробности тут.
Last updated