Непрерывное развертывание контейнеризованных приложений с помощью GitLab

GitLab — инструмент непрерывной интеграции. В сценарии описано, как выполнять сборку приложения в Docker-контейнер и применять конфигурацию ресурсов Kubernetes в GitLab с помощью инструментов Яндекс.Облака:

Если созданные ВМ и кластер больше не нужны, удалите их.

Подготовьте облако к работе

Перед тем, как разворачивать приложения, нужно зарегистрироваться в Облаке и создать платежный аккаунт:

  1. Перейдите в консоль управления, затем войдите в Облако или зарегистрируйтесь, если вы еще не зарегистрированы.
  2. На странице биллинга убедитесь, что у вас подключен платежный аккаунт, и он находится в статусе ACTIVE или TRIAL_ACTIVE. Если платежного аккаунта нет, создайте его.

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

Подробнее об облаках и каталогах.

Создайте облачную сеть и подсеть в выбранной зоне доступности.

В стоимость поддержки инфраструктуры входят:

Создайте виртуальную машину из образа GitLab

Запустите GitLab на виртуальной машине с публичным IP-адресом:

  1. На странице каталога в консоли управления нажмите кнопку Создать ресурс и выберите Виртуальная машина.

  2. В поле Имя введите имя виртуальной машины: ci-tutorial-gitlab.

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

  4. В разделе Образы нажмите кнопку Выбрать.

  5. В открывшемся окне откройте вкладку DevTools.

  6. Выберите образ GitLab.

  7. В блоке Вычислительные ресурсы укажите следующую конфигурацию:

    • vCPU2
    • Гарантированная доля vCPU100%
    • RAM2 ГБ
  8. В блоке Сетевые настройки выберите, к какой подсети подключить виртуальную машину при создании.

  9. В поле Публичный адрес укажите Автоматически.

  10. Укажите данные для доступа на виртуальную машину:

    • В поле Логин введите имя пользователя.
    • В поле SSH ключ скопируйте содержимое файла открытого ключа. Пару ключей для подключения по SSH необходимо создать самостоятельно. Для создания ключей используйте сторонние инструменты, например утилиты ssh-keygen в Linux и macOS или PuTTYgen в Windows.
  11. Нажмите кнопку Создать ВМ.

Создание виртуальной машины может занять несколько минут. Когда виртуальная машина перейдет в статус RUNNING, вы можете перейти к ее настройке.

При создании виртуальной машине назначаются IP-адрес и имя хоста (FQDN). Эти данные можно использовать для доступа по SSH.

Настройте GitLab

Чтобы настроить GitLab и подготовить процесс непрерывной интеграции (Continuous Integration, CI), создайте новый проект и введите параметры для авторизации в CI.

  1. Откройте в браузере административную панель GitLab на созданной ВМ. Для этого откройте в браузере ссылку вида http://<публичный-IP-адрес-ВМ>.
  2. Задайте пароль администратора.
  3. Авторизуйтесь с логином root и заданным паролем администратора.
  4. Выберите сервис Create a project.
  5. Задайте имя проекта: gitlab-test.
  6. Нажмите кнопку Create project.

Создайте ресурсы Kubernetes

Для выполнения сценариев создайте необходимые ресурсы Kubernetes:

  1. Создайте кластер Kubernetes.
  2. Создайте группу узлов Kubernetes.

Получите токен сервисного аккаунта Kubernetes для аутентификации в GitLab

Чтобы получить сервисный токен:

  1. Сохраните спецификацию для создания сервисного аккаунта в 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
    
  2. Выполните команду:

    kubectl apply -f gitlab-admin-service-account.yaml
    
  3. Узнайте токен с помощью команды kubectl describe secret. Он будет указан в поле token:

    kubectl -n kube-system describe secret $(kubectl -n kube-system get secret \
    | grep gitlab-admin \
    | awk '{print $1}')
    
  4. Сохраните полученный токен — он понадобится для следующих шагов.

Подключите Kubernetes кластер к сборкам GitLab

Для того, чтобы запускать задачи сборки на кластере Kubernetes, подключите кластер в настройках GitLab.

  1. Откройте в браузере ссылку вида http://<публичный IP-адрес ВМ GitLab>/root.

  2. Выберите проект с именем gitlab-test.

  3. В открывшемся окне слева нажмите на Operations и выберите пункт Kubernetes.

  4. Нажмите кнопку Add Kubernetes cluster.

  5. В открывшемся окне нажмите Add existing cluster.

  6. В поле Kubernetes cluster name введите имя кластера.

  7. В поле API URL введите адрес узла мастера. Узнайте его с помощью команды:

    yc managed-Kubernetes cluster get <cluster-id> --format=json \
    | jq -r .master.endpoints.external_v4_endpoint
    
  8. В поле CA Certificate введите сертификат мастера. Узнайте его с помощью команды:

    yc managed-kubernetes cluster get my-cluster --format=json \
    | jq -r .master.master_auth.cluster_ca_certificate
    
  9. В поле Service Token введите токен, который GitLab будет использовать для создания ресурсов Kubernetes. Используйте токен, полученный перед началом работы.

  10. Нажмите кнопку Save changes.

  11. Установите на кластер Kubernetes приложения, необходимые для корректной работы GitLab Runner:

    • Напротив надписи Helm Tiller нажмите кнопку Install.
    • Напротив надписи GitLab Runner нажмите кнопку Install.

