VK Cloud

Как развернуть GitLab в Kubernetes: своя площадка для кода и сборок

5 ноября 2026 г.
Станислав Погоржельский2.png
Станислав Погоржельский
Автор статьи
blog_head_39_69.png

GitLab в Kubernetes устанавливается официальным Helm-чартом. Helm это пакетный менеджер Kubernetes, он ставит приложения чартами, пакетами манифестов с настройками. Манифест это описание объекта кластера в YAML, кластер это группа серверов под управлением Kubernetes. Чарт даёт штатный способ развернуть контейнерную установку системы в собственном кластере, в том числе в управляемом кластере VK Cloud (сервис Managed Containers). Порядок установки расписан в разделах Prepare to deploy и Deploy официальной документации GitLab Helm chart. В результате у команды появляется своя площадка с репозиториями, задачами и сборочным конвейером CI/CD, которая работает в вашем облаке и подчиняется вашим правилам.

Свой GitLab разворачивают, когда код не должен покидать контур компании, сборкам нужны свои мощности без очередей, а доступами хочется управлять из собственного каталога пользователей. Для компаний с требованиями по защите информации свой GitLab в российском облаке закрывает ещё и вопрос расположения данных.

Что понадобится до начала: кластер Kubernetes с запасом ресурсов, доменное имя для веб-интерфейса, внешние PostgreSQL и Redis (хранилище данных в памяти для кэша и очередей) и объектное хранилище (облачное хранилище файлов по протоколу S3). Чарт умеет поднять PostgreSQL и Redis внутри кластера, но документация чарта прямо требует внешние сервисы и объектное хранилище, а для production советует референсную архитектуру под ваше число пользователей, где за пределы кластера при любом размере установки выносится и Gitaly, хранилище репозиториев.

Шесть шагов до работающего GitLab

1. Готовим кластер с запасом.

GitLab состоит из набора сервисов: веб-интерфейс, очередь задач, хранилище репозиториев. Требования к ресурсам берите из раздела Prepare to deploy документации чарта, там названы минимальные ядра и память для кластера, под сборки добавляйте сверху. Создайте кластер в личном кабинете VK Cloud (инструкция) и размер группы worker-узлов (серверов кластера, на которых работают контейнеры) сверьте с требованиями из документации чарта.

2. Разворачиваем зависимости.

PostgreSQL и Redis создаём в сервисе управляемых баз Cloud Databases (инструкция), версии и параметры берите из требований текущей версии чарта. Адреса и учётные данные затем уходят в параметры установки, а встроенные в чарт копии отключаются.

3. Подключаем объектное хранилище.

GitLab складывает в хранилище по протоколу S3 артефакты сборок, LFS-объекты (большие файлы Git вне репозитория), загрузки, пакеты, реестр образов (хранилище контейнерных образов) и резервные копии. По документации по внешнему объектному хранилищу под каждый тип данных заводится отдельный бакет, именованное хранилище файлов, а общий бакет на всё ломает восстановление из резервной копии. В VK Cloud для этого создаётся аккаунт с ключами Access Key ID и Secret Key и набор бакетов (быстрый старт VK Object Storage), реквизиты прописываются в параметрах чарта.

4. Ставим Helm-чарт.

Добавляете репозиторий чартов GitLab и задаёте параметры установки: домен, издателя сертификатов, классы хранения (типы дисков для томов кластера), адреса базы, Redis и бакетов. Встроенные в чарт ingress-nginx и cert-manager отключаем в параметрах установки и указываем класс Ingress (имя контроллера, который будет вести трафик) и объект ClusterIssuer от аддонов VK Cloud, о них следующий шаг. Конкретные команды и значения берите из документации чарта, они меняются от версии к версии, поэтому сверяйтесь с первоисточником, а не со статьями.

5. Открываем доступ.

Доменное имя направляем на балансировщик аддона Ingress NGINX, облачную точку входа трафика с внешним IP. Аддон это дополнительный компонент кластера из личного кабинета, а этот аддон принимает HTTP-трафик по доменным именам (установка). GitLab поднимает несколько поддоменов (gitlab, registry, kas), поэтому на балансировщик направляется wildcard-запись домена, запись DNS сразу на все поддомены. Сертификаты выпускает cert-manager с настроенным объектом ClusterIssuer, настройками удостоверяющего центра (установка).

