金丝雀部署及其在DevOps中的作用解释

金丝雀部署是一种软件开发和部署技术,它在将新功能或更新逐步发布给一小部分用户之前,逐步对其进行测试和验证。

这种方法涉及创建软件的新版本,并将其部署给一小组用户,同时保持旧版本对其余用户的运行。开发团队密切监控新版本,以确保其稳定并按预期运行。

如果一切顺利,新版本将逐渐推向更多用户,直到最终覆盖整个用户群体。通过这种方式,项目团队可以最大限度地减少引入错误或其他可能一次性影响所有用户的问题的风险。

金丝雀部署的目的是降低向大型用户群体引入新功能的风险。通过逐步向用户推出更改,开发人员可以监控新版本的性能和稳定性,并在部署给整个用户群体之前进行任何必要的调整。因此,过渡到新版本更加顺畅。

关键原则和优势

来源:martinfowler.com

金丝雀部署的关键原则包括以下内容:

  1. 首先将新版本部署给一小部分用户,然后逐渐将其推广给更多用户。
  2. 密切监控新版本,确保其稳定且按预期运行。
  3. 如果出现任何问题,迅速轻松地回滚到先前的版本。
  4. 尽可能自动化部署过程,以减少人为错误的风险。

金丝雀部署在devops中的优势包括:

  1. 通过逐步推出更改,最小化引入错误或其他可能一次性影响所有用户的问题的风险。
  2. 开发人员可以更快地收到有关新版本的反馈,从而可以在部署给整个用户群体之前进行任何必要的调整。
  3. 通过监控新版本的性能和稳定性,开发人员可以确保其符合必要的质量标准,然后再部署给整个用户群体。
  4. 金丝雀部署有助于增加开发人员和利益相关者对部署过程的信心,因为它减少了引入可能影响用户体验的问题的风险。

基于概念和术语的金丝雀部署

来源:cncf.io

让我们来看看该过程的典型生命周期。

一切都始于金丝雀,也就是系统新版本的“早期采用者”。与此同时,还有一个基准(baseline)群组。其中包括所有不在金丝雀群组内的其他用户。

随着金丝雀用户继续使用新版本,金丝雀部署逐渐扩展到越来越多的用户。这就是流量转移。金丝雀群组增长,而基准群组缩小,因此系统进行了渐进式推出。

沿途,监控过程记录所有活动和使用结果,并生成开发人员需要的反馈指标。然后开发人员会对必要的问题进行修复。或者如果他们此时无法修复问题,他们会回滚到基线。

自动化所有的监控和部署活动。这使得开发人员可以将注意力专注在问题修复上。

也许金丝雀组会发现新版本的某些功能很糟糕,而其他功能则很好。因此,开发人员将标记有问题的功能,以便在部署过程中将其禁用。

开发人员同时注意金丝雀组和基线组。用户正在生成a/b测试结果。这是在相同条件下旧系统和新系统的行为。同时,还有自动化测试不断运行在新系统版本上,以确保金丝雀组的健康检查是稳定的。

与传统部署策略的不同之处

了解高级生命周期过程后,这种部署策略与传统的部署流程之间的差异就很明显。

  • 你逐渐部署并更好地控制,而不是一次性部署给所有人,等待影响整个生产环境的问题。
  • 你将新版本的错误风险限制在金丝雀组内,而不是同时将整个世界暴露在问题中。
  • 你在用户拥有新版本之前就开始监控它,而不是在之后监控它,并将大量的时间和资源投入到发布过程的超级维护阶段。
  • 你可以在完全部署新版本到生产环境之前决定回滚。另一方面,可以在生产发布完成后安排另一个发布窗口来撤销生产。
  • 金丝雀部署自然而然地促使你在可能的情况下投资于自动化工具和流程。另一方面,坚持传统的部署策略自然而然地将所有自动化倡议优先考虑为待办列表的最后一项。

金丝雀部署中的ci/cd流水线

来源:aws.amazon.com

在典型的ci/cd流水线中,更改会自动构建、测试,并部署到一个暂存环境进行进一步测试,然后再部署到生产环境。它也是金丝雀部署的一个完美用例。

一旦更改已部署到暂存环境并通过了所有必要的测试,ci/cd流水线将自动将金丝雀版本部署到生产环境中的一小部分用户中。

如果出现问题,只需运行另一个回滚流水线。或标记有问题的功能,它将永远不会再次出现在部署流程中。所有都是自动化的,你不再需要关心它。

由于金丝雀版本充满了自动化的健康检查测试,所有这些自然地纳入到ci/cd流水线的基本功能中。它们是每个良好的ci/cd流水线必备的一部分。

