1

我们在 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

4

3 回答 3

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 映像。

于 2020-04-01T15:41:38.640 回答
0

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

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

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

检查此线程以获取更多详细信息。

希望这可以帮助。

于 2020-03-30T04:03:21.373 回答
0

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

在此处输入图像描述

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

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

编辑

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

于 2020-03-27T13:30:02.997 回答