Теперь вы можете запускать автоматизированные сборки внутри своего Kubernetes кластера.

Подробнее про настройки подключения кластера Kubernetes к сборкам GitLab читайте в документации GitLab.

Настройте сборку Docker-образа из CI

Для того, чтобы собрать Docker-образ, вам необходимо подключиться к Docker-серверу.

GitLab позволяет задавать сценарии сборки в YAML-файле. Файл конфигурации .gitlab-ci.yml будет выглядеть следующим образом:

build:
  stage: build
  variables:
    DOCKER_DRIVER: overlay2
    DOCKER_TLS_CERTDIR: ""
    DOCKER_HOST: tcp://localhost:2375/
  image: docker:19.03.1
  services:
    - docker:19.03.1-dind
  script:
    - docker build . -t cr.yandex/<registry-id>/<image-name>

Здесь:

  • передаются переменные окружения для использования Docker-сервера;
  • Docker-сервер поднимается как GitLab сервис, рядом с Docker-контейнером для сборки Docker-образа. Подробнее про сборку вы можете прочитать в документации GitLab про сборку Docker-контейнеров.

Подробнее про то, как настроить сборку Docker-образа из CI, читайте в документации GitLab про интеграцию с Docker.

После успешной сборки, загрузите Docker-образ в Container Registry, чтобы он был доступен для дальнейшей работы. Для этого аутентифицируйтесь в Container Registry.

Аутентифицируйтесь в Container Registry

Есть два способа аутентификации из GitLab Runner в Container Registry:

Динамическая

Этот вариант аутентификации работает только если к виртуальной машине с GitLab привязан сервисный аккаунт. О том, как привязать сервисный аккаунт, читайте в разделе Работа с Яндекс.Облаком изнутри ВМ.

Для того, чтобы Docker мог получать метаданные из сервиса метаданных, воспользуйтесь публичным Docker-образом с именем cr.yandex/yc/metadata-token-docker-helper:0.1. Внутри него работает Docker credential helper, который получает IAM-токен из сервиса метаданных. Используйте данный Docker-образ на этапе сборки вашего приложения.

Файл конфигурации .gitlab-ci.yml будет выглядеть следующим образом:

build:
  stage: build
  variables:
    DOCKER_DRIVER: overlay2
    DOCKER_TLS_CERTDIR: ""
    DOCKER_HOST: tcp://localhost:2375/
  image: cr.yandex/yc/metadata-token-docker-helper:0.1
  services:
    - docker:19.03.1-dind
  script:
    - docker build . -t cr.yandex/<registry-id>/<image-name>
    - docker push cr.yandex/<registry-id>/<image-name>

Статическая

В переменную окружения GitLab пропишите содержимое авторизованного ключа вашего сервисного аккаунта (с необходимыми правами) и используйте данную переменную при сборке Docker-образа. Подробнее про использование json-key в Container Registry.

Файл конфигурации .gitlab-ci.yml будет выглядеть следующим образом:

build:
  stage: build
  variables:
    DOCKER_DRIVER: overlay2
    DOCKER_TLS_CERTDIR: ""
    DOCKER_HOST: tcp://localhost:2375/
  image: docker:19.03.1
  services:
    - docker:19.03.1-dind
  script:
    - echo <your env-variable> | docker login -u json_key --password-stdin cr.yandex
    - docker build . -t cr.yandex/<registry-id>/<image-name>
    - docker push cr.yandex/<registry-id>/<image-name>

Настройте автоматическое развертывание Kubernetes ресурсов из CI

Чтобы настроить автоматическое развертывание, необходимо прописать адрес мастера и токен сервисного аккаунта в настройках GitLab.

  1. Создайте переменные окружения GitLab:

    • KUBE_URL – адрес мастера. Узнайте его с помощью команды:

      yc managed-kubernetes cluster get <cluster-id> --format=json \
      | jq -r .master.endpoints.external_v4_endpoint
      
    • KUBE_TOKEN – токен, который будет использовать GitLab для применения конфигурации. Используйте токен, полученный перед началом работы.

  2. Используйте переменные окружения на этапе развертывания приложения.

    Файл конфигурации .gitlab-ci.yml в этом случае будет выглядеть следующим образом:

    deploy:
      image: gcr.io/cloud-builders/kubectl:latest
      stage: deploy
      script:
        - kubectl config set-cluster k8s --server="$KUBE_URL" --insecure-skip-tls-verify=true
        - kubectl config set-credentials admin --token="$KUBE_TOKEN"
        - kubectl config set-context default --cluster=k8s --user=admin
        - kubectl config use-context default
        - kubectl apply -f k8s.yaml
    

Теперь, при каждом запуске автоматизированной сборки, будет создаваться задача по изменению конфигурации ресурсов Kubernetes.

Удалите созданные ресурсы

Если вам больше не нужны развернутые приложения и кластер Kubernetes:

См. также