云计算基础设施持续集成实践

简介: 在首届阿里巴巴研发效能嘉年华上,来自阿里的企业服务研发工程师朱波(问樵)带来了题为《云计算基础设施持续集成实践》的分享。在分享中,他详细介绍了如何利用资源编排工具像软件项目开发一样来管理基础设施。

【演讲PDF】: https://yq.aliyun.com/attachment/download/?id=1837

【演讲视频】: https://yq.aliyun.com/edu/lesson/551
研发和传统基础设施交互方式

通常情况下,在开发过程中需要和基础设施打交道,需要在项目中申请开发、测试以及预发生产环境。在IDC时代,我们需要向IT部门申请这些资源,其批准后,我们才能获得这些资源。如果这些资源恰巧不足,我们只能等待购买新的资源或者更换其他资源。

2df124787f3652d105338b8d36904ea4efbbd4ac

当拿到这些资源之后,需要对开发、测试、预发、生产环境进行四次相同的配置;当应用架构做了调整之后,需要对相应的四个环境进行变更以保证一致性。这个过程对于IT和研发人员来讲是比较痛苦的过程;而且,由于应用是一个不断迭代的过程,因此这种痛苦也是比较持续的过程。

DevOps

那究竟有没有一种方式能够让我们快速获取基础设施?能够方便管理基础设施?能够优雅变更基础设置?能够持续集成基础设施呢?

答案是DevOps。DevOps的出现为解决上述问题带来了曙光。

f10a1922b6167dab86b619ac7932e1110f542161

DevOps整合了以前割裂的研发和运维,它要求研发做到开发敏捷化、精益化、流程自动化,并且能够持续集成、持续交付,对于较大的项目要求其能够切割成几个快速交付的小项目。

但是,DevOps只是提供了指导思想,而不是具体的解决方案。那具体应该怎么做呢?答案是云计算。云计算给我们带来了前所未有的便捷性。目前,阿里云提供了七十多种云产品,用户可以根据自己的需求来获取这些资源,随时购买、随时释放。

2ee7103b57530d3a7e298ccdcf910dc0a9fe9730

阿里云提供了两种方式便于用户去获取它们:一是通过WebUI获取配置资源;二是集成各产品openAPI的方式获取配置资源。前者是一种手动的方式,当需要的产品较多时,该方式不可行;而后一种方式要求运维人员具有一定的开发经验才能配置,还需要知道每一个openAPI的细节,增加了项目开发量,并且,当需要集成的产品较多时,所需的openAPI也就随之增加,进而导致代码越发臃肿,对这些代码的运维和持续集成都是不小的挑战;另外,通过openAPI方式获取的配置资源是混合在一起的,没有区分开发、测试环境,有可能会导致一些误操作。


那么有没有一种更好的集成方式呢?

4dc1a3ba55a0cf12f29294842ecd01d76938d98a

答案是肯定的。阿里云提供了资源编排服务,该服务能够让我们把基础设施架构完全模板化,(模板是JSON格式的文本文件,在该文本文件中,可以通过声明的方式定义资源需求、说明资源依赖关系和配置细节);之后将模板提交到编排引擎,编排引擎会根据模板中提供的信息创建资源栈,我们可以通过资源栈这一视角,管理资源,可以做到权限控制、资源升级,以及根据应用的需求进行扩容和缩容的操作。

相较于之前提到的openAPI集成的方式,资源编排这种方式不要求运维人员具有开发经验,它采用声明的方式定义资源以及资源之间的关系,易于编写;由于模板是文本文件,因此可以通过代码的方式对模板进行版本控制;此外,资源编排帮助大家屏蔽了集成openAPI所要考虑的细节问题,可以做到通过模板自动化构建一组资源,无需人工值守,是0部署的过程;最后,由于资源编排所创建的资源全部归属一个资源栈,因此可以根据资源栈进行软件生命周期的管理、监控、报警。

基础设施即代码

94400633cbbed7373f61d72276b89f3b8dcf8eb5

当基础设施可以通过文本文件表述时,那就可以利用研发的经验对基础设施进行开发。将基础设施架构转化为模板的过程就相当于研发中Coding的过程:提交模板之后,再让其他同事Review该模板,然后再将模板提交到SVN、GIT库中进行版本控制。这样一来,相较于以前手动进行资源变更,资源编排实现了将一切纳入版本控制之下,像测试你的程序一样测试模板。

