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

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

У нас есть 3 реплики, использующие StatefulSet, который монтирует постоянный том (PV) для использования кэша docker. Это означает, что /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 ]

1 голос
/ 01 апреля 2020

Мы получили другое решение: от Docker in docker (dind) до Docker за пределами docker (DooD).

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

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

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

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

https://docs.microsoft.com/en-us/azure/devops/pipelines/agents/docker?view=azure-devops#using - docker -within-a- docker -container

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

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

0 голосов
/ 30 марта 2020

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

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

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

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

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

0 голосов
/ 27 марта 2020

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

enter image description here

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

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

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

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

...