金丝雀部署的工作流程和阶段

总结这些信息,这是一个典型的金丝雀部署的常规工作流程,您可以在您的项目中使用。

#1. 计划和准备

在这个阶段,开发团队计划和准备金丝雀部署。这包括确定要进行的更改或更新,创建软件的新版本,并定义用于监视新版本性能的指标和健康检查。团队还确定将首先接收新版本的用户子集,并定义推出计划。

#2. 实施流量路由和监控

软件的新版本部署到在规划阶段确定的用户子集中。实施流量路由,将一部分用户流量引导到新版本,同时保持旧版本运行以供其他用户使用。使用指标和健康检查密切监控新版本的性能和稳定性,以确保其表现符合预期。

#3. 分析和评估部署性能

根据计划阶段定义的指标和健康检查,分析和评估新版本的性能。如果新版本表现良好,逐渐增加推出规模,覆盖更多用户。如果新版本出现任何问题,可以快速回滚到先前版本。

#4. 推广或回滚部署

开发团队决定是将新版本推广给整个用户群还是回滚到先前版本。如果新版本表现良好,并符合必要的质量标准,则将其推广给整个用户群。如果新版本出现任何问题,可以快速轻松地回滚到先前版本。

来源:aws.amazon.com

最佳实践和策略

在将金丝雀部署到您的平台时,首先明确目标和成功的标准。您可以通过性能指标、用户反馈标准和业务影响来帮助实现这一目标。

创建一个小的用户子集来测试软件的新(金丝雀)版本。一开始的较大群体并不真正有优势。在开始时,您希望尽可能灵活。

如前所述,使用指标和健康检查监控新版本的性能和稳定性。一旦发现任何可疑情况,及时做出反应。在逐渐推出时,过度反应要比不足反应更好。

逐渐增加新版本的推出规模,覆盖更多用户。这可以确保顺利过渡到新版本。

尽可能使用自动化工具和流程来简化部署和监控过程。将它们纳入ci/cd流水线,并使其成为触发自动化的定期部署过程。这减少了人为错误的风险,并确保部署过程一致可重复。

实现功能标志以启用或禁用软件中的特定功能。这样您就可以在不必总是手动修改或更新的情况下对未来的部署过程进行控制。这使开发人员更加专注于重要的领域-修复错误。

使用a/b测试比较软件的两个不同版本的性能。将随机用户分配给其中一个版本。确定哪个版本的性能更好,并根据此做出未来的开发决策。

确保可以快速回滚部署,以应对新版本出现的任何问题。这将降低任何问题的影响,并允许快速恢复。

挑战和案例研究

尽管灰度发布具有明显的优势,但仍存在一些挑战。

灰度发布的一个挑战是网络延迟,它可能会影响软件的新版本的性能。为了解决这个问题,开发人员可以使用诸如负载均衡器和内容传递网络之类的工具来改善网络性能。这不仅是对外部使用系统的延迟,还包括部署或ci/cd流水线执行的内部流程的延迟。这些流程必须尽快完成。否则,您将有一队开发人员处于空闲状态,等待流水线完成运行。

另一个挑战是确保旧版本和新版本之间的数据一致性。为了解决这个问题,开发人员可以使用数据库复制和同步等技术,以确保数据在所有版本中保持一致。在旧版本和新版本中同时运行的生产用户数量增加了对您确保两个版本始终完全同步且用户不会因为在canary/baseline组中而丢失任何生产数据的期望。这可能是一个非常具有挑战性的期望,因此请在背后拥有坚实的背景流程。

netflix是一个使用灰度发布将更改推出其流媒体服务的知名公司的例子。该公司使用自动化测试、功能标志和a/b测试的组合来逐步推出更改。

google是另一个使用灰度发布将更改推出其云服务的公司的例子。同样,该公司利用自动化测试、流量分割和监控的好处,在部署给所有用户之前逐步将更改推出到一小部分用户。这种方法帮助google提高了其服务的质量和稳定性。

最后的话

与所有的流程、方法或策略一样,灰度发布并非世界上的万能解决方案。有些情况下,由于环境限制、人们的知识或对概念理解的普遍缺乏,实施灰度发布几乎是不可能的。

t 是新时代项目的理想选择。在这种项目中,敏捷思维是坚实的基本属性,每个流程的自动化是毫无疑问的优先事项,而最高水平的可靠性是利益相关者的强烈期望。

在这种情况下,金丝雀部署在某种程度上是敏捷开发实践的下一个级别。它可以将团队提升到项目从未到达过的领域。

接下来,请查看缩放和优化 ci/cd。

类似文章