资源编排能在哪些场景下提高研发效率呢?下面来看几个具体的场景。

场景1:快速构建基础设施

355eb44b5139e846987c259d4436a6a00b32feed

在研发过程中通常需要构建开发、测试、生产以及预发环境。这四个环境的基本架构相同,只是各个环境中的网络配置存在差异,因此我们可以将这四个环境转化为一个模板。在模板中,根据不同的生产环境配置不同的网络参数,也就是通过一个模板生成四种不同的环境。例如,要生产开发环境时,在提交模板到编排引擎的同时指定需要生成的是开发环境,编排引擎则会根据模板中的信息生成开发环境,当需要生成生产环境时,只需修改对应的参数即可。总结来说,就是可以通过基础设施模板随时随地地生成各类环境,进而提升研发效能。

场景2:方便管理基础设施

8271e100b7534cebcf38423d183f0fae4325b79e

如上图所示生产环境资源栈、预发环境资源栈、测试环境资源栈、开发环境资源栈架构类似,都是高可用、高安全的环境。尽管这四个环境的用处不同,但其基础架构却保持高度一致。

那么如何保障这四个环境的一致性以及它们的运维管理呢?

如果采用手动的方式配置环境一致性,容易导致环境之间的不一致,进而在测试时出现一些问题,浪费研发人员的精力。通过资源编排可以保证这些环境的一致性,也就是通过相同的模板生成开发、测试、生产、预发环境,进而保证环境的一致性,而且这些环境所生产的资源存放在各自独立的资源栈中,可以通过资源栈进行相应的运维管理、版本控制。

场景3:优雅变更基础设施——灰度发布

c715e87bc191e408763958832d1b6eade0e16d32

产品的灰度发布可以通过资源编排实现,其过程包括:申请相应的虚拟机资源,然后再将新版本的应用部署到虚拟机上,再将虚拟机添加到原来的生产环境中,再配置相应的流量规则到新的虚拟机,进而实现灰度发布。

首先写一个模板,在该模板中声明所需的虚拟机资源;然后再给该虚拟机指定网络;然后再在该模板中配置基于负载均衡的流量规则,把相应的流量导入虚拟机中,再将该模板提交到编排引擎中进行编排,当资源栈创建完成后,灰度发布也随之完成。通过资源编排进行灰度发布有以下几点优势:

·灰度过程不影响正在运行的应用

·新版应用挂入已有的SLB,并自动配置流量,应用发布不停机

·发布失败自动回滚

·验证结束后可整个删除灰度部署

场景4:优雅变更基础设施——蓝绿发布

74c4527dd53a1137394702e7404e8a926e48b1fd

场景4和场景3类似,它是一个蓝绿发布。蓝绿发布意味着用新版的应用彻底替换老版本应用,这一过程也可以通过资源编排实现。通过修改原有的模板,再提交到编排引擎;编排引擎根据新的模板更新或者创建新的资源栈;在更新或创建资源栈时,将负载均衡的流量切换后新的资源栈上,非常优雅地实现蓝绿发布的过程。通过资源编排进行蓝绿发布可以实现更新过程不影响正在运行的应用;通过SLB自动切换网络流量,应用不停机升级;升级失败自动回滚;并且,同一个资源栈可以多次升级迭代。

场景5:云基础设施架构持续集成

a831e1b976176b4842fd15f04b95ec358635e3fa

当基础设施可以用文本文件来表述时,则可以利用研发的经验对基础设施进行运维管理。首先可以同需求管理工具对基础设施的需求进行管理;其次再根据需求进行相应的模板开发;再将模板提交到代码仓库中,让同事帮忙Review模板后再通过Jekins之类的持续集成工具进行模板提交的验证工作,然后新模板会被传送到资源编排服务,资源编排服务会新模板创建资源栈进行验证,进一步验证根据新模板创建的环境是否符合预期。

实现了根据需求来修改模板、丰富模板,最终彻底满足需求。后期,如果再需要创建此类环境,只需从代码仓库中下载相应的模板,再提交到编排引擎创建环境即可,也就是基础环境运维彻底变成了项目开发的过程,进而大大提升了研发的效率。

