Как использовать GitLab в качестве реестра Helm-чартов

С появлением GitLab 14.1 реестр пакетов Package Registry позволяет пользователям собирать, публиковать, устанавливать и делиться Helm-чартами (англ. chart).

Что такое Helm-чарт? 

Пакетный менеджер Helm использует пакеты под названием чарты. Чарт  —  это совокупность файлов, определяющих соответствующий набор ресурсов Kubernetes. Один такой чарт можно задействовать для развертывания как простого пода memcached, так и сложного полностекового веб-приложения с HTTP-серверами, базами данных, кэшами и т.д. 

Создание простого Helm-чарта 

Мы создадим простой Helm-чарт, передадим его в проект GitLab, упакуем и опубликуем в реестре пакетов GitLab Package Registry.

Сначала создаем проект GitLab, где будут храниться шаблоны чарта: 

После этого с помощью следующей команды создаем простой Helm-чарт на локальном компьютере: 

$ helm create example-chart

Требуется предварительная установка Helm на компьютере, иначе команда не сработает. 

Команда helm create создает директорию с общими файлами и каталогами, которые применяются в чарте. 

Вывод команды ls подтверждает создание всех необходимых файлов. Теперь отправляем их в проект GitLab helm-chart-example.

После успешной отправки файлов упаковываем директорию как Helm-чарт для хранения в реестре пакетов. Эта процедура выполняется либо командой helm package на компьютере, либо с помощью конвейера CI, предоставляемого GitLab. Рекомендую для упаковки и отправки Helm-чартов воспользоваться вторым вариантом.

Создание конвейера CI на GitLab

Перед созданием конвейера убедитесь, что во вкладке Visibility, project features, permissions (Видимость, функциональности проекта, разрешения) из разделов проекта SettingsGeneral активирована кнопка Packages:

Настройки проекта GitLab

На этом этапе нас ждет самое интересное  —  создание конвейера GitLab для упаковки и публикации Helm-чарта. Мы легко это сделаем в разделе проекта CI/CDEditor. Если вы ранее не работали с GitLab CI/CD, то данное обучающее руководство введет вас в курс дела. 

Конвейер выглядит следующим образом: 

Создание конвейера GitLab

Ниже представлен код конвейера. Проведем его построчный анализ: 

stages:
- package-publish

helm-package:
stage: package-publish
image:
name: alpine/helm:3.5.3
entrypoint: [""]
tags:
- minikube
variables:
CHART: example-chart
before_script:
- apk add git
- helm plugin install --version=v0.9.0 https://github.com/chartmuseum/helm-push.git
- >
helm repo add ${CHART}
--username ${CI_REGISTRY_USER}
--password ${CI_REGISTRY_PASSWORD}
${CI_API_V4_URL}/projects/${CI_PROJECT_ID}/packages/helm/stable
script:
- helm package ${CHART}
- helm push ${CHART}*.tgz ${CHART}
only:
refs:
- main
changes:
- example-chart/**/*

В верхней части файла задаем этапу stages имя package-publish, которое будет использовано в задаче helm-package. Ключевое слово tags отвечает за Gitlab-Runner (приложение, выполняющее задачи в конвейере). Поскольку в нашем случае приложение Gitlab-Runner установлено на собственном сервере в среде Minikube, то в проекте указывается соответствующий ему тег. 

Обратите внимание, что в своем конвейере вы указываете другие теги. 

Как видно, в коде присутствует переменная CHART, значение которой совпадает с именем созданного Helm-чарта. Эта переменная нужна исключительно для удобства и позволяет избежать многократного применения одного и того же имени. 

В разделе before_script устанавливаем зависимости: git и плагин helm-push. Следующий важный шаг  —  это аутентификация в реестре с помощью команды helm repo add, которая добавляет репозиторий Helm в командную оболочку Gitlab-Runner. Переменные CI_REGISTRY_USER, CI_REGISTRY_PASSWORD, CI_API_V4_URL и CI_PROJECT_ID являются специальными переменными GitLab CI/CD.

  • CI_REGISTRY_USER  —  имя пользователя для отправки контейнеров/чартов в реестр контейнеров/пакетов проекта GitLab. Задается только при активном режиме данного реестра в проекте. 
  • CI_REGISTRY_PASSWORD  —  пароль для отправки контейнеров/чартов в реестр контейнеров/пакетов проекта GitLab. Задается только при активном режиме данного реестра в проекте.
  • CI_API_V4_URL  —  корневой URL-адрес GitLab API v4.
  • CI_PROJECT_ID  —  ID текущего проекта. Этот ID уникален для всех проектов на экземпляре GitLab. 

В разделе script соответствующими командами Helm мы выполняем два действия: упаковку и отправку. Команда helm package упаковывает чарт в архивный файл с версией чарта. Команда helm push загружает чарт в реестр. 

Последний раздел определяет момент запуска задачи GitLab. Ключевое слово only.refs означает, что задача будет создана в случае любого коммита в главной ветке. Ключевое слово only.changes подразумевает, что задача будет создана и автоматически запущена при любых изменениях файлов в директории example-chart

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

Повышение версии чарта

Успешно зафиксировав изменения, переходим на вкладку CI/CD и проверяем состояние задачи.

Задача helm-package запущена

Кроме того, проверим Helm-чарт, который был отправлен в реестр пакетов под версией 0.1.1. 

example-chart сохранен в реестре пакетов GitLab

Заключение

Мы научились использовать GitLab Package Registry в качестве реестра чартов Helm. Храните, публикуйте и работайте с чартами наряду с манифестами Kubernetes. 

Читайте также:

Читайте нас в TelegramVK и Яндекс.Дзен


Перевод статьи Hayk Davtyan: Using GitLab As Helm Chart Registry

Предыдущая статьяОсновы разработки приложений: уровень клиента
Следующая статьяПоверхностное и глубокое копирование в JavaScript