Конвейеры Azure DevOps — агенты масштабирования: установка Docker

#azure-devops #azure-vm-scale-set #azure-devops-pipelines

#azure-devops #azure-vm-scale-set #azure-devops-pipelines

Вопрос:

Недавно мы перенастроили наш процесс сборки, чтобы он полностью выполнялся в контейнерах, и теперь мы планируем перейти от локальных агентов сборки к использованию агентов в наборе Azure Scale.

Мы хотим избежать необходимости поддерживать наши собственные образы виртуальных машин для набора масштаба Azure и решили использовать образ Ubuntu 18.04 LTS по умолчанию, который доступен в Azure.

Этот образ не включает Docker, поэтому мы настроили набор Azure Scale на использование скрипта облачной конфигурации, который установит Docker при первой загрузке виртуальной машины:

 #cloud-config

apt:
  sources:
    docker.list:
      source: deb [arch=amd64] https://download.docker.com/linux/ubuntu $RELEASE stable
      keyid: 9DC858229FC7DD38854AE2D88D81803C0EBFCD88

packages:
  - docker-ce
  - docker-ce-cli

groups:
  - docker
  

Кажется, что это работает хорошо, но иногда задания сборки завершаются неудачно:

 Starting: Initialize containers
/usr/bin/docker version --format '{{.Server.APIVersion}}'
Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?
'
##[error]Exit code 1 returned from process: file name '/usr/bin/docker', arguments 'version --format '{{.Server.APIVersion}}''.
Finishing: Initialize containers
  

введите описание изображения здесь

Похоже, что либо произошел сбой сценария инициализации в облаке, либо агент Azure DevOps запустился на виртуальной машине до завершения сценария инициализации в облаке.

До сих пор я видел следующие сценарии:

  • Подготовка новой виртуальной машины работает нормально, и задания выполняются правильно
  • Первые несколько заданий завершаются ошибкой на недавно подготовленной виртуальной машине, а затем выполняются правильно. (Возможно, потому, что сценарий инициализации облака выполнялся параллельно с расширением Azure DevOps, которое развертывает агент на виртуальной машине, и у вас есть состояние гонки?)
  • Все задания завершаются сбоем, даже, скажем, через 30 минут. Иногда переосмысление виртуальной машины помогает, иногда нет.

У кого-нибудь есть подобная настройка? Работает ли это правильно? Если нет, то каковы альтернативные способы развертывания Docker на виртуальных машинах до того, как виртуальная машина запустит задание контейнера?

Комментарии:

1. Что вы имеете в виду sometimes ? Была ли виртуальная машина запущена при запуске конвейера? Хотя эта проблема, похоже, больше связана с настройкой вашей виртуальной машины, не могли бы вы поделиться некоторыми подробностями о вашем конвейере?

2. «Иногда», примерно в 1 из каждых 3 заданий? Это агент набора масштаба, поэтому, возможно, при запуске задания вообще не было никакой виртуальной машины. Но конвейер действительно запускался на агенте (который, возможно, был подготовлен по требованию), и сообщение об ошибке было сгенерировано кодом, запущенным на агенте. Само задание является заданием контейнера, и сбой происходит на шаге «Инициализировать контейнеры». После этого конвейер содержит кучу сценариев оболочки, которые никогда не выполняются, потому что задание контейнера не запустилось успешно (потому что Docker каким-то образом не был установлен правильно / вовремя).

3. Initialize containers Ошибка на этом Initialize containers шаге вызвана неправильным запуском виртуальной машины, поэтому Azure devops завершилась с ошибкой Is the docker daemon running? . Причина этой проблемы, похоже, связана с виртуальной машиной Azure, с которой я не знаком…

4. Да, похоже, что это ошибка / ограничение агента автоматического масштабирования: github.com/microsoft/azure-pipelines-agent/issues/2866 , github.com/Azure/WALinuxAgent/issues/1938

Ответ №1:

При настройке пула агентов Azure DevOps для использования набора масштаба Azure для подготовки машин сборки расширение Microsoft.Azure.DevOps.Pipelines.Agent / TeamServicesAgentLinux автоматически добавляется к вашему набору масштаба.

Это расширение отвечает за установку агента Azure DevOps на ваших виртуальных машинах и добавление его в ваш пул агентов.

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

Чтобы обойти это, добавьте bootcmd скрипт в свой сценарий облачной конфигурации, который запускает walinuxagent службу агента (которая запустит расширение Azure DevOps) после сценария облачной конфигурации, например:

 #cloud-config

bootcmd:
  - mkdir -p /etc/systemd/system/walinuxagent.service.d
  - echo "[Unit]nAfter=cloud-final.service" > /etc/systemd/system/walinuxagent.service.d/override.conf
  - sed "s/After=multi-user.target//g" /lib/systemd/system/cloud-final.service > /etc/systemd/system/cloud-final.service
  - systemctl daemon-reload

apt:
  sources:
    docker.list:
      source: deb [arch=amd64] https://download.docker.com/linux/ubuntu $RELEASE stable
      keyid: 9DC858229FC7DD38854AE2D88D81803C0EBFCD88

packages:
  - docker-ce
  - docker-ce-cli

groups:
  - docker
  

Это позволяет создать пул агентов набора масштаба Azure DevOps, который использует стандартный образ Ubuntu 18.04 и устанавливает docker поверх этого образа.

Смотрите https://github.com/microsoft/azure-pipelines-agent/issues/2866 и https://github.com/Azure/WALinuxAgent/issues/1938#issuecomment-657293920 для получения дополнительной информации.

Пока вы работаете над этим, вы также можете смонтировать /agent на диске ресурсов вашей виртуальной машины, который обычно имеет лучшую производительность, чем диск операционной системы. Для этого вы можете добавить это в свой скрипт инициализации в облаке:

 disk_setup:
  ephemeral0:
    table_type: gpt
    layout: [66, [33,82]]
    overwrite: true

fs_setup:
  - device: ephemeral0.1
    filesystem: ext4

mounts:
  - ["ephemeral0.1", "/agent"]