【演讲PDF】: https://yq.aliyun.com/attachment/download/?id=1837
【演讲视频】: https://yq.aliyun.com/edu/lesson/551研发和传统基础设施交互方式
通常情况下,在开发过程中需要和基础设施打交道,需要在项目中申请开发、测试以及预发生产环境。在IDC时代,我们需要向IT部门申请这些资源,其批准后,我们才能获得这些资源。如果这些资源恰巧不足,我们只能等待购买新的资源或者更换其他资源。
当拿到这些资源之后,需要对开发、测试、预发、生产环境进行四次相同的配置;当应用架构做了调整之后,需要对相应的四个环境进行变更以保证一致性。这个过程对于IT和研发人员来讲是比较痛苦的过程;而且,由于应用是一个不断迭代的过程,因此这种痛苦也是比较持续的过程。
DevOps
那究竟有没有一种方式能够让我们快速获取基础设施?能够方便管理基础设施?能够优雅变更基础设置?能够持续集成基础设施呢?
答案是DevOps。DevOps的出现为解决上述问题带来了曙光。
DevOps整合了以前割裂的研发和运维,它要求研发做到开发敏捷化、精益化、流程自动化,并且能够持续集成、持续交付,对于较大的项目要求其能够切割成几个快速交付的小项目。
但是,DevOps只是提供了指导思想,而不是具体的解决方案。那具体应该怎么做呢?答案是云计算。云计算给我们带来了前所未有的便捷性。目前,阿里云提供了七十多种云产品,用户可以根据自己的需求来获取这些资源,随时购买、随时释放。
阿里云提供了两种方式便于用户去获取它们:一是通过WebUI获取配置资源;二是集成各产品openAPI的方式获取配置资源。前者是一种手动的方式,当需要的产品较多时,该方式不可行;而后一种方式要求运维人员具有一定的开发经验才能配置,还需要知道每一个openAPI的细节,增加了项目开发量,并且,当需要集成的产品较多时,所需的openAPI也就随之增加,进而导致代码越发臃肿,对这些代码的运维和持续集成都是不小的挑战;另外,通过openAPI方式获取的配置资源是混合在一起的,没有区分开发、测试环境,有可能会导致一些误操作。
那么有没有一种更好的集成方式呢?
答案是肯定的。阿里云提供了资源编排服务,该服务能够让我们把基础设施架构完全模板化,(模板是JSON格式的文本文件,在该文本文件中,可以通过声明的方式定义资源需求、说明资源依赖关系和配置细节);之后将模板提交到编排引擎,编排引擎会根据模板中提供的信息创建资源栈,我们可以通过资源栈这一视角,管理资源,可以做到权限控制、资源升级,以及根据应用的需求进行扩容和缩容的操作。
相较于之前提到的openAPI集成的方式,资源编排这种方式不要求运维人员具有开发经验,它采用声明的方式定义资源以及资源之间的关系,易于编写;由于模板是文本文件,因此可以通过代码的方式对模板进行版本控制;此外,资源编排帮助大家屏蔽了集成openAPI所要考虑的细节问题,可以做到通过模板自动化构建一组资源,无需人工值守,是0部署的过程;最后,由于资源编排所创建的资源全部归属一个资源栈,因此可以根据资源栈进行软件生命周期的管理、监控、报警。
基础设施即代码
当基础设施可以通过文本文件表述时,那就可以利用研发的经验对基础设施进行开发。将基础设施架构转化为模板的过程就相当于研发中Coding的过程:提交模板之后,再让其他同事Review该模板,然后再将模板提交到SVN、GIT库中进行版本控制。这样一来,相较于以前手动进行资源变更,资源编排实现了将一切纳入版本控制之下,像测试你的程序一样测试模板。
资源编排能在哪些场景下提高研发效率呢?下面来看几个具体的场景。
场景1:快速构建基础设施
在研发过程中通常需要构建开发、测试、生产以及预发环境。这四个环境的基本架构相同,只是各个环境中的网络配置存在差异,因此我们可以将这四个环境转化为一个模板。在模板中,根据不同的生产环境配置不同的网络参数,也就是通过一个模板生成四种不同的环境。例如,要生产开发环境时,在提交模板到编排引擎的同时指定需要生成的是开发环境,编排引擎则会根据模板中的信息生成开发环境,当需要生成生产环境时,只需修改对应的参数即可。总结来说,就是可以通过基础设施模板随时随地地生成各类环境,进而提升研发效能。
场景2:方便管理基础设施
如上图所示生产环境资源栈、预发环境资源栈、测试环境资源栈、开发环境资源栈架构类似,都是高可用、高安全的环境。尽管这四个环境的用处不同,但其基础架构却保持高度一致。
那么如何保障这四个环境的一致性以及它们的运维管理呢?
如果采用手动的方式配置环境一致性,容易导致环境之间的不一致,进而在测试时出现一些问题,浪费研发人员的精力。通过资源编排可以保证这些环境的一致性,也就是通过相同的模板生成开发、测试、生产、预发环境,进而保证环境的一致性,而且这些环境所生产的资源存放在各自独立的资源栈中,可以通过资源栈进行相应的运维管理、版本控制。
场景3:优雅变更基础设施——灰度发布
产品的灰度发布可以通过资源编排实现,其过程包括:申请相应的虚拟机资源,然后再将新版本的应用部署到虚拟机上,再将虚拟机添加到原来的生产环境中,再配置相应的流量规则到新的虚拟机,进而实现灰度发布。
首先写一个模板,在该模板中声明所需的虚拟机资源;然后再给该虚拟机指定网络;然后再在该模板中配置基于负载均衡的流量规则,把相应的流量导入虚拟机中,再将该模板提交到编排引擎中进行编排,当资源栈创建完成后,灰度发布也随之完成。通过资源编排进行灰度发布有以下几点优势:
·灰度过程不影响正在运行的应用
·新版应用挂入已有的SLB,并自动配置流量,应用发布不停机
·发布失败自动回滚
·验证结束后可整个删除灰度部署
场景4:优雅变更基础设施——蓝绿发布
场景4和场景3类似,它是一个蓝绿发布。蓝绿发布意味着用新版的应用彻底替换老版本应用,这一过程也可以通过资源编排实现。通过修改原有的模板,再提交到编排引擎;编排引擎根据新的模板更新或者创建新的资源栈;在更新或创建资源栈时,将负载均衡的流量切换后新的资源栈上,非常优雅地实现蓝绿发布的过程。通过资源编排进行蓝绿发布可以实现更新过程不影响正在运行的应用;通过SLB自动切换网络流量,应用不停机升级;升级失败自动回滚;并且,同一个资源栈可以多次升级迭代。
场景5:云基础设施架构持续集成
当基础设施可以用文本文件来表述时,则可以利用研发的经验对基础设施进行运维管理。首先可以同需求管理工具对基础设施的需求进行管理;其次再根据需求进行相应的模板开发;再将模板提交到代码仓库中,让同事帮忙Review模板后再通过Jekins之类的持续集成工具进行模板提交的验证工作,然后新模板会被传送到资源编排服务,资源编排服务会新模板创建资源栈进行验证,进一步验证根据新模板创建的环境是否符合预期。
实现了根据需求来修改模板、丰富模板,最终彻底满足需求。后期,如果再需要创建此类环境,只需从代码仓库中下载相应的模板,再提交到编排引擎创建环境即可,也就是基础环境运维彻底变成了项目开发的过程,进而大大提升了研发的效率。
资源编排工作流程
通过上述场景,可知资源编排在基础设施的构建、管理、变更、集成方面对研发效能有着很好的提升。下面来具体看下资源编排的工作流程。
资源编排的工作流程可分为四个阶段:架构设计、模板开发、创建资源栈、资源栈维护。架构设计阶段是根据需求来设计基础设施的架构;模板开发阶段是将设计的基础设施架构转化为对应的模板;再将该模板提交到编排引擎,编排引擎会根据这一模板创建资源栈;基于资源栈,运维人员可以进行相应的维护操作;在维护过程中发现的问题再反馈到架构设计阶段,更新需求,从而实现完整的闭环。
模板结构
模板是资源编排的基础,其具体结构如上图所示。模板是一个包含JSON字符串的文本文件,这个JSON字符串由以下部分组成:(1)资源编排的版本;(2)用于对模板/架构描述的Description字段;(3)参数可用于在资源栈创建时覆盖模板中的某些值,用来提高模板的灵活性和可复用性;(4)Resources字段是用来定义架构所依赖的云计算资源,配置应用环境和部署细节;(5)Outputs字段用于资源栈创建完成后,返回必要的架构部署信息,如ECS的IP地址、SLB的访问地址等。
下面来重点看一下资源是如何模板中声明的。
资源的声明主要是在Resources字段完成的,如上图代码所示。在该字段中,声明了WebServer资源,其类型是ALIYUN::ECS::InstanceGroup,每一个资源的类型是唯一确定的,用于告知编排引擎在创建时所需的资源;Properties字段用于确定Type所标识资源的具体属性。
管理资源依赖关系
资源声明后的操作是定义资源之间的配置细节和依赖管理。
资源编排模板提供了两种方式用于管理资源的配置细节和依赖关系:第一种是隐含式,资源编排提供了很多函数,通过函数隐式地指定资源之间的关系。如第一个红框内容所示,ECS资源组的SecurityGroupID是由Ref函数指定的;第二种方式是由DependsOn关键字显式指定资源之间的依赖关系,在该例中,WebServer资源依赖了MySQL_Server资源。
使用参数提高模板灵活性和复用性
在上文所提到的模板中,WebServer资源的属性完全呈现写死的状态,也就是通过这些模板所创建的资源都具有相同的规格,这种情况是无法满足我们正常的需求。我们需要根据场景的不同,创建不同规格网络配置、操作系统的资源栈。
编排模板中可以通过在Parameter字段定义一个变量,然后在Resources中引用该变量,当将模板提交到编排引擎时,通过动态地指定该变量的值,创建不同规格的资源。如上图Paeameters参数中定义的ImageId变量,通过指定不同的ImageId,大大提高了模板的灵活性和复用性。
编排服务优势
除了上述的优点以外,资源编排还具有如下优势:
(1)它提供了多种执行方式,一是通过WEB UI的方式使用资源编排服务;二是用户可以使用OpenAPI的方式将资源编排集成到应用中;
(2)由于资源编排是创建一组资源,有可能在编排的过程中某个资源创建失败。目前我们提供了两种回滚策略:ALL-or-Nothing和Best-Effort。前者是要么成功要么失败,后者是保存创建成功的资源;
(3)资源编排的模板支持一次编写,任意多次重复部署;
(4)支持以资源栈为单位的更新和删除;
(5)支持用户在模板中定义Shell脚本配置应用。
总结
资源编排服务实现了基础设施即代码的理念,可以像项目开发一样对基础设施进行版本控制、自动部署,以及通过测试驱动基础设施的开发;通过使用资源编排服务,用户不仅可以快读构建基础设施、以栈的方式管理多套资源、通过模板保证一致性,还可以优雅地变更基础设施,如灰度发布和蓝绿发布;此外,还利用开发的经验进行基础设施的持续集成。