Можно ли распределить нагрузку конвейера между всеми существующими агентами в пуле агентов Azure DevOps?

Мы создали собственных агентов на собственном хостинге в кластере AKS.

У нас есть 3 реплики, использующие StatefulSet, который монтирует постоянный том (PV) для использования кеша докера. Это значит, что/var/lib/docker это крепление на каждую реплику.

До тех пор, пока все нормально не работает.

Однако похоже, что agent-0 делает большую часть работы, пока agent-1 а также agent-2работают намного меньше. Это вызывает проблему, так какPV-0 почти использует всю свою мощность и PV-1 а также PV-2 нет:

agent-0
/dev/sdc                 98.3G     83.8G     14.5G  85% /var/lib/docker
agent-1
/dev/sdd                 98.3G     35.3G     63.0G  36% /var/lib/docker
agent-2 
/dev/sdc                 98.3G      2.1G     96.2G   2% /var/lib/docker

Есть ли способ управлять конвейерами Azure DevOps так, чтобы нагрузка распределялась между агентами вместо того, чтобы всегда использовать agent-0?

3 ответа

Мы пришли к другому решению, перейдя от Docker в docker (dind) к Docker вне docker (DooD).

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

В какой-то момент мы подумали, что нам нужно будет поддерживать образы на основе ARM и начать использовать docker buildx, что заставило нас использовать решение docker dind.

Мы осознаем риск, связанный с установкой docker.sock:

Чтобы использовать Docker из контейнера Docker, вам необходимо подключить сокет Docker. Это имеет очень серьезные последствия для безопасности, а именно: код внутри контейнера теперь может запускаться от имени пользователя root на вашем хосте Docker. Если вы уверены, что хотите это сделать, см. Документацию по монтированию привязки на Docker.com.

https://docs.microsoft.com/en-us/azure/devops/pipelines/agents/docker?view=azure-devops

Но на данный момент это решает нашу проблему, поскольку нам не нужно будет управлять PV для каждого модуля, а мы будем использовать одно и то же докер для создания всех наших образов без поддержки ARM.

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

Что вы можете попробовать, так это настроить мультиагент для вашего задания агента и тип 3 для ваших 3 агентов, если вы хотите распределить нагрузку:

Я также думаю, что он будет использовать только количество агентов, соответствующее количеству ваших параллельных заданий в вашей организации. Как указано здесь:

Каждый агент может одновременно выполнять только одно задание. Для параллельного выполнения нескольких заданий необходимо настроить несколько агентов. Вам также потребуется достаточное количество параллельных работ.

РЕДАКТИРОВАТЬ

Предложенный выше метод работает только с задачами, поддерживающими нарезку. В противном случае это будет просто параллельное выполнение. Если ваши задачи не поддерживают нарезку, но у вас есть независимые задачи в конвейере, вы можете разделить задание агента на 2 или более, не устанавливая зависимость от предыдущего задания, и задания будут выполняться параллельно, если у вас достаточно параллельных заданий.

Есть ли способ управлять конвейерами Azure DevOps, чтобы нагрузка распределялась между агентами вместо того, чтобы всегда использовать агент 0?

Боюсь, что нет такого нестандартного способа управления рабочими нагрузками сборки / выпуска для равномерного распределения между всеми агентами, если бы мы не могли использовать функцию мультиагента.

В качестве обходного пути мы могли бы клонировать наш конвейер / задание на три, каждое с разными требованиями. Затем установите настраиваемые возможности, определенные для агентов:

Проверьте эту ветку для получения более подробной информации.

Надеюсь это поможет.

Другие вопросы по тегам