Доброго времени суток, дорогой читатель! В этой статье, мы не будем подробно говорить о том, что такое HELM CHART и как с ним работать, предполагается, что вы с ним уже знакомы, хотя бы частично. В этом материале, мы будем говорить о том, как настроить публикацию собранных Helm Chart в S3 или Harbor.
Задача которую решаем.
Имея Gitlab и настраивая CI/CD процессы, нам необходимо собирать и публиковать сборки Helm Charts во внешнее хранилище.
Важно: все эксперименты мы будем проводить на российском облаке от VK Cloud Solutions. Если, статья зайдет, то в дальнейшем, повторим эксперимент на Yandex Cloud.
Начинаем, настройка S3 репозитория
Сначала, мы будем настраивать S3 репозиторий. Итак, вот что должно быть:
- На Gitlab Runner должен быть установлен Helm
- Поставим Helm s3 plugin
- Обойдем ограничения коннекта к Amazon
- Инициализируем и подключим репозиторий
Первое, что нам необходимо сделать, это создать S3 хранилище для наших HELM репозиториев
Для начала работ, нам необходимо создать Bucket. Название нашего Bucket будет helm, тип хранилища IceBox, и по умолчанию он будет приватный.
После того, как Bucket будет создан, необходимо настроить аккаунт для авторизации.
Скопируйте 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. В процессе конфигурации вам будут заданы вопросы, по конфигуарции на которые необходимо ответить:
- Access Key - выдается Vk Cloud
- Secret Key - выдается VK CLoud
- Region - ru-msk
- Output format - json
После этого, в вашем файле .bashrc нужно добавить строчку
alias aws='aws --endpoint-url https://ib.bizmrg.com'
- https://hb.bizmrg.com — для класса хранения Hotbox.
- 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, там четко указано, какие переменные и для чего мы можем использовать в нашем окружении.
Теперь, когда все понятно и прозрачно, мы можем и должны сделать такой конфигурационный файл для нашего 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 довольно прост, достаточно просто перейти в маркет приложений и нажать установить.
После установки, в настройках предустановленных приложений появится виртуальная машина с установленным Harbor, который сразу же будет доступен по IP адресу машины.
Однако, все было бы слишком хорошо, если бы было так гладко. Ни Docker Registry (который мы рассмотрим в следующей статье), ни Helm Package Registry не будут работать без https. Это означает, что необходимо выполнить 2 вещи:
- Сгенерировать сертификаты для домена (Lets Encrypt) или купить
- Настроить 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 и ввести этот логин и пароль, сразу после этого вы попадете внутрь.
Находясь внутри, настоятельно рекомендую, первым делом создать пользователя для работы с вашими 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
На этом все! Спасибо за прочтение!