01 导言
随着企业采用多云战略和迁移到云平台,需要依赖不同的云资源来支持业务系统。传统的手动开通和配置资源关联关系的方法在多云环境下变得耗时且复杂,给运维带来困难。
为了应对多云环境中基础设施管理的复杂性,寻找一种高效的多云资源编排方法至关重要。资源编排可以对混合云资源进行编排,实现快速部署和管理,并降低管理复杂性、人工成本和运维成本。核心过程是设计蓝图、编排资源,并将编排结果作为实施模板传递给云平台,实现资源的统一开通、变更和回收。
尽管资源编排是降低成本和提高效率的有效方法,但在实施过程中也面临一些困难和挑战。以下是其中的几个主要方面:
- 多云平台的异构性:不同的云服务提供商之间存在差异,这意味着在跨多个云平台进行资源编排时,需要处理不同的语法和语义,增加了编排模板的复杂性和学习成本。
- 依赖关系管理:资源之间可能存在复杂的依赖关系,这需要准确定义和管理,处理依赖关系可能涉及解决循环依赖、处理资源创建的先后顺序等问题。
- 配置参数的灵活性:不同的云服务和场景可能需要不同的配置参数和选项。资源编排需要提供灵活的配置能力和对需求的个性化定制能力,增加了编排模板的复杂性。
为了解决上述困难,可以采用两个标准来进行多云资源编排:标准描述文件和标准云平台对接。通过这两个标准对云平台的差异进行统一定义,使混合云编排变得简单可操作。在业界中,TOSCA和Terraform是两个备受关注的资源编排工具。
TOSCA提出了蓝图拓扑编排标准规范,定义了资源之间的拓扑关系和依赖关系,可以实现对复杂应用和服务的编排。Terraform则可以对资源编排的产物进行简化的实施部署,实现基础设施即代码(IaC)的理念,可以通过编写可重复使用的代码来描述和管理基础设施资源。
本文将基于TOSCA和Terraform这两个工具进行多云资源编排的探索与讨论,以帮助企业更好地实现混合云环境下的资源编排和管理。
02 TOSCA规范与Terraform工具
TOSCA规范
TOSCA(Topology and Orchestration Specification for Cloud Applications)是由OASIS组织制定的云应用拓扑编排规范。它定义了云资源编排的拓扑结构、组件关系、属性和操作等信息,以便于方便地描述云资源的拓扑结构和行为。
简而言之,TOSCA旨在制定一套蓝图拓扑编排标准规范,通过使用统一标准来描述云平台上应用的拓扑结构。TOSCA有以下一些优点:
- 高度可扩展性:TOSCA可以在多个层次上描述云原生应用程序,包括服务部署、网络拓扑等。因此,它非常适合在复杂的分布式系统中管理和编排应用程序。
- 独立于云平台:TOSCA模板可以在多个云平台上运行,因为它是一个独立于云平台的标准。
- 生命周期管理:TOSCA模板中的工作流可以描述应用程序的整个生命周期,从创建部署环境到在生产环境中运行的监视和维护,可以进行全生命周期管理。
但是,TOSCA也有一些缺点,例如:
- 相对复杂:TOSCA需要编写XML或YAML格式的模板,语法和语义相对复杂,因此需要一定的技术水平。
- 缺少良好的工具支持:目前,TOSCA的工具生态系统尚不够完善,使用起来可能会比较困难。
- 更适合应用程序描述:TOSCA更适合描述和管理整个应用程序,而不是管理云基础架构。
TOSCA的主要概念包括两个要素:节点(Node)和关系(Relationship)。TOSCA规范定义了一系列原生的节点类型(Node Types),用于表示云应用中的不同组件和功能。TOSCA规范中定义了一些原生节点类型,这些原生的节点类型提供了一种描述云资源中不同类型组件属性和行为的方式,便于进行模板编写和云资源管理。通过使用和派生这些节点类型,可以更加方便和标准化地描述和管理云资源中的各个组件。
Terraform工具
Terraform是由HashiCorp开发的开源工具,旨在管理云基础架构。它采用声明式编程风格,使用户能够编写基础架构模板,以描述需要部署的所有资源及其相互关系。这样的模板描述方式允许用户以可重复、可维护的方式定义和管理云基础架构,确保资源的一致性和可扩展性。
Terraform通过描述文件进行直接实施部署,即通过定义Terraform的描述文件(.tf文件),可以将其发送给Terraform服务进行执行(terraform apply),从而与云平台进行无缝对接,实现对描述文件中所定义的资源进行部署和开通。这种方式能够简化和自动化云资源的管理过程,使得部署和配置变得更加高效和可靠。
它具有以下优点:
- 易于使用:Terraform采用声明式编程风格,用户可以更简单、清晰地定义和管理基础架构。
- 可扩展:Terraform具有通过插件机制工作的灵活性,可以很容易地集成到其他工具和流程中。
- 模块:Terraform将基础架构的各种组件以模块的方式进行封装,从而更容易地重用。
但是,Terraform也存在一些缺点:
- 更适合管理基础架构:Terraform更适合管理云基础架构,而不是管理完整的应用程序。
- 学习成本高:虽然Terraform的语言很简单,但功能十分丰富。这意味着使用它需要一定的学习成本。
- 非标准: Terraform并不是一个标准,需要在不同的云平台上学习相应的DSL。
目前,Terraform已经得到了多个云平台的支持,包括公有云、专有云、Docker、Kubernetes。通过Terraform的统一管理,用户能够在多个云平台和基础设施上进行资源的配置和部署,实现跨平台、跨服务商的自动化管理。
应用场景
在实际应用中,TOSCA和Terraform在不同场景下发挥着各自的作用。TOSCA主要适用于管理和编排云原生应用程序,而Terraform则更适用于管理更底层的基础架构。以下是两种工具常见的应用场景:
云原生资源编排:TOSCA模板能够描述云原生应用程序的完整生命周期,包括部署、配置和管理等过程。通过TOSCA,多个组件和服务可以被编排成一个完整的云原生应用程序。
云基础架构管理:Terraform可以以模块化的方式编排云基础架构资源,使得各种资源和服务能够更清晰地进行管理。通过使用Terraform,可以通过代码来管理多个云基础架构,实现对基础设施的统一管理。
03 结合资源编排和实施部署
在实际应用中,TOSCA和Terraform可以分别应用于不同的资源编排场景。由于TOSCA和Terraform各自具有优势和劣势,可以将它们的长处结合起来形成更优的解决方案。例如,TOSCA在蓝图编排方面表现出色,可以利用其优势为多云资源编排提供标准化的蓝图编排规范,实现跨平台的编排。而Terraform则拥有丰富的社区生态和良好的云平台对接模式,可以快速与不同的云平台进行集成。
主要思路是采用TOSCA进行蓝图设计模式,通过蓝图编排将业务所需的云产品组件组织成符合TOSCA 1.3 YAML规范的蓝图模板。然后,将该模板转换为符合Terraform实施描述文件的统一格式,以便进行实施。具体架构如下所示:
第一步:首先根据TOSCA规范定义云产品组件,并进行蓝图编排,以生成符合TOSCA规范的蓝图描述文件(YAML格式)。
第二步:利用配置转换器,将TOSCA描述文件转换为Terraform描述文件。可以借助报文转换器等工具来进行此转换,具体细节不再详述。
第三步:利用Terraform描述文件和Terraform服务进行云产品的编排和实施部署。
04 阿里公有云蓝图编排实施部署实操
下面将通过一个实操来简要描述如何利用TOSCA蓝图编排并使用Terraform进行开通操作。假设需要部署一个 web 网站,该网站依赖三个云资源:虚拟专有网络(VPC)、虚拟交换机(VSwitch)和云服务器(ECS)。案例将模拟在阿里云杭州节点上进行这三个虚拟产品的实施部署,其中 ECS 将部署在 VSwitch 下方,而 VSwitch 的网络分配依赖于 VPC。
在过去的情况下,可能需要先在阿里云上开通 VPC,然后在 VPC 上创建一个 VSwitch,并最后创建一个 ECS。简单来说,这需要三个单独的实施部署操作。
通过资源编排的方式,可以将 VPC、VSwitch 和 ECS 编排在一个蓝图拓扑描述文件中,遵循 TOSCA 规范。然后,可以将这个蓝图描述文件转换为 Terraform 的描述文件,以实现统一的开通操作。这样一来,就可以通过资源编排来简化整个部署过程,实现快速而一致的云资源开通。
实践步骤一:TOSCA 蓝图编排
根据需求背景,使用可视化的蓝图设计工具(或手动编排拓扑文件,或使用基于TOSCA的开源编排工具,例如Cloudify),编排出符合TOSCA规范的蓝图描述文件,如下所示:
该描述文件定义了一个包含VPC、VSwitch网络关系的ECS(Elastic Compute Service)规范,其中包括三个自定义云资源节点类型:
alicloud.nodes.VPC:派生 tosca.nodes.Network 节点类型,表示网络。具有属性,如CIDR。
alicloud.nodes.vSwitch:派生 tosca.nodes.Network 节点类型,表示虚拟交换机。具有属性,如CIDR。
alicloud.nodes.ECSInstance:派生 tosca.nodes.Compute 节点类型,表示ECS实例。具有属性,如镜像ID、实例类型和实例名称。
其中,组件定义的属性可以作为用户填写,如果有其他需要输入属性,也可在该节点增加。在relationships节点上,描述了三者的关系和互相依赖前提。
该描述文件采用YAML格式,其中节点描述继承了TOSCA规范的派生节点,后续可以不断扩展与继承。描述文件简单通过节点和关系来描述蓝图拓扑的节点、属性和关联关系,使其具有较高的通用性。
实践步骤二:把TOSCA转换成Terraform描述文件
将TOSCA规范描述文件转换为Terraform描述文件目前没有现成开源解决方案。因此,需自研定制化接口进行转换。当然,TOSCA规范也支持自定义接口实现,以调用其他开源组件进行开通操作。
下面是通过转换工具生成的Terraform描述文件main.tf的示例:
在这里需要介绍的是,Terraform核心文件包括两个部分。首先是编排执行文件,其文件后缀名采用tf(在本案例中为main.tf)。该文件用于定义和执行资源编排的操作。其次是本地状态文件,其文件后缀名采用tfstate。本地状态文件用于记录当前资源的状态和配置信息。
后缀名tf文件:业务编排的主文件,可以将所有内容合并到一个tf文件中,也可以根据不同的云产品将其划分为多个文件。无论是合并还是划分,只要文件后缀名为tf,它们之间可以相互引用和调用。
后缀名tfstate:本地状态文件,它由Terraform服务在实施部署后自动创建。该文件记录了实施部署生成的实例信息和状态。
在tf文件中,可以观察到以下几个节点,将对它们进行简单介绍:
terraform 节点:用于指定要下载的云平台提供的provider。这些provider是各大云平台在Terraform生态圈中开源提供的工具,通过使用这些provider,我们可以无缝对接云平台进行资源的开通。
provider 节点:主要用于提供授权信息,包括企业或个人云平台账号的AK/SK(Access Key/Secret Key)。这些信息用于进行云平台的认证和授权。
data 节点:用于在云平台中进行查询操作。在许多情况下,开通某种云产品需要使用已部署的其他云产品的属性进行关联。通过data节点,我们可以根据属性值查询云平台的数据,以便于提供即将开通的资源所需的信息。
resource 节点:用于描述将要实施部署的资源节点信息。这些资源节点可以是将要部署、变更或删除的资源。在执行Terraform时,根据该节点的信息与本地状态文件以及远程云平台的状态信息进行比对,决定是进行新的部署、变更部署还是回收部署。
output 节点:用于返回实施部署后的一些资源实例信息。在这里,我们定义了返回的三个资源实例的ID,以方便进行多云产品的资源管理记录。
实践步骤三:通过Terraform服务执行描述文件
准备好了Terraform描述文件后,可以通过Terraform服务进行执行。Terraform的执行过程主要包括三个关键步骤:init、plan和apply。
(1) terraform init:这一步是进行provider的初始化。在本案例中,我们描述了对接阿里公有云且使用1.204.1版本的情况。由于在此之前没有进行提前下载,因此在执行该命令时,Terraform将自动进行下载。以下是示例输出:
(2) terraform plan: 这一步用于检查main.tf中的逻辑是否合理,并且可以在plan执行日志中查看将要进行的资源状态变更情况。根据案例的执行日志可以看到terraform根据模板计划新增了4个实例(Plan: 4 to add, 0 to change, 0 to destroy)。执行该命令后的输出如下所示:
(3) terraform apply:通过使用terraform apply命令,可以执行实施部署。如果需要传递参数,可以通过apply命令进行传递,例如AK/SK等敏感信息不适合明文写入文件中,这里只是为了演示方便。执行该命令后,可以观察到terraform已根据描述文件中的关联关系自动推算出实施部署云产品的依赖顺序。这也是terraform的一个重要优势,在混合云编排场景中,各种云产品之间的相互依赖以及执行顺序的复杂分析都可以通过terraform直接解决。以下是具体的执行日志:
(4) 实施成功后,可以在阿里公有云上看到已部署的产品。如下图所示,可以看到ECS ID为i-bp11o38dc5haho1667hc已成功部署在阿里公有云上。这证明实施操作已经顺利完成:
(5) 到目前为止,已成功实现了蓝图式自动化部署。基于这种模式,企业可以在多云产品规划方面进行上层业务封装。最终,企业能够实现资源编排、应用编排、自动化部署以及云解决方案自动化开通等各种场景需求。这为企业提供了更高效和自动化的云部署解决方案。
04 参考文献列表
TOSCA-Simple-Profile-YAML-v1.3.pdf介绍文档:https://docs.oasis-open.org/tosca/TOSCA-Simple-Profile-YAML/v1.3/os/TOSCA-Simple-Profile-YAML-v1.3-os.html
Terraform官方介绍:https://www.terraform.io/
Terraform实战介绍:https://lonegunmanb.github.io/introduction-terraform/5.5.console.html
Terraform语法介绍:https://bbs.huaweicloud.com/blogs/163482
《实战》作者:斯科特·温克勒(Scott Winkler) 译者:赵利通