资源编排工作流程

874b7c2b9f0429fd92401fa270e5587b72cff429

通过上述场景,可知资源编排在基础设施的构建、管理、变更、集成方面对研发效能有着很好的提升。下面来具体看下资源编排的工作流程。

资源编排的工作流程可分为四个阶段:架构设计、模板开发、创建资源栈、资源栈维护。架构设计阶段是根据需求来设计基础设施的架构;模板开发阶段是将设计的基础设施架构转化为对应的模板;再将该模板提交到编排引擎,编排引擎会根据这一模板创建资源栈;基于资源栈,运维人员可以进行相应的维护操作;在维护过程中发现的问题再反馈到架构设计阶段,更新需求,从而实现完整的闭环。

模板结构

ab3df09a44673b5288f5f84b8f7f6a0436672285

模板是资源编排的基础,其具体结构如上图所示。模板是一个包含JSON字符串的文本文件,这个JSON字符串由以下部分组成:(1)资源编排的版本;(2)用于对模板/架构描述的Description字段;(3)参数可用于在资源栈创建时覆盖模板中的某些值,用来提高模板的灵活性和可复用性;(4)Resources字段是用来定义架构所依赖的云计算资源,配置应用环境和部署细节;(5)Outputs字段用于资源栈创建完成后,返回必要的架构部署信息,如ECS的IP地址、SLB的访问地址等。

下面来重点看一下资源是如何模板中声明的。

ed34e6ddc7cdac8f6ac39bc69eb43a185d14b387

资源的声明主要是在Resources字段完成的,如上图代码所示。在该字段中,声明了WebServer资源,其类型是ALIYUN::ECS::InstanceGroup,每一个资源的类型是唯一确定的,用于告知编排引擎在创建时所需的资源;Properties字段用于确定Type所标识资源的具体属性。

管理资源依赖关系

资源声明后的操作是定义资源之间的配置细节和依赖管理。

450423e687f30aed5c8d89839f44082d2ce3bd25

资源编排模板提供了两种方式用于管理资源的配置细节和依赖关系:第一种是隐含式,资源编排提供了很多函数,通过函数隐式地指定资源之间的关系。如第一个红框内容所示,ECS资源组的SecurityGroupID是由Ref函数指定的;第二种方式是由DependsOn关键字显式指定资源之间的依赖关系,在该例中,WebServer资源依赖了MySQL_Server资源。

使用参数提高模板灵活性和复用性

在上文所提到的模板中,WebServer资源的属性完全呈现写死的状态,也就是通过这些模板所创建的资源都具有相同的规格,这种情况是无法满足我们正常的需求。我们需要根据场景的不同,创建不同规格网络配置、操作系统的资源栈。

255f09aaef5d65f7d1ef8d6fe48787582b3ad7a5

编排模板中可以通过在Parameter字段定义一个变量,然后在Resources中引用该变量,当将模板提交到编排引擎时,通过动态地指定该变量的值,创建不同规格的资源。如上图Paeameters参数中定义的ImageId变量,通过指定不同的ImageId,大大提高了模板的灵活性和复用性。

编排服务优势

除了上述的优点以外,资源编排还具有如下优势:

(1)它提供了多种执行方式,一是通过WEB UI的方式使用资源编排服务;二是用户可以使用OpenAPI的方式将资源编排集成到应用中;

(2)由于资源编排是创建一组资源,有可能在编排的过程中某个资源创建失败。目前我们提供了两种回滚策略:ALL-or-Nothing和Best-Effort。前者是要么成功要么失败,后者是保存创建成功的资源;

(3)资源编排的模板支持一次编写,任意多次重复部署;

(4)支持以资源栈为单位的更新和删除;

(5)支持用户在模板中定义Shell脚本配置应用。

总结

资源编排服务实现了基础设施即代码的理念,可以像项目开发一样对基础设施进行版本控制、自动部署,以及通过测试驱动基础设施的开发;通过使用资源编排服务,用户不仅可以快读构建基础设施、以栈的方式管理多套资源、通过模板保证一致性,还可以优雅地变更基础设施,如灰度发布和蓝绿发布;此外,还利用开发的经验进行基础设施的持续集成。

