Spinnaker实战:云原生多云环境的持续部署方案
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

3.3 应用程序部署

Spinnaker的应用程序部署主要通过构建部署流水线来管理持续部署的工作流程。

一个完整的持续部署工作流程一般包括流水线、阶段、任务。

3.3.1 流水线

流水线(Pipeline)是用于描述持续部署具体行为的载体。例如,在Spinnaker中,一条典型的流水线如图3-3所示。

图3-3 Spinnaker中的典型流水线

流水线是Spinnaker管理部署的关键结构,它由一系列不同类型的自动化行为组成,称为阶段(Stage),流水线的各阶段可以相互传递参数、共享上下文。

在流水线启动阶段,可以由不同的事件进行触发启动,比如手动触发启动或由事件自动触发。例如,在Jenkins完成持续集成流程后触发,或当镜像仓库推送了新的镜像之后触发,以及自动定时触发等。

当流水线开始启动、完成或失败时,还可以配置通知发送给相关人员。

3.3.2 阶段

正如前文所述,阶段(Stage)是用于描述流水线中具体的并有顺序的执行动作,这些动作可以通过编排实现并行或串行执行,并能够按需求对各阶段的执行顺序进行排序。编排的阶段集合组成一条持续部署流水线,如图3-3所示,每个圆圈都代表一个阶段。

Spinnaker提供了许多内置的阶段,例如部署、伸缩服务器组、禁用服务器组和人工确认等,后续章节将详细阐述不同阶段实现的功能。

3.3.3 任务

任务(Task)是Spinnaker针对每个阶段自动执行的一系列步骤,对特定的阶段具有特定的任务。对用户来说,只需要专注于阶段类型并了解阶段所运行的具体任务,如图3-4所示。

图3-4 阶段和任务

在图3-4中,蓝绿部署阶段会运行一系列的有序步骤来完成阶段的功能,而每个步骤又会完成一系列任务。这些任务通常是对特定云平台API进行多次调用,通过相应的云平台对状态进行同步更新。

3.3.4 部署策略

Spinnaker内置了几种常见的部署策略,包括蓝绿部署、滚动部署、金丝雀部署。这些部署策略及其流量管理如图3-5所示。

图3-5 Spinnaker部署策略及其流量管理

蓝绿部署是一种典型的零中断的发布策略,通过冗余的方式实现。在生产环境中,准备两组用于发布的集群,其中一个集群是正在为线上提供服务的“绿色环境”,另一组是不承担流量的“蓝色环境”。当服务更新时,先更新绿色环境,经过测试验证后,将负载均衡器或反向代理(Nginx)的路由直接指向蓝色环境。同时,绿色环境继续保留为冗余,便于快速回滚。

滚动部署的策略是每次按一定的比例,从生产集群中取出一个或多个实例进行更新,更新完成后,立即投入集群中对外服务,循环此流程,直至集群中的全部实例更新完毕。与蓝绿部署相比,这种部署方式不需要额外的冗余集群,更节约资源。同时缺点也显而易见,更新后的新版本不一定符合预期,但却已经对外提供服务,如果发布异常,集群内将混合着新老版本的部署方式,执行回滚操作会更加复杂。

金丝雀部署又称为“灰度发布”,一般要求入口网关具有流量的控制能力。具体的做法是在原有生产环境的基础上,同时部署一套新版本的服务作为“灰度环境”,此灰度环境并不直接对外提供服务,而是由网关层按照一定比例控制或筛选特殊的流量进入灰度环境。例如,配置90%的流量进入原生产环境,10%的流量进入灰度环境,同时观察灰度环境的性能和指标,得到正向反馈后,进一步加大进入灰度环境的流量比例,直至将所有的用户迁移到新的版本。除了简单的流量比例控制,灰度发布还能够对流量进行更细粒度的控制。例如,对特定的Header或Cookie进行控制,实现类似针对不同性别、不同地区或特定用户画像类型先体验灰度环境的部署策略。

金丝雀的测试手段最早起源于17世纪,英国的矿工们发现金丝雀对瓦斯气体极为敏感。当空气中含有微量的瓦斯时,虽然人类毫无察觉,但金丝雀会毒发身亡。因此矿工们利用这个特性,将金丝雀作为测量瓦斯安全的工具。

针对不同的云提供商,Spinnaker对部署策略的支持有一定的差异。例如,Kubernetes原生支持蓝绿发布,Spinnaker仅提供标准的清单(Manifest)部署;对于虚拟机而言,更多的是利用不同共有云提供商的特性来实现。例如在AWS中,Spinnaker利用伸缩组(AutoScaling Group)来创建服务器集群,一旦新版本通过测试,则将ELB(负载均衡)直接指向新的服务器集群,从而完成蓝绿部署。