仪注
Deploy!=Relea(第⼀部分):部署与发布的区别,以及为什
么这很重要
原⽂地址:
翻译⾃:
问:「最新版本部署了吗?」
答:「我在⽣产环境⾥部署了 gif 动图⽀持。」
问:「就是说 gif 动图⽀持已经发布啦?」
答:「Gif 动图的发布版本已经部署了。」
问:「……」
我曾在很多公司⼯作过,在这些公司中「部署(deploy,动词)」、「部署物(deployment,名词)」、「上线(ship)」和「发布(relea)」都是随意地使⽤,甚⾄可以互换使⽤。作为⼀个⾏业,我们在规范使⽤这些术语⽅⾯做得还不够,尽管我们在过去的⼗多年⾥已经从根本上改进了运维实
践和⼯具。在中,我们使⽤了「上线」、「部署」、「发布」和「回滚(rollback)」的精确定义,并花了⼤量的时间来思考当你把「发布」作为上线过程的⼀个独⽴阶段时,世界是什么样⼦的。在这篇⽂章的第⼀部分,我会分享这些术语的定义,描述⼀些常见的「部署 == 发布」的实践,并且解释为什么这样做的抗风险性很差。在第⼆部分,我会描述当「部署」和「发布」被视为软件上线周期的不同阶段时的⼀些⾮常强⼤的风险缓释技术。
上线
数学证明题上线指你的团队从源码管理库中获取服务代码某个版本的快照,并⽤它处理线上流量的过程。我认为整个上线过程由四个不同的专门的⼩流程组成:构建(build)、测试、部署和发布。得益于云基础架构、容器、编配框架的技术进步以及流程改进,如、和,执⾏前三个流程(构建,测试和部署)从未如此简单。
部署
劝学原文及翻译部署指你的团队在⽣产环境的基础设置中安装新版本服务代码的过程。当我们说新版软件被部署时,我们的意思是它正在⽣产环境的基础设施的某个地⽅运⾏。基础设置可以是 AWS 上的⼀个新启动的 EC2 实例,也可以是在数据中⼼的 Kubernetes 集群中的某个容器中运⾏的⼀个 Docker 容器。你软件已成功启动,通过了健康检查,并且已准备好(像你希望的那样!)来处理线上流量,但实际上可
能没有收到任何流量。这是⼀个重要的观点,所以我会⽤ Medium 超棒的⼤引⽤格式来重复⼀遍:
部署不需要向⽤户提供新版本的服务。
根据这个定义,部署可以是⼏乎零风险的活动。诚然,在部署过程中可能会出现很多问题,但是如果⼀个容器静默应对崩溃,并且没有⽤户获得 500 状态响应,那问题是否真的算是发⽣了?
部署了新的版本(紫⾊),但未发布。已知良好的版本(绿⾊)仍对线上请求做出响应。
网络缩写发布
当我们说服务版本发布时,我们的意思是它负责服务线上流量。在动词形式中,发布是将线上流量转移到新版本的过程。鉴于这个定义,与上线新的⼆进制⽂件有关的所有风险 —— 服务中断、愤怒的⽤户、中的刻薄内容 —— 与新软件的发布⽽不是部署有关。在⼀些公司,我听说这个上线阶段被称为⾸次发布(rollout)。这篇⽂章中我们将依旧使⽤发布来表述。
新版本发布,响应线上请求。
回滚
迟早,很可能不久之后,你的团队就会上线⼀些功能有问题的服务。回滚(和它危险的、不可预测的、压⼒⼭⼤的兄弟 —— 前滚 roll-forward)指将线上服务退回到某个已知状态的过程,通常是重新发布最近的版本。将回滚视为另⼀个部署和发布流程有助于理解,唯⼀的区别是:
你正在上线的版本的特征在⽣产环境中已知
你正在时间压⼒下执⾏部署和发布过程
公益口号你可能正向⼀个不同的环境中发布 —— 在上次失败的发布之后某些东西可能改变了(或被改变了)从化
⼀个发布后回滚的例⼦。
现在我们已经就上线、部署、发布和回滚的定义达成了共识,让我们来看看⼀些常见的部署和发布实践。
原地发布(即部署 == 发布)
当你的团队的上线流程涉及将新版本的软件推送到运⾏旧版本的服务器上并重启服务的流程时,你就是在原地发布。根据我们上⾯的定义,部署和发布是同时发⽣的:⼀旦新软件开始运⾏(部署),它就会负载旧版本的所有线上流量(发布)。此时,成功的部署就是成功的发布,失败的部署则会带来部分或整体的服务中断,⼀群愤怒的⽤户,可能还有⼀个⽓急败坏的经理。
在我们所讨论的部署/发布过程中,原地发布是唯⼀的将部署风险暴露给⽤户的⽅式。如果你刚刚部署的新版本⽆法启动 —— 可能是因为⽆法找到新增的环境变量⽽抛出异常,也可能是有⼀个库依赖不满⾜,或者只是你今天出门时没看黄历 —— 此时并没有⽼版本的服务实例来负载⽤户请求。你的服务此时⾄少是部分不可⽤的。
此外,如果有⽤户相关的问题或更微妙的运维问题 —— 我把它叫做发布风险 —— 原地发布会将线上请求暴露给你已发布的所有实例。
在集群环境中,您可能会⾸先原地发布⼀个实例。这种做法通常称为⾦丝雀发布,它可以减轻⼀些风险 —— ⾯临部署风险和发布风险的流量的百分⽐为:新服务实例的个数除以集群中的实例总数。
⼀个⾦丝雀发布:集群中的⼀个主机运⾏新版本
最后,回滚错误的原地部署可能会有问题。即使你回滚(重新发布)到旧版本,也⽆法保证可以恢复到以前的系统状态。与当前错误的部署⼀样,你的回滚部署在启动时也可能会失败。
尽管其风险管理相对较差 —— 即便使⽤⾦丝雀,⼀些⽤户请求也会⾯临部署风险 —— 原地部署仍旧是业务中常见的⽅式。我认为这类的经验会导致不幸地混⽤「部署」和「发布」这两个术语。
别绝望
我们可以做得更好!在,我们会讨论分离部署和发布的策略,以及可以在复杂的发布系统上构建的⼀些强⼤⼯作流。
我是的⼀名⼯程师,我们正在构建,这个服务可以轻松构建和监控复杂的实时发布⼯作流程。如果你想轻松地上线更多服务,你绝对应该。我们很乐意与你交谈。
感谢 Glen Sanford、Mark McBride、Emily Pinkerton、Brook Shelley、Sara 和 Jenn Gillespie 阅读此⽂的草稿。
醉驾如何处罚感谢。
翻译⾃:
包粽子的步骤问:「最新版本部署了吗?」
答:「我在⽣产环境⾥部署了 gif 动图⽀持。」
问:「就是说 gif 动图⽀持已经发布啦?」
答:「Gif 动图的发布版本已经部署了。」
问:「……」