【问题标题】:Is it possible to spread pipeline load between all of the existing agents within the Azure DevOps agent pool?是否可以在 Azure DevOps 代理池中的所有现有代理之间分散管道负载?
【发布时间】:2020-04-01 23:41:38
【问题描述】:

我们在 AKS 集群上创建了自己的自托管代理。

我们有 3 个副本,使用 StatefulSet 挂载持久卷 (PV) 以使用 docker 的缓存。这意味着/var/lib/docker 是每个副本上的挂载。

直到一切正常。

但是,agent-0 似乎完成了大部分工作,而 agent-1agent-2 的工作量要少得多。这会导致问题,因为PV-0 几乎使用了它的全部容量,而PV-1PV-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

【问题讨论】:

  • 有趣的概念。您在组织中有多少并行工作?
  • @MarioDietner - 这取决于。有时可能超过 4 个,但通常并行运行 1-2 个作业。只是为了确保,我担心的不是并行性,而是决定哪个代理接手下一份工作的因素
  • afaik 我们无法控制池中的下一个代理。但我们可以通过设置代理需求(能力)来影响。但是,如果您担心均匀分布,请尝试将一些管道重新设计为多作业管道,以在一项作业中使用尽可能少的负载,并尽可能使用非依赖作业。还要确保您的托管代理有足够的并行作业。
  • @LeoLiu-MSFT 我已经回复了我们决定采用的解决方案

标签: azure azure-devops azure-devops-self-hosted-agent


【解决方案1】:

我们最终得到了一个不同的解决方案,从 Docker 中的 Docker (dind) 迁移到 docker 之外的 Docker (DooD)。

我们最初想要使用我们自己的自托管代理的主要原因是需要 docker 层缓存,因为使用托管代理构建 docker 映像需要太多时间。

在某些时候,我们认为我们必须支持基于 ARM 的映像,并开始使用docker buildx,这使我们使用了 docker dind 解决方案。

我们知道安装 docker.sock 包含的风险:

为了在 Docker 容器中使用 Docker,您需要绑定挂载 Docker 套接字。这具有非常严重的安全隐患——即容器内的代码现在可以在您的 Docker 主机上以 root 身份运行。如果您确定要这样做,请参阅 Docker.com 上的绑定安装文档。

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

但目前,这解决了我们的问题,因为我们不必管理每个 pod 的 PV,而是使用同一个 docker 来构建我们所有的非 ARM 映像。

附注:对于 ARM,我们仍将使用不同的代理,它将运行 docker buildx 以构建 docker 映像。

【讨论】:

    【解决方案2】:

    如果您想分散负载,您可以尝试为您的代理作业配置多代理并为您的 3 个代理键入 3:

    我还认为它只会消耗与您组织的并行作业计数相对应的代理数量。如here所述:

    每个代理一次只能运行一项作业。在中运行多个作业 并行您必须配置多个代理。你还需要足够的 并行作业。

    编辑

    上述建议的方法仅适用于支持slicing 的任务。否则它将只是并行执行相同的执行。如果您的任务不支持切片,但您的管道中有独立的任务,您可以将代理作业拆分为 2 个或更多,而无需设置对先前作业的依赖,如果您有足够的并行作业,这些作业将并行运行。

    【讨论】:

    • 我们没有使用切片。我们的大部分工作都依赖于单元测试的成功,而大多数单元测试使用 Docker 镜像
    【解决方案3】:

    有没有办法控制 Azure DevOps 的管道,以便在代理之间分散负载,而不是始终使用 agent-0?

    如果我们不能使用多代理功能,恐怕没有这种开箱即用的方式来控制构建/发布工作负载均匀分布到所有代理。

    作为解决方法,我们可以将我们的管道/作业克隆为三个,每个都有不同的需求。然后设置为代理定义的自定义功能:

    查看this thread了解更多详情。

    希望这会有所帮助。

    【讨论】:

      猜你喜欢
      • 2019-12-12
      • 1970-01-01
      • 2019-02-21
      • 2019-06-06
      • 2022-11-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多