Интеграция с Argo CD
Argo CD — декларативный инструмент для непрерывной доставки в Kubernetes по модели GitOps.
В этом руководстве описана интеграция инстанса Yandex Managed Service for GitLab, кластера Kubernetes и установленного в кластере Argo CD, который выполняет сборку Docker-контейнеров с помощью инструмента Kaniko.
Чтобы интегрировать Argo CD с Managed Service for Kubernetes и Managed Service for GitLab:
- Создайте ресурсы Managed Service for Kubernetes и Container Registry.
- Создайте инстанс GitLab.
- Настройте GitLab.
- Создайте GitLab Runner.
- Подготовьте репозиторий приложения для развертывания.
- Разверните приложение с помощью Argo CD.
Если созданные ресурсы вам больше не нужны, удалите их.
Подготовьте облако к работе
Для выполнения сценария установите в локальном окружении:
-
Если у вас еще нет интерфейса командной строки Yandex Cloud, установите и инициализируйте его.
По умолчанию используется каталог, указанный в профиле CLI. Вы можете указать другой каталог с помощью параметра
--folder-name
или--folder-id
.
Создайте ресурсы Managed Service for Kubernetes и Container Registry
-
Создайте кластер Kubernetes и реестр Yandex Container Registry.
Для выполнения сценария создайте ресурсы Managed Service for Kubernetes: кластер и группу узлов.
Для хранения Docker-образов вам понадобится реестр Container Registry.
ВручнуюС помощью Terraform-
Если у вас еще нет сети, создайте ее.
-
Если у вас еще нет подсетей, создайте их в зонах доступности, где будут созданы кластер Kubernetes и группа узлов.
-
- С ролью editor на каталог, в котором создается кластер Kubernetes. От его имени будут создаваться ресурсы, необходимые кластеру Kubernetes.
- С ролями container-registry.images.puller и container-registry.images.pusher. От его имени узлы будут загружать в реестр собранные в GitLab Docker-образы, а также скачивать их для запуска подов.
Совет
Вы можете использовать один и тот же сервисный аккаунт для управления кластером Kubernetes и его группами узлов.
-
Создайте кластер Kubernetes и группу узлов со следующими настройками:
- Сервисный аккаунт для ресурсов — созданный ранее сервисный аккаунт с ролью
editor
. - Сервисный аккаунт для узлов — созданный ранее сервисный аккаунт с ролями
container-registry.images.puller
иcontainer-registry.images.pusher
. - Версия Kubernetes —
1.21
или выше. - Публичный адрес —
Автоматически
. - Отдельные параметры группы узлов:
- vCPU —
4
. - RAM —
8 ГБ
. - Прерываемая.
- Масштабирование —
Автоматическое
. - Минимальное кол-во узлов —
1
. - Максимальное кол-во узлов —
4
. - Начальное кол-во узлов —
1
.
- vCPU —
Сохраните идентификатор кластера — он понадобится для следующих шагов.
- Сервисный аккаунт для ресурсов — созданный ранее сервисный аккаунт с ролью
-
Сохраните идентификатор созданного реестра — он понадобится для следующих шагов.
-
Если у вас еще нет Terraform, установите его.
-
Скачайте файл с настройками провайдера. Поместите его в отдельную рабочую директорию и укажите значения параметров.
-
Скачайте в ту же рабочую директорию файл конфигурации кластера k8s-argocd.tf. В файле описаны:
- Сеть.
- Подсеть.
- Группа безопасности и правила, необходимые для работы кластера, группы узлов, инстанса Managed Service for GitLab и контейнера Container Registry:
- Правила для служебного трафика.
- Правила для доступа к API Kubernetes и управления кластером с помощью
kubectl
через порты 443 и 6443. - Правила для подключения к Git-репозиторию по протоколу SSH через порт 22.
- Правила, разрешающие HTTP- и HTTPS-трафик через порты 80 и 443.
- Правила для подключения к Container Registry через порт 5050.
- Кластер Managed Service for Kubernetes.
- Сервисный аккаунт, необходимый для работы кластера и группы узлов Managed Service for Kubernetes.
- Реестр Container Registry.
-
Укажите в файле конфигурации:
- Идентификатор каталога.
- Версию Kubernetes для кластера и групп узлов.
- CIDR кластера Kubernetes.
- Имя сервисного аккаунта кластера.
- Имя реестра Container Registry.
-
Выполните команду
terraform init
в директории с конфигурационными файлами. Эта команда инициализирует провайдер, указанный в конфигурационных файлах, и позволяет работать с ресурсами и источниками данных провайдера. -
Проверьте корректность файлов конфигурации Terraform с помощью команды:
terraform validate
Если в файлах конфигурации есть ошибки, Terraform на них укажет.
-
Создайте необходимую инфраструктуру:
-
Выполните команду для просмотра планируемых изменений:
terraform plan
Если конфигурации ресурсов описаны верно, в терминале отобразится список изменяемых ресурсов и их параметров. Это проверочный этап: ресурсы не будут изменены.
-
Если вас устраивают планируемые изменения, внесите их:
-
Выполните команду:
terraform apply
-
Подтвердите изменение ресурсов.
-
Дождитесь завершения операции.
-
В указанном каталоге будут созданы все требуемые ресурсы. Проверить появление ресурсов и их настройки можно в консоли управления.
-
-
-
Установите kubectl и настройте его на работу с созданным кластером.
Получите токен сервисного аккаунта Kubernetes для аутентификации в GitLab
Примечание
Сервисный аккаунт Kubernetes отличается от сервисного аккаунта Yandex Identity and Access Management.
Чтобы получить токен сервисного аккаунта Kubernetes:
-
Настройте локальное окружение на работу с созданным кластером Kubernetes:
yc managed-kubernetes cluster get-credentials <идентификатор или имя кластера> --external
-
Сохраните спецификацию для создания сервисного аккаунта Kubernetes в YAML-файл
gitlab-admin-service-account.yaml
:gitlab-admin-service-account.yaml--- apiVersion: v1 kind: ServiceAccount metadata: name: gitlab-admin namespace: kube-system --- apiVersion: rbac.authorization.k8s.io/v1beta1 kind: ClusterRoleBinding metadata: name: gitlab-admin roleRef: apiGroup: rbac.authorization.k8s.io kind: ClusterRole name: cluster-admin subjects: - kind: ServiceAccount name: gitlab-admin namespace: kube-system
-
Создайте сервисный аккаунт:
kubectl apply -f gitlab-admin-service-account.yaml
-
Узнайте токен сервисного аккаунта:
kubectl -n kube-system get secrets -o json | \ jq -r '.items[] | select(.metadata.name | startswith("gitlab-admin")) | .data.token' | \ base64 --decode
-
Сохраните полученный токен — он понадобится для следующих шагов.
Создайте инстанс GitLab
Запустите GitLab на ВМ с публичным IP-адресом.
- На странице каталога в консоли управления нажмите кнопку Создать ресурс и выберите Виртуальная машина.
- В поле Имя введите имя ВМ:
ci-tutorial-gitlab
. - Выберите зону доступности, в которой будет находиться ВМ.
- В блоке Выбор образа/загрузочного диска перейдите на вкладку Cloud Marketplace и нажмите кнопку Посмотреть больше. В открывшемся окне выберите образ GitLab и нажмите кнопку Использовать.
- В блоке Вычислительные ресурсы укажите следующую конфигурацию:
- vCPU —
4
. - Гарантированная доля vCPU —
100%
. - RAM —
8 ГБ
.
- vCPU —
- В блоке Сетевые настройки:
-
Выберите, к какой подсети подключить ВМ. Если нужной сети или подсети нет, создайте их с помощью кнопок Создать сеть и Добавить подсеть.
Важно
Технические ограничения Yandex Cloud временно не позволяют выбрать подсеть с диапазоном адресов
192.168.0.0/24
. -
В поле Публичный адрес выберите
Автоматически
.
-
- В блоке Доступ укажите данные для доступа на ВМ:
-
В поле Логин введите имя пользователя.
Внимание
Не используйте логин
root
или другие имена, зарезервированные операционной системой. Для выполнения операций, требующих прав суперпользователя, используйте командуsudo
. -
В поле SSH-ключ вставьте содержимое файла открытого ключа. Пару ключей для подключения по SSH необходимо создать самостоятельно, см. раздел о подключении к ВМ по SSH.
-
- Нажмите кнопку Создать ВМ.
Создание ВМ может занять несколько минут. Когда ВМ перейдет в статус 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.
Создайте GitLab Runner
Чтобы запускать задачи сборки в кластере Yandex Managed Service for Kubernetes, создайте GitLab Runner.
-
Подключите Helm-репозиторий, который содержит дистрибутив GitLab Runner:
helm repo add gitlab https://charts.gitlab.io
-
Узнайте настройки GitLab Runner:
- Откройте в браузере административную панель GitLab:
- Если GitLab развернут на виртуальной машине Yandex Compute Cloud, используйте ее публичный IP-адрес.
- Если GitLab развернут в сервисе Managed Service for GitLab, используйте FQDN инстанса.
- Выберите проект с именем
gitlab-test
. - В открывшемся окне слева нажмите кнопку Settings и выберите пункт CI/CD.
- В блоке Runners нажмите кнопку Expand.
- Сохраните значения параметров
URL
иregistration token
— они понадобятся на следующем шаге.
- Откройте в браузере административную панель GitLab:
-
Создайте файл
values.yaml
, содержащий настройки GitLab Runner:values.yaml--- imagePullPolicy: IfNotPresent gitlabUrl: <публичный IP-адрес ВМ или FQDN инстанса Managed Service for GitLab> runnerRegistrationToken: "<registration token>" terminationGracePeriodSeconds: 3600 concurrent: 10 checkInterval: 30 sessionServer: enabled: false rbac: create: true clusterWideAccess: true podSecurityPolicy: enabled: false resourceNames: - gitlab-runner runners: config: | [[runners]] [runners.kubernetes] namespace = "{{.Release.Namespace}}" image = "ubuntu:20.04" privileged = true
-
Установите GitLab Runner с помощью команды:
helm install --namespace default gitlab-runner -f values.yaml gitlab/gitlab-runner
-
Дождитесь перехода пода GitLab Runner в состояние
Running
:kubectl get pods -n default | grep gitlab-runner
Теперь вы можете запускать автоматизированные сборки внутри своего кластера Kubernetes.
Подробнее про установку и настройку GitLab Runner читайте в документации GitLab.
Подготовьте репозиторий приложения для развертывания
-
В Managed Service for GitLab создайте новый репозиторий
my-app
:Инстанс Managed Service for GitLabВМ с образом GitLab-
Авторизуйтесь в веб-интерфейсе инстанса Managed Service for GitLab.
-
Перейдите в группу
gitlab-test
. -
Нажмите кнопку Create a project.
-
Нажмите кнопку Create blank project.
-
Заполните поля:
- Project name —
my-app
. - Project URL — выберите
gitlab-test
в поле рядом с FQDN инстанса Managed Service for GitLab.
Остальные поля оставьте без изменений.
- Project name —
-
Нажмите кнопку Create project.
Чтобы настроить GitLab и подготовить процесс непрерывной интеграции (Continuous Integration, CI), создайте новый проект и введите параметры для авторизации в CI:
- На странице сервиса Yandex Compute Cloud выберите созданную ВМ и найдите ее публичный IP-адрес.
- Откройте в браузере ссылку
http://<публичный IP-адрес ВМ>
. Откроется административная панель GitLab. - Задайте пароль администратора и нажмите кнопку Change your password.
- Введите логин
root
и пароль администратора. - Нажмите кнопку Sign in.
- Выберите Create a project.
- Задайте имя проекта:
my-app
. - Нажмите кнопку Create project.
-
-
Получите авторизованный ключ для созданного ранее сервисного аккаунта с ролью container-registry.images.pusher:
yc iam key create --service-account-name <имя сервисного аккаунта реестра> -o key.json
-
Сохраните содержимое этого ключа — оно потребуется на следующем шаге:
cat key.json | base64
-
Создайте переменные окружения GitLab:
-
На панели слева в GitLab перейдите в раздел Settings и во всплывающем списке выберите пункт CI/CD.
-
Нажмите кнопку Expand напротив пункта Variables.
-
Добавьте три переменные окружения:
Name Value Опции CI_REGISTRY cr.yandex/<идентификатор реестра> no
CI_REGISTRY_USER json_key no
CI_REGISTRY_PASSWORD <вывод команды cat key.json | base64
>Mask variable
-
-
Настройте доступ к репозиторию:
- Сгенерируйте новую пару SSH-ключей или используйте существующую.
- Добавьте публичную часть SSH-ключа в настройки учетной записи GitLab.
-
Клонируйте репозиторий:
git clone git@<имя инстанса Managed Service for GitLab>.gitlab.yandexcloud.net:gitlab-test/my-app.git
-
Загрузите архив
app.zip
и распакуйте его. -
Скопируйте в директорию
my-app
все файлы (включая скрытые) из загруженного архива:cp -a <путь к директории с файлами из app.zip> <путь к директории my-app>
-
Сохраните изменения и отправьте их в репозиторий:
git add . && \ git commit -m "Add app src and CI" && \ git push
-
Запустится сценарий сборки. Чтобы посмотреть его выполнение, выберите в выпадающем меню пункт CI/CD → Pipelines. Дождитесь успешного завершения обоих этапов сборки.
-
Откройте завершенную сборку и скопируйте строку из лога, она понадобится на следующем этапе:
INFO[0025] Pushing image to cr.yandex/<идентификатор реестра>/gitlab-test/my-app:main.<номер коммита>
Разверните приложение с помощью Argo CD
Установите Argo CD в кластер Kubernetes
-
Установите Argo CD согласно инструкции.
-
Настройте переадресацию порта сервиса
argocd-server
на локальный компьютер и подключитесь к кластеру Kubernetes:kubectl port-forward svc/<название приложения Argo CD>-argocd-server 8080:443
-
Получите пароль администратора из секрета Kubernetes:
kubectl get secret argocd-initial-admin-secret \ -o jsonpath='{.data.password}' | base64 -d
-
Откройте в браузере консоль Argo CD по адресу
https://127.0.0.1:8080
. -
Авторизуйтесь в консоли, используя имя пользователя
admin
и пароль, полученный на предыдущем шаге.
Создайте репозиторий GitLab для Argo CD
-
На панели слева в GitLab перейдите в раздел Settings и во всплывающем списке выберите пункт Access Tokens.
-
Задайте параметры нового токена:
- Token name —
argocd
. - Select scopes —
read_repository
.
- Token name —
-
Нажмите кнопку Create project access token.
-
Скопируйте значение созданного токена.
-
В консоли Argo CD перейдите в раздел Settings → Repositories.
-
Нажмите кнопку Connect Repo Using SSH.
-
В открывшейся форме задайте параметры:
- Repository URL — URL репозитория вида
https://<имя инстанса GitLab>.gitlab.yandexcloud.net/gitlab-test/my-app.git
. - Username —
gitlab-ci-token
. - Password — токен GitLab, сгенерированный ранее.
- Repository URL — URL репозитория вида
-
Нажмите кнопку Connect.
-
В консоли Argo CD перейдите в раздел Applications и нажмите кнопку Create Application.
-
В открывшейся форме задайте параметры:
- Application Name —
my-app
. - Project —
default
. - Sync policy —
Automatic
, затем выберите опции Prune resources и Self Heal. - Sync policy —
Auto-Create Namespace
. - Source — URL репозитория вида
https://<имя инстанса GitLab>.gitlab.yandexcloud.net/gitlab-test/my-app.git
. - Path —
.helm
. - Cluster URL —
https://kubernetes.default.svc
. - Namespace —
my-app
. - Directory — выберите
Helm
и в появившейся секции Parameters задайте параметры, исходя из значения успешно завершенной сборки GitLab:- image.repository —
cr.yandex/<идентификатор реестра>/gitlab-test/my-app
. - image.tag —
main.<номер коммита>
.
- image.repository —
- Application Name —
-
Нажмите кнопку Create и дождитесь завершения синхронизации.
-
Для проверки запуска приложения выполните команду в кластере Kubernetes:
kubectl get all -n my-app
Проверьте автоматическую синхронизацию из репозитория
-
Перейдите в директорию с клонированным проектом и откройте файл
.helm/values.yaml
. -
Измените значение параметра
replicaCount
на3
. -
Сохраните изменения и отправьте их в репозиторий:
git add . && \ git commit -m "Increase replica count" && \ git push
-
В консоли Argo CD дождитесь синхронизации приложения.
-
Проверьте, что количество подов приложения в кластере увеличилось:
kubectl get pod -n my-app
Удалите созданные ресурсы
Если созданные ресурсы вам больше не нужны, удалите их:
-
Удалите кластер Kubernetes и реестр Container Registry:
ВручнуюС помощью Terraform-
В командной строке перейдите в директорию, в которой расположен актуальный конфигурационный файл Terraform с планом инфраструктуры.
-
Удалите конфигурационный файл
k8s-argocd.tf
. -
Проверьте корректность файлов конфигурации Terraform с помощью команды:
terraform validate
Если в файлах конфигурации есть ошибки, Terraform на них укажет.
-
Подтвердите изменение ресурсов.
-
Выполните команду для просмотра планируемых изменений:
terraform plan
Если конфигурации ресурсов описаны верно, в терминале отобразится список изменяемых ресурсов и их параметров. Это проверочный этап: ресурсы не будут изменены.
-
Если вас устраивают планируемые изменения, внесите их:
-
Выполните команду:
terraform apply
-
Подтвердите изменение ресурсов.
-
Дождитесь завершения операции.
-
Все ресурсы, которые были описаны в конфигурационном файле
k8s-argocd.tf
, будут удалены. -
-
-
Удалите созданную ВМ GitLab или инстанс Managed Service for GitLab.