配置缩放

配置缩放设置以管理托管 DevOps 池的性能和成本。 有关定价和性能的信息,请参阅管理成本和性能

代理状态

托管 DevOps 池可以配置为无状态或有状态。

托管 DevOps 池的默认设置是无状态(每次都是新代理),但在某些情况下,团队可能希望重用代理,以便重用先前管道运行期间创建的包或文件。 生成工作负荷是团队希望保留状态并重用代理的常见场景。 可以通过托管 DevOps 池实现有状态池,同时兼顾安全最佳做法。 默认情况下,代理最多可以重用 7 天,但可以将其配置为更早地回收。

注意

安全专家建议使用无状态池或“每次都是新代理”的代理状态设置,以防御供应链攻击。

无状态池

配置无状态代理后,会为每个作业获取新代理,并在作业完成后丢弃。

有关无状态代理的生命周期以及如何在 Azure Pipelines 中使用的说明(包括分配中的潜在延迟),请参阅以下 代理生命周期和分配部分中的潜在延迟

无状态代理的屏幕截图。

当“代理状态”设置为“每次都是新代理”时,会为每个作业获取新代理,并在作业完成后丢弃。

有状态池

有状态代理的屏幕截图。

当启用多个生成可以使用同一代理(在资源模板中为 "kind": "stateful" 或在 Azure CLI 中为 { "stateful": {...} })时,池中的代理被视为有状态的。 通过以下设置配置有状态池。

  • 备用代理的最长生存期 (maxAgentLifetime) 配置有状态池中代理在关闭和丢弃之前可以运行的最长持续时间。 备用代理的最长生存期格式为 dd.hh:mm:ss备用代理的最长生存期默认值设置为允许的最大持续时间 7 天 (7.00:00:00)。

    重要说明

    如果作业在 备用代理最长生存时间 到期时运行,除非作业运行时间超过两天,否则代理在作业完成之前不会关闭。 托管 DevOps 池中的单个作业最多可以运行两天,即使它们在备用代理上运行,而备用代理的最长生存期配置为超过两天也是如此。 如果工作流需要运行一个需要两天以上才能完成的单个作业,请联系支持人员。

  • 宽限期 (gracePeriodTimeSpan) 配置有状态池中代理在所有当前和排队的作业完成后关闭之前等待新作业的时间量。 宽限期的格式为 dd.hh:mm:ss,默认值为无宽限期。

无状态池中的代理在每个作业后都会关闭并丢弃,而有状态池中的代理在满足以下任一条件时会继续运行。

  • 如果第一个作业完成时有另一个作业在排队,托管 DevOps 池会将该作业发送到运行第一个作业的代理,而不是关闭它。
  • 如果为池配置了宽限期,代理会在关闭之前等待宽限期指定的持续时间的新作业。
  • 如果启用了备用代理,并且代理映像符合活动预配期的条件,代理会继续运行并等待作业。

有状态池中运行的代理如果连续运行达到备用代理最长生存期指定的持续时间,即使满足上述条件,也会被关闭并丢弃。 例如,如果备用代理的最长生存期配置为三天,并且备用代理模式设置为手动、全周方案(计算机 24/7 可用),则代理在连续运行三天后会重启。

重要说明

如果没有宽限期、备用代理没有活动预配期,并且没有与代理匹配的排队作业,有状态池中的代理在作业完成后仍然可以关闭并丢弃。 代理一旦被丢弃,所有状态都会丢失。

宽限期为具有稳定负载的管道提供了运行有状态池的最具成本效益的方式,并且不需要使用备用代理模式来保持代理在线并准备好接受作业。

备用代理模式

创建池时,备用代理模式默认处于关闭状态,没有备用代理可立即分配给管道,管道可能需要等待一段时间(最多 15 分钟)才能按需预配代理。 为了获得更好的性能,请启用备用代理模式并配置为工作负荷提供容量的备用代理计划。

配置备用代理计划时,托管 DevOps 池会定期将预配代理计数与当前预配方案指定的备用代理计数进行比较,并根据需要启动新代理来维护备用代理计数。 可以在 代理 窗格中查看池中代理的当前状态和计数。

重要说明

方案中的预配计数不能大于池设置中配置的最大代理数

备用代理模式使用以下设置进行配置:

  • 关闭 - 备用代理模式处于关闭状态,作业排队时会按需预配代理。
  • 手动 - 配置手动备用计划。
  • 自动 - 使用基于代理使用历史记录的自动备用计划,可针对成本和性能进行配置。

备用代理模式选择的屏幕截图。

手动

手动模式最适合了解其 CI/CD 管道使用模式的团队。 如果选择手动选项,需要根据对池中代理最可能被使用的时间以及可能使用的代理数量的了解来定义预配方案,并指定满足预计需求的代理预配计数。

可以创建自己的预配计划或从预定义计划中选择,还可以配置用于指定计划的时区。 预配时区的默认值为 (UTC) 协调世界时

手动备用代理配置可以通过以下三种方式之一进行配置。

