当前位置: 首页 > 科技观察

基础架构即代码(IaC)

时间:2023-03-15 22:43:42 科技观察

云运维的自动化配置和编排,即与云资源和产品打交道,无疑会涉及到一系列的资源部署。比如单纯使用云服务器,需要运维人员依次创建VPC、VSwitch、安全组、云服务器实例。如果要创建集群,还需要进一步创建负载均衡、数据库和多个云服务器实例。随着业务规模的不断扩大,IT系统和环境的复杂度越来越高,手动逐一创建资源显然不可取。许多人正在转向用于自动资源部署和配置的工具。基于基础设施即代码IaC的理念,本文将分享如何借助自动化编排工具实现自动化部署,让运维工作更加高效。人工/半人工云运维五大痛点对于云资源的部署,如果您的云运维还处于人工或半人工运维阶段,大部分工作是通过控制台选择具体的资源规格参数来完成的创建,还有一部分是使用CLI(比如aliyun-cli)或者SDK直接调用接口创建资源。但是,随着上云企业业务规模的不断扩大,无论采用哪种方式,都或多或少会遇到以下五个问题:部署效率低下。手动创建是一种非常直观的创建少量资源的方式,但是一旦涉及到大量不同的资源,尤其是资源之间存在依赖关系时,你会发现需要在不同的产品控制台之间来回切换switch,必须时刻关注创建进度,才能创建下一个依赖它的资源。整个过程所花费的时间和精力可想而知,相信很多人都深有体会。再现性差。手动创建一系列资源后,如果需要针对不同环境(如预发布、测试、生产)或不同地域(如北京、上海)创建完全相同的资源,会耗费大量的时间步长通过step直接复制实现一键部署是不可能的。一致性差。手动创建还有一个非常大的问题,就是很容易出现配置错误,很难保证两个环境中每个资源的配置完全一致。难以管理。资源的创建只是开始,可能还需要对这批资源进行资源的扩缩容、更新特定资源的规格等操作。但人工运维的方式导致这些资源的入口没有统一管理,仍然需要在各个产品的控制台上分别进行操作。随着资源数量的增加,资源管理变得更加难以维护。困难的DevOps。每次开发、测试或部署软件应用程序时,都可能需要手动部署基础设施,并且无法对基础设施进行版本控制、审查其变更,无法实现敏捷部署。其实我们都知道,造成这些问题背后的原因是资源的部署还没有自动化。但这些问题也促使我们思考如何解决这些痛点,才能实现整个资源部署过程的自动化。引入基础架构即代码IaC的概念,实现资源在云端的自动化部署。在真正进行自动部署之前,不妨回顾一下需要创建的云服务资源(如VPC、VSwitch、ECS实例等)。对于应用来说,都是云上的基础设施。如果把这些基础设施看成是一段“代码”,在“代码”中定义产品、规格、数量等信息,是否可以用这个“代码”来管理整个基础设施呢?这就是InfrastructureasCode(IaC)的思想,它将基础设施配置视为软件编程。KiefMorris在书中将infrastructureascode定义《Infarftruce as Code》:“Infrastructureascode是一种使用新技术构建和管理动态基础设施的方式。它结合了基础设施、工具和服务以及基础设施的管理本身就是一个软件系统,并且采用软件工程实践以结构化和安全的方式管理系统变更。”引入IaC的概念,运维人员可以让基础设施的部署和管理过程变得敏捷:在模板(广义的代码)中定义基础设施,即各种云资源及其规格、数量等属性,以及云资源之间的依赖关系;使用版本控制(如Git)管理模板并提交审核;通过审核后,自动化部署工具使用模板创建/更新基础设施;部署和管理后基础设施变得便捷,可以很好地解决上述人工运维/半人工运维的痛点:提高部署效率使用自动化部署工具进行部署,将大大提高人工部署的效率标准化和一致性.基础设施的内容以模板的形式保存,对基础设施通过模板的变化实现,实现了基础设施管理的标准化。另外,使用同一个模板部署在不同地域也可以保证资源的一致性。易于管理。基础设施的管理不再分散在各个产品控制台,而是统一到一个模板中,大大降低了管理成本。敏捷的工作流程。通过基础设施管理流程的规范化和标准化,使整个资源部署流程变得敏捷。审计和回滚。模板的版本管理使得审计基础架构更改并回滚到特定版本成为可能。四种常见的IaC自动化配置编排工具目前IaC自动化部署工具有很多,包括第三方资源编排工具,以及云服务商提供的云原生资源编排工具。这里介绍四种自动化配置编排工具:阿里云资源编排服务ROS(ResourceOrchestrationService),是一个云原生的编排工具,通过在模板中定义需要的ECS实例、数据库实例等云服务资源和资源依赖。编写JSON/YAML格式的模板,然后根据模板在ROS中创建资源栈,ROS服务器会根据模板自动完成所有资源的创建和配置,实现自动化部署和运维。资源栈管理模板中定义的所有资源,资源栈可以通过新的模板进行更新,包括添加、更新、删除资源等操作。AWSCloudFormation也是一种云原生编排工具。运维人员也通过JSON/YAML格式的模板定义云服务资源,并通过资源栈管理这些资源。HashiCorpTerraform,一个开源的自动化编排工具。在配置文件的驱动下,可以在文件中定义需要管理的组件,即基础设施资源,从而生成可执行的计划。通过执行这个计划,定义组件的创建、增量更改和持续管理。如果无法执行,会提示错误。Terraform不仅可以管理IaaS层的资源,如计算实例、网络实例、存储实例,还可以管理更高层的服务,如DNS域名和解析记录、SaaS应用功能等。Pulumi和Terraform一样,也是一个开源项目,但它与Terraform的重要区别在于,你可以使用熟悉的编程语言编写声明式配置,而不需要额外学习云服务提供商特定的模板语言来编写配置。对于自动化配置和编排工具的选择,笔者的建议是:如果你的业务部署在单一云平台上,选择云平台提供的资源编排工具,在阿里云平台上使用ROS,在阿里云平台上使用CloudFormationAWS平台。很简单:云平台提供的工具是云原生的,是免费的托管服务,可以在服务器端进行自动部署;同时,还实现了云原生访问控制、编排资源与实际资源差异检测等功能。这样更省心。如果你的业务部署在多个云平台上,推荐使用第三方Terraform和Pulumi,因为它不仅可以部署和管理多云资源,还可以管理云以外的资源,比如Kubernetes。如何使用编排工具进行自动化部署和管理?对于运维人员来说,使用IaC理念的自动化部署工具的门槛其实并不高,使用步??骤也很简单,主要是编写和使用模板。下面我就来说说编写和使用模板的注意事项,如何更好的利用工具,更好的提升运维效率。1、编写模板的三个注意事项确认自动部署工具后,可以根据不同工具的模板语言编写相应的模板文件。如果选择云服务商提供的云原生编排工具,在编写模板时需要注意三点:注意资源依赖。不适当的依赖关系或缺失的依赖关系会导致资源创建错误。请注意使用通用属性作为参数。例如,实例规范是比较常见的属性。推荐使用相同的模板,指定不同的参数,以达到部署不同规格实例的目的。使用有价值的属性作为输出。例如实例ID、连接地址等都是有价值的属性,只有在资源创建后才能获取。将这些属性作为整个模板的输出,可以方便后续的查看和管理。2.自动解析依赖,自动化部署基础设施模板编写完成后,可以通过相应的自动化部署工具将模板转化为真实的资源。上面提到的编排工具可以解决资源的依赖关系,一个接一个地创建这些资源。同时,也可以并行创建互不依赖的资源。对于阿里云ROS和AWSCloudFormation,可以使用模板创建资源栈。资源栈是云上的一组资源,即模板中定义的基础设施。后面需要增加/删除/修改一些资源的时候,也是通过使用模板更新资源栈来达到目的的。对于Terraform,配置文件可用于生成可执行计划,该计划被执行以完成定义的资源/组件的创建、增量更改和持续管理。对于Pulumi,它直接执行代码进行部署。这样的部署方式不仅可以让资源以合理的顺序创建,还可以提高部署效率。当遇到异常情况时,会进行一定程度的重试,真正让整个自动化部署过程稳定高效。基于基础设施编码,进一步高效运维当运维工作完成,整个基础设施模板化后,DevOps变得更加容易。我们可以使用版本管理工具(如Git)管理描述当前基础设施的模板,使用阿里云CloudEffect/AWSCodePipline/Jenkins创建从代码提交触发器到手动卡点再到资源栈部署的流水线,让整个基础架构管理变得更加敏捷和自动化。图1:基础架构变更流程图。每次模板变更后,将本地仓库的分支内容推送到远程仓库,并发起审核;审核不通过,修改模板,重新审核;如果审核通过,则自动触发流水线;流水线触发人工卡点,通知上级管理员检查变更。如果您不同意,则终止;如果您同意,请转到下一步;如果是第一次提交模板,创建资源栈(即创建基础设施);否则,更新资源栈(即更新基础设施)。基础架构更改和预览IT基础架构不是静态的。随着业务的变化,我们可能会面临扩缩容的场景,也可能会面临整个架构的变化。幸运的是,基于IaC的概念,我们只需要描述基础设施的最新配置,而不用担心如何进行更改。但即便如此,在我们改变它们之前,我们需要确切地知道会发生什么变化。阿里云ROS和AWSCloudFormation的变更集功能,以及Terraform的执行计划,可以让我们提前知道变更内容。例如,由于业务变化,在图1架构的基础上,在阿里云平台上增加一个ECS实例,使用SLB实例来均衡两个ECS实例的负载。编写新模板后,可以使用变更集功能来感知变化。下图是阿里云ROS的改动示例:确认无误后,即可执行改动。然后,自动化编排工具将更新整个基础架构,并根据模板的变化来决定添加、更改或删除哪些资源。基础设施偏差检测与纠正虽然采用自动化编排工具部署资源,但部分人员可能会以非标准方式(如通过控制台或API)修改基础设施中部分资源的属性,从而使资源的实际情况与模板中定义的资源有所不同。一个好的自动化编排工具不仅能够检测基础设施的实际属性与模板中定义的属性之间的差异;它还可以根据差异结果对模板或实际资源进行修正,使模板与基础设施保持一致。目前,通过阿里云ROS和AWSCloudFormation的偏差检测能力,很容易发现实际资源与模板中定义的资源之间的差异,并利用偏差校正功能使模板内容保持一致与实际资源。综上所述,在IT基础设施全面上云的趋势下,云上人工运维方式已经难以为继,存在部署效率低、可复现性差、一致性差、管理难、部署难等痛点。DevOps已经出现。阿里云ROS/AWSCloudFormation/Terraform/Pulumi等自动化编排工具,基于基础设施即代码(IaC)的理念,可以通过模板定义基础设施,将整个部署流程标准化、自动化,配合变更集、偏差检测等能力,结合流水线,真正实现了IT基础设施管理上的DevOps。建议运维人员能够专注并熟练使用工具,有助于您更好地提升运维效率,解放生产力。