Найти тему

Публикация Helm Chart в S3 или Harbor

Оглавление

Доброго времени суток, дорогой читатель! В этой статье, мы не будем подробно говорить о том, что такое HELM CHART и как с ним работать, предполагается, что вы с ним уже знакомы, хотя бы частично. В этом материале, мы будем говорить о том, как настроить публикацию собранных Helm Chart в S3 или Harbor.

Задача которую решаем.

Имея Gitlab и настраивая CI/CD процессы, нам необходимо собирать и публиковать сборки Helm Charts во внешнее хранилище.

Важно: все эксперименты мы будем проводить на российском облаке от VK Cloud Solutions. Если, статья зайдет, то в дальнейшем, повторим эксперимент на Yandex Cloud.

Начинаем, настройка S3 репозитория

Сначала, мы будем настраивать S3 репозиторий. Итак, вот что должно быть:

  1. На Gitlab Runner должен быть установлен Helm
  2. Поставим Helm s3 plugin
  3. Обойдем ограничения коннекта к Amazon
  4. Инициализируем и подключим репозиторий

Первое, что нам необходимо сделать, это создать S3 хранилище для наших HELM репозиториев

Раздел для создания S3 совместимого хранилища
Раздел для создания S3 совместимого хранилища

Для начала работ, нам необходимо создать Bucket. Название нашего Bucket будет helm, тип хранилища IceBox, и по умолчанию он будет приватный.

Создание Bucket
Создание Bucket

После того, как Bucket будет создан, необходимо настроить аккаунт для авторизации.

Пример создания аккаунта S3
Пример создания аккаунта S3

Скопируйте Access Key Id и Secret Key, они вам понадобиться немного позже.

Теперь необходимо зайти на наш Gitlub Runner, где уже установлен Helm и поставим расширение S3 от амазона, сконфигурировать его. Затем установить Helm S3.

Первым делом, нужно поставить и сконфигурировать S3. Делается это несколькими командами командами

curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip"
unzip awscliv2.zip
sudo ./aws/install

После чего, необходимо его сконфигурировать командой aws configure. В процессе конфигурации вам будут заданы вопросы, по конфигуарции на которые необходимо ответить:

  1. Access Key - выдается Vk Cloud
  2. Secret Key - выдается VK CLoud
  3. Region - ru-msk
  4. Output format - json

После этого, в вашем файле .bashrc нужно добавить строчку

alias aws='aws --endpoint-url https://ib.bizmrg.com'
  1. https://hb.bizmrg.com — для класса хранения Hotbox.
  2. https://ib.bizmrg.com — для класса хранения Icebox.

После чего, можно попробовать создать backet, чтобы убедиться что все работает (Обращаю внимание, что имя должно быть уникально в рамкой всей платформы, а не конкретно Вашего проекта.)

$ aws s3api create-bucket --bucket helm-lsk
{
"Location": "/helm-lsk"
}

Ура, S3 работает, настала очередь HELM.

$ helm plugin install https://github.com/hypnoglow/helm-s3.git
Downloading and installing helm-s3 v0.14.0 ...
Checksum is valid.
Installed plugin: s3

Далее необходимо провести настройки доступа к нашему bucket для HELM. Приступим.... Для начала, давайте создадим отдельный ключ для нашего bucket & helm, перейдя в соответствующий раздел.

Настройка ключей бакета
Настройка ключей бакета

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

Настройка уровня доступа к репозиорию.
Настройка уровня доступа к репозиорию.

После того, как это сделано, стоит обратить на readme к Helm S3, там четко указано, какие переменные и для чего мы можем использовать в нашем окружении.

GitHub - hypnoglow/helm-s3: ⎈ Helm plugin that allows to set up a chart repository using AWS S3.

Теперь, когда все понятно и прозрачно, мы можем и должны сделать такой конфигурационный файл для нашего helm. У меня он будет называться .helm.env и лежать в домашней директории gitlub-runner пользователя.

export AWS_ENDPOINT=ib.bizmrg.com
export AWS_DEFAULT_REGION=ru-msk
export AWS_SECRET_ACCESS_KEY= <ваш ключ>
export AWS_ACCESS_KEY_ID= <ваш ключ>

После чего, можно провести инициализацию HELM репозитория.

source ~/.helm.env
helm s3 init s3://helm-lsk/charts --acl="bucket-owner-full-control"

Обратил бы внимание на особенность VK Cloud , передавать acl в команде или задать ее как ENV переменную необходимо в обязательном порядке. Иначе будет ошибка:

helm s3 init s3://helm-lsk/charts
Error: upload index to s3: upload index to S3 bucket: NoSuchAcl: The specified acl does not exist
status code: 403, request id: , host id:
Error: plugin "s3" exited with error

Gitlab CI & Helm S3

Как же будет выглядеть шаг нашего CI? На самом деле ничего особенного...

helm_s3:
stage: deploy
script:
- source ~/.helm.env
- helm package --app-version=${VERSION} --version=${VERSION} ./devenv/charts/$CI_PROJECT_NAME
- helm s3 push $CI_PROJECT_NAME-${VERSION}.tgz lsk --force
only:
- master
- stage
tags:
- build

Продолжаем, Harbor