相关文章
|
30天前
|
供应链 安全 Linux
简单、透明、安全、高度集成!龙蜥可信 SBOM 能力探索与实践
从攻击面管理的角度解决软件供应链SBOM复杂体系的安全可信问题。
|
2月前
|
安全 Java 数据库
后端进阶之路——万字总结Spring Security与数据库集成实践(五)
后端进阶之路——万字总结Spring Security与数据库集成实践(五)
|
3月前
|
安全 jenkins 测试技术
自动化测试与持续集成/持续交付(CI/CD)的实践与应用
自动化测试是现代软件开发不可或缺的环节,它可以有效地提高测试效率、降低测试成本。而持续集成/持续交付(CI/CD)则是一种基于自动化的软件开发流程,能够将代码的开发、构建、测试和部署等过程无缝连接起来,从而实现快速迭代和部署。本文将结合实际案例,介绍自动化测试和CI/CD的实践与应用。
144 2
|
4月前
|
Java 数据安全/隐私保护
Neo4j【付诸实践 01】SpringBoot集成报错org.neo4j.driver.exceptions.ClientException:服务器不支持此驱动程序支持的任何协议版本(解决+源代码)
Neo4j【付诸实践 01】SpringBoot集成报错org.neo4j.driver.exceptions.ClientException:服务器不支持此驱动程序支持的任何协议版本(解决+源代码)
67 1
|
1月前
|
存储 大数据 数据挖掘
云计算与大数据:从基础设施到实际应用
云计算与大数据:从基础设施到实际应用
100 0
|
3月前
|
存储 弹性计算 供应链
云计算的思想、突破、产业实践
云计算的思想、突破、产业实践
|
4天前
|
监控 安全 网络安全
云端防御:云计算环境中的网络安全策略与实践
【4月更文挑战第15天】 在数字化转型的时代,云计算已成为企业运营不可或缺的技术支撑。然而,随着云服务模式的广泛采纳,网络安全挑战亦随之而来。本文深入探讨了云计算环境下的安全威胁,分析了云服务模型对安全策略的影响,并提出了一系列创新的网络安全防护措施。通过研究最新的加密技术、访问控制机制和持续监控方法,文章旨在为企业提供一个综合性的网络安全框架,以确保其云基础设施和数据的安全性和完整性。
21 8
|
4天前
|
测试技术 持续交付 Docker
Django中的自动化部署与持续集成实践
【4月更文挑战第15天】本文介绍了Django项目中自动化部署与持续集成的实践方法。自动化部署通过选择Ansible、Fabric或Docker等工具,编写部署脚本,配置持续集成工具(如Jenkins、GitLab CI),确保服务器环境一致,实现快速应用上线。持续集成则涉及配置版本控制系统,设置自动化构建和测试,编写全面的测试用例,集成代码质量检查工具,并配置通知机制,以提升代码质量和开发效率。这两者结合能有效提升项目的迭代速度和可靠性。
|
15天前
|
人工智能 安全 网络安全
构筑云端堡垒:云计算环境下的网络安全策略与实践
【4月更文挑战第5天】随着企业数字化转型的不断加速,云计算已成为支撑现代业务运行的关键基础设施。然而,云服务的广泛采用也带来了前所未有的安全挑战。本文将深入探讨云计算环境中的网络安全问题,并提出一系列切实可行的策略和措施,以增强数据保密性、完整性及可用性,从而确保云服务在为企业带来便利的同时,不牺牲其安全性。
11 1
|
26天前
|
监控 安全 网络安全
云计算环境下的网络安全新策略与实践
在数字化时代,云计算为企业提供了弹性、可扩展的资源管理平台,但同时也带来了复杂的安全挑战。本文聚焦于云服务中的网络安全和信息保护问题,首先分析了云计算环境中存在的安全威胁和风险因素,然后详细探讨了当前最新的安全技术和策略,包括身份认证、数据加密、入侵检测系统以及安全运营中心(SOC)等。最后,文章提出了一套综合的安全框架,旨在帮助组织在享受云计算便利的同时,确保其数据和资源的安全性和完整性。