目前,我有一个GoCD构建代理的AutoScaling组(ASG),没有任何扩展策略。我创建了一些自定义指标,这些指标指示当前有多少个构建代理处于空闲状态,我希望以此为基础进行扩展。我担心的是,按比例缩小时,ASG可能会终止构建中间的实例。这可能会导致构建失败并延迟构建。

如何缩小ASG而不终止正在使用的实例?

评论

您是否尝试缩小规模?如果为真,结果如何?

我还没有。我不能冒险终止生产中的实际构建,而且不幸的是,我没有一个很好的测试环境。但是,我知道ASG会随机选择要终止的实例(它将如何知道哪些实例正在运行构建?),因此我非常有信心这是一个实际问题。我非常强调不要冒险终止构建,因为对我而言,构建/发布速度是我们工程部门最重要的事情之一。

#1 楼

Auto Scaling组对此有一个有用的功能,称为生命周期挂钩。

上一文档中提到的工作流:



您会注意到有一个“缩放”步骤,触发“终止”:等待自动缩放组并通知实例终止,该实例现在必须完成工作,一旦完成,就可以终止。

如果任务花费的时间比自动缩放组HeartbeatTimeout参数的时间长,则可以使用以下命令重置超时(仍在同一页面中引用):


通过记录心跳来重新启动超时时间,方法是使用
record-lifecycle-action-heartbeat命令或
RecordLifecycleActionHeartbeat操作。这会将
心跳超时增加创建
生命周期挂钩时指定的超时值。例如,如果超时值为1小时,而您
在30分钟后调用此命令,则实例将在等待状态下再等待一个小时,或总共90分钟。 >

因此,就您的情况而言,生命周期通知应启动一种脚本/程序,该脚本/程序将:


防止此构建器接收新的构建
定期循环以检查正在进行的构建是否已完成
,如果仍在构建中并且超时已临近,请重置计时器
,如果没有更多的构建在进行中,则发出继续终止的信号


#2 楼


我担心的是,按比例缩小时,ASG可能会终止构建中间的实例。


构建正在运行,则应该防止缩小。构建完成后,由于不再需要资源,因此可能会缩减规模。

评论


您能否详细说明>应该防止缩小比例?您是否建议在任何代理上运行构建时禁用扩展功能?当只有几个构建正在运行时,这将导致在4:00 pm出现大量空闲代理。我将使用哪种机制来触发缩放比例禁用?此外,GoCD代理在每个VM上运行一个构建需要相当长的启动时间,因此我更喜欢至少有一个很小的空闲实例缓冲区。

–user2640621
17-10-29在22:55

#3 楼

我想我们在这里有一个答案。使用GOCD API可以对其进行管理。 https://amaysim.engineering/auto-scaling-build-agents-for-gocdtags-a10f12d5b77c

评论


欢迎DevOps!请注意,仅链接的答案被认为质量很差(链接可能会失效)。强烈建议在帖子本身中添加引用内容中的简短摘要或相关信息的引用。

–丹·科尼莱斯库(Dan Cornilescu)
18年5月28日在14:02