Хранение Docker-образов в Yandex Container Registry
- Перед началом работы
- Создайте инстанс GitLab
- Настройте GitLab
- Создайте тестовое приложение
- Создайте GitLab Runner
- Создайте переменные окружения GitLab
- Создайте файл конфигурации сценария CI
- Проверьте результат
- Включите политику автоматического удаления Docker-образов
- Отсканируйте Docker-образы на наличие уязвимостей
- Удалите созданные ресурсы
В GitLab интегрирован сервис Container Registry
Вместо GitLab Container Registry вы можете использовать Yandex Container Registry. Этот сервис позволяет хранить Docker-образы в облаке и распространять их между управляемыми сервисами Yandex Cloud, например, Yandex Managed Service for Kubernetes или Yandex Managed Service for GitLab.
Использование Yandex Container Registry для хранения образов из проектов GitLab обладает несколькими преимуществами:
-
GitLab Container Registry хранит образы и теги на диске инстанса GitLab. Когда место на диске заканчивается, возникает ошибка с HTTP-кодом 500, инстанс становится недоступным. Восстановить его можно только через обращение в техническую поддержку.
Yandex Container Registry хранит образы и теги в реестрах, для которых выделяются отдельные квоты. Поэтому накопление Docker-образов и тегов не влияет на место на диске инстанса.
-
Образы в Yandex Container Registry остаются доступными, даже если Managed Service for GitLab недоступен.
-
Yandex Container Registry поддерживает сканер уязвимостей Docker-образов. С его помощью можно обнаружить уязвимости и устранить их до развертывания приложения. Подробнее о сканировании см. в блоге Yandex Cloud.
Чтобы настроить хранение Docker-образов из Managed Service for GitLab в Yandex Container Registry:
- Создайте инстанс GitLab.
- Настройте GitLab.
- Создайте тестовое приложение.
- Создайте GitLab Runner.
- Создайте переменные окружения GitLab.
- Создайте файл конфигурации сценария CI.
- Проверьте результат.
- Включите политику автоматического удаления Docker-образов.
- (Опционально) Отсканируйте Docker-образы на наличие уязвимостей.
Если инстанс Yandex Managed Service for GitLab уже настроен для непрерывной интеграции (Continuous Integration, CI), убедитесь, что инфраструктура для хранения Docker-образов подготовлена. Затем начните настройку с создания переменных окружения.
Если созданные ресурсы вам больше не нужны, удалите их.
Примечание
По умолчанию GitLab Container Registry отключен при создании инстанса Managed Service for GitLab.
Перед началом работы
Зарегистрируйтесь в Yandex Cloud и создайте платежный аккаунт:
- Перейдите в консоль управления
, затем войдите в Yandex Cloud или зарегистрируйтесь. - На странице Yandex Cloud Billing
убедитесь, что у вас подключен платежный аккаунт, и он находится в статусеACTIVE
илиTRIAL_ACTIVE
. Если платежного аккаунта нет, создайте его и привяжите к нему облако.
Если у вас есть активный платежный аккаунт, вы можете создать или выбрать каталог, в котором будет работать ваша инфраструктура, на странице облака
Подробнее об облаках и каталогах.
Необходимые платные ресурсы
В стоимость поддержки инфраструктуры входит плата за следующие ресурсы:
- Диски и постоянно запущенные виртуальные машины (см. тарифы Yandex Compute Cloud).
- Использование динамического публичного IP-адреса (см. тарифы Yandex Virtual Private Cloud).
- Хранение созданных Docker-образов и сканер уязвимостей, если вы его активируете (см. тарифы Container Registry).
- Использование мастера Managed Service for Kubernetes (см. тарифы Managed Service for Kubernetes).
Подготовьте инфраструктуру
-
Если у вас еще нет сети, создайте ее.
-
Если у вас еще нет подсетей, создайте их в зонах доступности, где будут созданы кластер Yandex Managed Service for Kubernetes и группа узлов.
-
Создайте сервисный аккаунт
account-for-container-registry
с ролями на каталог:editor
container-registry.images.pusher
container-registry.images.puller
-
Создайте кластер Managed Service for Kubernetes с зональным мастером и группу узлов. При создании кластера укажите созданный ранее сервисный аккаунт.
-
Настройте группу безопасности для работы кластера Managed Service for Kubernetes и инстанса Managed Service for GitLab.
-
Если у вас еще нет Terraform, установите его.
-
Получите данные для аутентификации. Вы можете добавить их в переменные окружения или указать далее в файле с настройками провайдера.
-
Настройте и инициализируйте провайдер. Чтобы не создавать конфигурационный файл с настройками провайдера вручную, скачайте его
. -
Поместите конфигурационный файл в отдельную рабочую директорию и укажите значения параметров. Если данные для аутентификации не были добавлены в переменные окружения, укажите их в конфигурационном файле.
-
Скачайте в ту же рабочую директорию файл конфигурации container-registry-and-gitlab.tf
.В этом файле описаны:
- Сеть.
- Подсеть.
- Группа безопасности и правила, необходимые для работы инстанса Managed Service for GitLab и кластера Yandex Managed Service for Kubernetes.
- Кластер Managed Service for Kubernetes с зональным мастером.
- Группа узлов для кластера.
- Сервисный аккаунт, необходимый для работы кластера и группы узлов Managed Service for Kubernetes.
- Реестр Yandex Container Registry.
-
Укажите в файле
container-registry-and-gitlab.tf
:- Идентификатор облака.
- Идентификатор каталога.
- Версию Kubernetes для кластера и групп узлов Managed Service for Kubernetes.
-
Проверьте корректность файлов конфигурации Terraform с помощью команды:
terraform validate
Если в файлах конфигурации есть ошибки, Terraform на них укажет.
-
Создайте необходимую инфраструктуру:
-
Выполните команду для просмотра планируемых изменений:
terraform plan
Если конфигурации ресурсов описаны верно, в терминале отобразится список изменяемых ресурсов и их параметров. Это проверочный этап: ресурсы не будут изменены.
-
Если вас устраивают планируемые изменения, внесите их:
-
Выполните команду:
terraform apply
-
Подтвердите изменение ресурсов.
-
Дождитесь завершения операции.
-
В указанном каталоге будут созданы все требуемые ресурсы. Проверить появление ресурсов и их настройки можно в консоли управления
. -
Создайте инстанс GitLab
Создайте инстанс Managed Service for GitLab или виртуальную машину с образом GitLab в той же облачной сети, где расположен кластер Managed Service for Kubernetes.
Создайте инстанс Managed Service for GitLab согласно инструкции.
Запустите GitLab на ВМ с публичным IP-адресом.
-
На странице каталога в консоли управления
нажмите кнопку Создать ресурс и выберитеВиртуальная машина
. -
В блоке Образ загрузочного диска в поле Поиск продукта введите
Gitlab
и выберите публичный образ GitLab. -
В блоке Расположение выберите зону доступности, в которой будет находиться ВМ. Если вы не знаете, какая зона доступности вам нужна, оставьте выбранную по умолчанию.
-
В блоке Вычислительные ресурсы перейдите на вкладку
Своя конфигурация
и укажите необходимую платформу, количество vCPU и объем RAM:- Платформа —
Intel Ice Lake
. - vCPU —
4
. - Гарантированная доля vCPU —
100%
. - RAM —
8 ГБ
.
- Платформа —
-
В блоке Сетевые настройки:
- В поле Подсеть выберите сеть и подсеть, к которым нужно подключить ВМ. Если нужной сети или подсети еще нет, создайте их.
- В поле Публичный адрес оставьте значение
Автоматически
, чтобы назначить ВМ случайный внешний IP-адрес из пула Yandex Cloud, или выберите статический адрес из списка, если вы зарезервировали его заранее.
-
В блоке Доступ выберите вариант SSH-ключ и укажите данные для доступа на ВМ:
- В поле Логин введите имя пользователя. Не используйте имя
root
или другие имена, зарезервированные ОС. Для выполнения операций, требующих прав суперпользователя, используйте командуsudo
. -
В поле SSH-ключ выберите SSH-ключ, сохраненный в вашем профиле пользователя организации.
Если в вашем профиле нет сохраненных SSH-ключей или вы хотите добавить новый ключ:
- Нажмите кнопку Добавить ключ.
- Задайте имя SSH-ключа.
- Загрузите или вставьте содержимое открытого SSH-ключа. Пару SSH-ключей для подключения к ВМ по SSH необходимо создать самостоятельно.
- Нажмите кнопку Добавить.
SSH-ключ будет добавлен в ваш профиль пользователя организации.
Если в организации отключена возможность добавления пользователями SSH-ключей в свои профили, добавленный открытый SSH-ключ будет сохранен только в профиле пользователя создаваемой виртуальной машины.
- В поле Логин введите имя пользователя. Не используйте имя
-
В блоке Общая информация задайте имя ВМ:
ci-tutorial-gitlab
. -
Нажмите кнопку Создать ВМ.
Создание ВМ может занять несколько минут. Когда ВМ перейдет в статус RUNNING
и запустится GitLab, настройте его.
Настройте GitLab
Чтобы настроить GitLab и подготовить процесс непрерывной интеграции (Continuous Integration, CI), создайте новый проект и введите параметры для авторизации в CI:
-
Авторизуйтесь в веб-интерфейсе инстанса Managed Service for GitLab.
-
Нажмите кнопку Create a project.
-
Нажмите кнопку Create blank project.
-
Заполните поля:
- Project name —
gitlab-test
. - Project URL — выберите пользователя-администратора в поле рядом с FQDN инстанса Managed Service for GitLab.
Остальные поля оставьте без изменений.
- Project name —
-
Нажмите кнопку Create project.
-
На странице сервиса Yandex Compute Cloud выберите созданную ВМ и скопируйте ее публичный IP-адрес.
-
Подключитесь к ВМ по протоколу SSH.
-
Получите пароль администратора GitLab с помощью команды ВМ:
sudo cat /etc/gitlab/initial_root_password
-
Скопируйте пароль из строки
Password
(исключая пробелы) в буфер обмена или отдельный файл. -
Откройте в браузере ссылку
http://<публичный_IP-адрес_ВМ>
. Откроется веб-интерфейс GitLab. -
Войдите в систему с учетной записью администратора:
- Username or email —
root
. - Password — пароль, скопированный ранее.
Если вы не можете войти, сбросьте пароль учетной записи администратора
. - Username or email —
-
Повторно войдите в систему с учетной записью администратора, используя новый пароль.
-
Выберите Create a project.
-
Задайте имя проекта:
gitlab-test
. -
Нажмите кнопку Create project.
Создайте тестовое приложение
Создайте тестовое приложение, которое можно будет развернуть в кластере Managed Service for Kubernetes. Для этого добавьте в проект Dockerfile
:
-
Авторизуйтесь в GitLab.
-
Откройте проект GitLab.
-
В строке навигации по репозиторию нажмите кнопку
и в выпадающем меню выберите пункт New file. -
Назовите файл
Dockerfile
и добавьте в него код:FROM alpine:3.10 CMD echo "Hello"
-
Напишите комментарий к коммиту в поле Commit message:
Dockerfile for a test application
. -
Нажмите кнопку Commit changes.
Создайте GitLab Runner
Чтобы запускать задачи сборки в кластере Yandex Managed Service for Kubernetes, создайте GitLab Runner
После установки вы можете запускать автоматизированные сборки внутри своего кластера Managed Service for Kubernetes.
Подробнее про установку и настройку GitLab Runner читайте в документации GitLab
Создайте переменные окружения GitLab
Чтобы разрешить сервису Managed Service for GitLab сохранять Docker-образы и их теги в Yandex Container Registry, создайте переменные окружения GitLab
-
Если у вас еще нет интерфейса командной строки Yandex Cloud, установите и инициализируйте его.
По умолчанию используется каталог, указанный в профиле CLI. Вы можете указать другой каталог с помощью параметра
--folder-name
или--folder-id
. -
Создайте статический ключ для сервисного аккаунта
account-for-container-registry
, созданного ранее:yc iam key create --service-account-name account-for-container-registry -o key.json
Ключ сохраняется в файле
key.json
в папке, где была запущена команда. -
Откройте свой проект в GitLab.
-
На панели слева перейдите в раздел Settings и во всплывающем списке выберите пункт CI/CD.
-
Нажмите кнопку Expand напротив пункта Variables.
-
Добавьте переменные окружения с выключенной опцией защиты:
Переменная Ее значение CI_REGISTRY
cr.yandex/<идентификатор_реестра>
. Укажите идентификатор созданного ранее реестра Yandex Container Registry.CI_REGISTRY_KEY
Содержимое файла key.json
.Для добавления переменной:
- Нажмите кнопку Add variable.
- В появившемся окне в поле Key укажите имя переменной, в поле Value — значение переменной.
- Выключите опцию Protect variable.
- Нажмите кнопку Add variable.
Создайте файл конфигурации сценария CI
Для сборки образов из Dockerfile без Docker используется kaniko
Чтобы публиковать Docker-образы из проекта GitLab в Yandex Container Registry, создайте сценарий CI:
-
Откройте проект
gitlab-test
. -
В строке навигации по репозиторию нажмите кнопку
и в выпадающем меню выберите пункт New file. -
Назовите файл
.gitlab-ci.yml
. Добавьте в него шаги сборки Docker-образа и его загрузки в Yandex Container Registry:.gitlab-ci.yml
build: stage: build # Использование kaniko для создания контейнера внутри контейнера для большей безопасности. image: name: gcr.io/kaniko-project/executor:debug entrypoint: [""] script: - mkdir -p /kaniko/.docker # Отправка образа контейнера в реестр. Образ отмечен хэшем коммита. - echo "{\"auths\":{\"$CI_REGISTRY\":{\"auth\":\"$(echo -n "json_key:${CI_REGISTRY_KEY}" | base64 | tr -d '\n' )\"}}}" > /kaniko/.docker/config.json - >- /kaniko/executor --context "${CI_PROJECT_DIR}" --dockerfile "${CI_PROJECT_DIR}/Dockerfile" --destination "${CI_REGISTRY}/${CI_PROJECT_PATH}:${CI_COMMIT_SHORT_SHA}"
Файл содержит переменные:
CI_REGISTRY
иCI_REGISTRY_KEY
— добавлены в GitLab на предыдущем шаге.CI_PROJECT_DIR
,CI_PROJECT_PATH
иCI_COMMIT_SHORT_SHA
— предопределены в GitLab .
-
Напишите комментарий к коммиту в поле Commit message:
Create a CI pipeline
. -
Нажмите кнопку Commit changes.
Проверьте результат
После каждого коммита запускается сценарий сборки. Чтобы проверить результаты его выполнения:
-
На панели слева в проекте
gitlab-test
выберите пункт Build, в выпадающем меню выберите пункт Pipelines. -
Убедитесь, что этап
build
принимает статусpassed
. Это означает, что сценарий CI выполнился успешно. -
Перейдите в консоль управления
, затем откройте реестр Yandex Container Registry.При успешном выполнении сценария появляется новый репозиторий в реестре. Он пополняется Docker-образами из проекта GitLab при каждом коммите.
Включите политику автоматического удаления Docker-образов
Чтобы не хранить устаревшие Docker-образы и их теги, используйте политику автоматического удаления Docker-образов. Она применяется к образам в репозитории Container Registry и позволяет своевременно очищать место в нем. Так вы не переплачиваете за хранение устаревших образов.
Чтобы создать политику, следуйте инструкции.
Особенности работы с политикой:
-
Внешние Container Registry и политика удаления образов влияют на производительность сценариев CI
. -
Для политики действует лимит на максимальное количество образов, которые можно проверить за один запуск политики. Если количество образов в репозитории Container Registry превышает этот лимит, запустите политику несколько раз. Так будут проверены все образы.
Отсканируйте Docker-образы на наличие уязвимостей
Чтобы отслеживать уязвимости Docker-образов, вы можете дополнительно активировать сканер уязвимостей в Yandex Container Registry. Сканер сравнивает версии пакетов, установленных в образах, с базами уязвимостей CVE
Чтобы включить сканирование, дополните сценарий CI в своем проекте GitLab:
-
Откройте проект
gitlab-test
. -
Откройте файл
.gitlab-ci.yml
. -
Добавьте в него шаги сканирования Docker-образа на наличие уязвимостей:
.gitlab-ci.yml
stages: - build - test <блок_build_добавленный_ранее_в_файл> container_scanning_free_yc: stage: test # Использование утилиты jq для поиска идентификатора и записи логов. image: name: pindar/jq entrypoint: [""] artifacts: when: always paths: - gl-container-scanning-report-yc.json variables: # Укажите идентификатор созданного ранее реестра. CI_REGISTRY_ID: "<идентификатор_реестра>" script: - export CI_COMMIT_SHORT_SHA=${CI_COMMIT_SHORT_SHA} # Установка Yandex Cloud CLI. - curl https://storage.yandexcloud.net/yandexcloud-yc/install.sh | bash -s -- -a && cp /root/yandex-cloud/bin/yc /usr/bin/ # Начало сканирования. - echo "Scanning image ${CI_REGISTRY}/${CI_PROJECT_PATH}:${CI_COMMIT_SHORT_SHA}..." - export IMAGE_ID=$(yc container image list --registry-id $CI_REGISTRY_ID --format=json | jq -r --arg CI_COMMIT_SHORT_SHA $CI_COMMIT_SHORT_SHA '.[] | select(.tags[0]==$CI_COMMIT_SHORT_SHA) | .id ') # Запись логов. - export SCAN_RESULT=$(yc container image scan $IMAGE_ID --format=json) - export CRIT_VULN=$(echo $SCAN_RESULT | jq -r '.vulnerabilities.critical // 0') - export HIGH_VULN=$(echo $SCAN_RESULT | jq -r '.vulnerabilities.high // 0') - export SCAN_ID=$(echo $SCAN_RESULT | jq -r '.id') - echo "Scan results:" - yc container image list-vulnerabilities --scan-result-id="${SCAN_ID}" --format json | jq -r '.[] | select(.severity=="CRITICAL", .severity=="HIGH")' - yc container image list-vulnerabilities --scan-result-id="${SCAN_ID}" --format json | jq -r '.[] | select(.severity=="CRITICAL", .severity=="HIGH")' > gl-container-scanning-report-yc.json # Проверка результата. - (( SUM = $CRIT_VULN + $HIGH_VULN )) && (( RES = (SUM >= 1) )) && echo $RES && echo "image has $CRIT_VULN critical vulnerabilities and $HIGH_VULN high vulnerabilities" && exit 1 || echo "image has no high or critical vulnerabilities" exit 0
-
Напишите комментарий к коммиту в поле Commit message:
Turn on a vulnerability scanner
. -
Нажмите кнопку Commit changes. После этого запустится обновленный сценарий.
Чтобы убедиться, что сканирование образов прошло успешно:
-
На панели слева в проекте
gitlab-test
выберите пункт Build, в выпадающем меню выберите пункт Pipelines. -
Убедитесь, что этапы
build
иtest
принимают статусpassed
. Это означает, что сценарий CI выполнился успешно. -
Перейдите в консоль управления
, затем откройте реестр Yandex Container Registry. -
Откройте репозиторий с Docker-образами из проекта GitLab.
-
Перейдите в папку с названием проекта GitLab.
-
Убедитесь, что в столбце Статус сканирования указано Готово.
-
В столбце Дата последнего сканирования нажмите ссылку со временем сканирования.
Откроются результаты сканирования. Если в образе выявлены уязвимости, они отображаются в полученных результатах.
Удалите созданные ресурсы
Если созданные ресурсы вам больше не нужны, удалите их:
- Удалите инстанс Managed Service for GitLab или созданную виртуальную машину с образом GitLab.
- Удалите все Docker-образы из реестра Container Registry.
Остальные ресурсы удалите в зависимости от способа их создания:
- Удалите кластер Managed Service for Kubernetes.
- Если вы зарезервировали для кластера Managed Service for Kubernetes публичный IP-адрес, удалите его.
- Удалите сервисные аккаунты.
- Удалите реестр Container Registry.
- Удалите подсети и сеть.
Чтобы удалить инфраструктуру, созданную с помощью Terraform:
-
В терминале перейдите в директорию с планом инфраструктуры.
-
Удалите конфигурационный файл
container-registry-and-gitlab.tf
. -
Проверьте корректность файлов конфигурации Terraform с помощью команды:
terraform validate
Если в файлах конфигурации есть ошибки, Terraform на них укажет.
-
Подтвердите изменение ресурсов.
-
Выполните команду для просмотра планируемых изменений:
terraform plan
Если конфигурации ресурсов описаны верно, в терминале отобразится список изменяемых ресурсов и их параметров. Это проверочный этап: ресурсы не будут изменены.
-
Если вас устраивают планируемые изменения, внесите их:
-
Выполните команду:
terraform apply
-
Подтвердите изменение ресурсов.
-
Дождитесь завершения операции.
-
Все ресурсы, которые были описаны в конфигурационном файле
container-registry-and-gitlab.tf
, будут удалены. -