除了该快速入门的特定设置外,每个预配快速入门都有以下通用设置。

  • 预配时区允许你为预配方案中的时间配置时区。 预配时区的默认值为 (UTC) 协调世界时
  • 备用代理百分比配置每个映像所需的备用代理百分比。 可以输入 * 以确保所有映像都被平等预配,或者可以指定 0 到 100 之间的整数来表示百分比。 如果指定百分比,所有映像的总和必须等于 100。 如果只有一个映像,请指定 * 或 100。 使用 ARM 模板时,备用代理百分比images 部分中配置。 有关详细信息,请参阅配置映像

手动备用模式的屏幕截图。

从头开始

如果选择从头开始,可以添加预配时段列表作为预配方案。 每个预配时段包括开始日、结束日、时区、开始时间、结束时间和计数。 预配时段不能相互重叠。

属性 说明
多日 选中后,可以为预配方案配置开始日和结束日。
直到下一个时段 选中后,预配时段从开始时间运行到下一个预配时段的开始。
开始日 预配时段开始的日期。
结束日 预配时段结束的日期。 如果选中多日,则为必填项。
开始时间 预配时段开始的时间。
结束时间 预配时段结束的时间。 除非选中直到下一个时段,否则为必填项。
计数 要预配的备用代理数量。 此数字必须大于零,且不得大于池设置中配置的最大代理值。

创建预配时段后,可以从预配方案列表中删除或编辑该时段。

以下示例配置一个手动方案,在周一早上从美国东部时间午夜 12:00 到凌晨 5:00 预配 1 个代理。

手动缩放方案的屏幕截图。

工作日方案

如果选择工作日方案,可以指定每周工作日中指定数量的备用代理将处于备用状态的开始时间和结束时间。

属性 说明
开始时间 预配时段开始的时间。
结束时间 预配时段结束的时间。
预配计数 要预配的备用代理数量。 此数字必须大于零,且不得大于池设置中配置的最大代理值。

以下示例配置四个代理在工作时间使用,在非工作时间和周末使用 0 个代理,使用东部标准时间。

工作日方案的屏幕截图。

全周方案

如果选择全周方案,可以指定要 24/7 可用的代理数量。

全周方案的屏幕截图。

自动

如果不了解自己的使用模式,并且希望依赖基于过去数据的自动预测,请选择“自动”。 可以使用带有以下五个选项的滑块在成本和代理性能之间取得平衡。 托管 DevOps 池对过去三周的历史数据(如果可用)运行查询,将池的排队会话组织为五分钟时段,并为每个小时分配指定的百分位数(以避免峰值)。

  • 最具成本效益 (MostCostEffective) - 第 10 个百分位数
  • 更具成本效益 (MoreCostEffective) - 第 25 个百分位数
  • 平衡(默认)(Balanced) - 第 50 个百分位数
  • 更高性能 (MorePerformance) - 第 75 个百分位数
  • 最佳性能 (BestPerformance) - 第 90 个百分位数

自动缩放设置的屏幕截图。

代理的生命周期和分配的潜在延迟

使用 无状态 方案的备用代理需要安装并配置 Azure Pipelines 代理,然后才能从 就绪 状态过渡到 已分配 状态并运行管道。 当托管 DevOps 池预配新代理时,它会尝试下载最新的 Azure Pipelines 代理 ,以便在备用代理过渡到就绪状态之前将其下载到备用代理上。 启动、连接和开始工作可能需要 10 秒到 1 分钟的时间,具体取决于池的 SKU 速度、使用的映像和网络负载。 此外,管道作业中的某些设置可能会导致重新加载和运行不同的代理,代理的回归和回滚也会导致重新加载代理。 就绪代理 将始终有潜在的延迟,因为托管 DevOps 池以“临时”方式使用此代理,这意味着我们启动并运行任务代理每次作业一次。

如果发现现成代理从 Azure DevOps 获取作业时出现延迟,请务必考虑以下事项:

  • 是否已准备好代理? - 最常见的问题是对何时应预先预配代理的误解。 当排队的作业数大于池中的备用代理数,或者作业排队超出预先配置的计划时,当备用代理数设置为空时,必须从头开始启动计算机。
  • 你是否正确配置具有多个镜像的备用代理? - 如果没有使用 ImageOverride 需求指定在管道中使用哪个映像,则作业将针对第一个映像。 这意味着,根据你的缩放设置,你可能没有像预期的那样多的可用代理,因为有些代理被分配给了其他映像。
  • 是否在你的管道中使用 ImageVersionOverride? 当使用 ImageVersionOverride 指定一个与 池设置中配置不同的映像版本时,每个代理程序都会使用该指定的映像版本按需启动。 备用代理会使用池配置中指定的映像版本进行配置,因此如果使用ImageVersionOverride,任何备用代理都不会匹配该版本,需启动一个新的代理。
  • 代理/VNet/防火墙设置是否会降低池速度? - 任何网络设置的潜在缓慢都会导致代理花费更长时间启动代理并将其连接到 Azure DevOps。
  • 是否要覆盖代理版本? - 默认情况下,托管 DevOps 池将在最新的 Azure DevOps 任务代理版本上运行。 管道 yaml 中的设置(例如 Agent.Version 需求)和 Azure DevOps 组织设置可以强制管道使用旧版本的任务代理,要求在分配计算机后重新下载。

另请参阅