6. Запускаем сборки.

GitLab Runner работает в том же кластере и выполняет задачи конвейера в отдельных подах, единицах запуска контейнеров. Когда сборок становится больше, группа узлов расширяется вертикально (машины покрупнее) или горизонтально (больше машин), в том числе автоматически (масштабирование узлов кластера).

На схеме ниже контур целиком: разработчики отправляют код в GitLab через Ingress, внутри кластера рядом с GitLab работают поды GitLab Runner со сборками, артефакты и образы уходят в бакеты объектного хранилища по S3. База и Redis стоят за пределами кластера в Cloud Databases, поэтому на схеме их нет.

Пять ошибок при установке

1. Кластер впритык. GitLab стартует, а первая же параллельная сборка упирается в нехватку ресурсов, и очередь задач начинает расти. Запас под сборки считается как лимит ресурсов одной задачи Runner, умноженный на число одновременных сборок. Закладывается он при создании кластера, а не после жалоб команды.

2. База и Redis внутри чарта на боевой установке. Встроенные копии удобны для проверки, но у них нет резервных копий, реплик и обновлений на стороне облака. Переезд на внешние сервисы потом означает миграцию данных под нагрузкой, дешевле начать с Cloud Databases.

3. Артефакты во встроенном MinIO чарта или в одном бакете. Встроенный MinIO живёт на одном томе фиксированного размера, и он заканчивается в самый неудобный момент, а восстановление из резервной копии при общем бакете работает некорректно. Объектное хранилище с отдельными бакетами подключается сразу, на третьем шаге, пока данных мало и перенос дешёвый.

4. Runner без ограничений. Сборки без лимитов процессора и памяти вытесняют сам GitLab с его же узлов. Лимиты задаются в настройках Runner, значения подбираются по замеру реальной сборки проекта.

5. Обновление вслепую. Порядок обновления меняется от версии к версии, поэтому перед сменой версии чарта читаются замечания к выпуску в документации GitLab, а обновление сначала прогоняется на тестовой установке.

Частые вопросы

1. Потянет ли кластер из двух worker-узлов?

Закладывайте узлы по требованиям из документации чарта и оставляйте запас под сборки. При нескольких параллельных сборках конвейер потребляет больше, чем сам GitLab.

2. Можно ли разнести GitLab и сборки?

Да, схема такая: сам GitLab работает где угодно, а в Kubernetes остаются только Runner и сборочные поды. Так кластер отдаётся под его прямое назначение, под масштабируемые задачи.

3. Зачем внешнее объектное хранилище, если чарт поднимает своё?

Артефакты и образы растут с каждой сборкой, а у тома в кластере размер фиксирован, бакет же расширяется сам и к кластеру не привязан.

4. Как обновлять GitLab?

Командой helm upgrade с новой версией чарта, порядок и предупреждения по версиям собраны в документации GitLab.

5. Нужен ли отдельный кластер под GitLab?

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

Короче говоря для заметки:

  1. Штатный путь: официальный Helm-чарт, параметры и команды из документации GitLab, под production внешние PostgreSQL, Redis и объектное хранилище.

  2. Домен и сертификаты закрывают аддоны Ingress NGINX и cert-manager, как и для любого сервиса в кластере.

  3. Артефакты, образы и резервные копии уводим в объектное хранилище по S3, отдельный бакет на каждый тип данных.

  4. Сборки масштабируются вместе с группой worker-узлов, вплоть до автоматического расширения.

Оставьте заявку, чтобы получить консультацию

Наши специалисты свяжутся с вами в ближайшее время и ответят на все вопросы.

section_subscribe_2x_9ab2d878a6_ac1afd4471_aed1c6d636.png

            Узнавайте о выходе новых статей в блоге первыми!

            Будем держать в курсе новостей и облачных трендов

            section-subscribe_2x.png
              section-subscribe_2x.png
              Ссылка скопирована
              Поделиться

              Почитать по теме

              _blog_head_20.png
              10 сентября

              Git rebase vs merge: в чём разница и когда что использовать

              40+ готовых сервисов