Есть еще вариант, мы можем использовать решение Harboor. Вот здесь нужно немного подробнее остановиться, что же такое Harbor?

Harbor - это реестр с открытым исходным кодом, который защищает артефакты с помощью политик и управления доступом на основе ролей, гарантирует, что образы при загрузке сканируются и не содержат уязвимостей, а также подписывает образы как надежные.

Однако ошибочно думать, что Harboor предназначен только для Docker образов. Помимо этого, он вполне может выступать в качестве репозитория Helm Charts при использовании дополнения Chart Museum.

Установка и настройка в Vk Cloud

Разворот Harbor на облаках VK Cloud довольно прост, достаточно просто перейти в маркет приложений и нажать установить.

Выбор и установка Docker Registry c Harbor в один клик
Выбор и установка Docker Registry c Harbor в один клик

После установки, в настройках предустановленных приложений появится виртуальная машина с установленным Harbor, который сразу же будет доступен по IP адресу машины.

Однако, все было бы слишком хорошо, если бы было так гладко. Ни Docker Registry (который мы рассмотрим в следующей статье), ни Helm Package Registry не будут работать без https. Это означает, что необходимо выполнить 2 вещи:

  1. Сгенерировать сертификаты для домена (Lets Encrypt) или купить
  2. Настроить Harbor

Мы будем исходить из того, что сертификат уже у вас на руках. Вам необходимо подключиться по ssh на машину Harbor, создать в удобной директории папку SSL и внутри нее положить 2 файла: файл сертификата; файл приватного ключа.

Ну а теперь, необходимо настроить Harbor, что мы сейчас и сделаем.

Для начала нужно найти, где находиться файл настроек harbor.yml

sudo find / -name harbor.yml

После того, как файл будет найден, необходимо настроить домен и сертификаты

hostname: your-domain.ru
http:
port: 80
https:
port: 443
certificate: /home/your_path/your_file.crt
private_key:
/home/your_path/your_file.key

После того, как все настройки внесены, необходимо просто перегрузить harbor

sudo docker-compose down -v
sudo ./prepare --with-notary --with-chartmuseum
sudo docker-compose up -d

Если вдруг забыли, то команды перезапуска необходимо запускать из той же директории где находиться файл harbor.yml

Авторизация и создание проекта

Что же касается авторизации, то все предельно просто. В вашей панели администратора Vk Cloud, будет выведена конфигурация вашей машины harbor, а также вы сможете найти логин и пароль администратора.

После этого, вам необходимо открыть https://harbor.your-domain.ru и ввести этот логин и пароль, сразу после этого вы попадете внутрь.

Управление пользователями Harbor
Управление пользователями Harbor

Находясь внутри, настоятельно рекомендую, первым делом создать пользователя для работы с вашими k8s сценариями: сборка docker, публикация helm chart и.т.д.

Вторым этапом, нужно добавить проект (в нашем сценарии он должен называться также как и репозиторий в GitLab)

Создание проекта
Создание проекта

После создания проекта, необходимо дать права только что созданному пользователю, на вкладке members, внутри проекта.

Даем права
Даем права

Gitlab CI & Harbor

Теперь, давайте настроим непосредственно сборку и публикацию наших Helm Charts в Harbor

helm:
stage: helm
variables:
IMAGE_TAG: $CI_PROJECT_NAME:$CI_COMMIT_SHORT_SHA
script:
- helm registry login "$REGISTRY_URL" -u "$HARBOR_LOGIN" -p "$HARBOR_PASSWORD"
- helm package --app-version=${HELM_VERSION} --version=${HELM_VERSION} ./templates/chart
- helm push $CI_PROJECT_NAME-${HELM_VERSION}.tgz oci://$REGISTRY_URL/$CI_PROJECT_NAME
tags:
- k8s

Разберемся с тем, что здесь происходит:

IMAGE_TAG: $CI_PROJECT_NAME:$CI_COMMIT_SHORT_SHA - мы настраиваем тег для нашего HELM пакета. В данном случае он состоит из имени репозитория и хэша коммита в гитлабе.

helm registry login "$REGISTRY_URL" -u "$HARBOR_LOGIN" -p "$HARBOR_PASSWORD" - на этой строчке, мы авторизуемся в Harbor, используя переменные конфигурации заданные в гитлабе.

helm package --app-version=${HELM_VERSION} --version=${HELM_VERSION} ./templates/chart - на данной строчке, происходит сборка пакета, он будет собран в формат zip. Вот тут стоит обратить внимание на HELM_VERSION, дело в том, что у HELM есть четкие правила к написанию версии пакета, поэтому я задаю его так

before_script:
- export HELM_VERSION=$(date +%d-%m-%Y)-${CI_COMMIT_REF_NAME}-${CI_COMMIT_SHORT_SHA};

helm push $CI_PROJECT_NAME-${HELM_VERSION}.tgz oci://$REGISTRY_URL/$CI_PROJECT_NAME - тут происходит непосредственная отправка нашего пакета в Harbor. На что стоит обратить внимание, так это на REGISTRY_URL, который есть ни что иное, как ссылка на ваш harbor.your-domain.ru

На этом все! Спасибо за прочтение!

-10