摘要:而对于依赖关系的抽象,业界最通行的做法即使用有向无环图,来描述事务间的依赖关系。图表并行遍历,执行资源动作从根节点开始,并行地去编排整个资源拓扑,遍历整个有向无环图,直到所有资源都被成功编排,并执行清理操作。
Terraform 是 Hashicorp 公司开源的一种多云资源编排工具。使用者通过一种特定的配置语言(HCL Hashicorp Configuration Language)来描述基础设施,由 Terraform 工具统一解析,构建资源之间的关系,生成执行计划,并通过调用各家云厂商的具体实现来完成整个基础设施生命周期的管理。
相对于其它的云上资源管理方式,Terraform 的主要特点有:
在 UCloud,我们最终选择了 Terraform 来编写 UCloud 基础设施代码,并配合 UCloud CLI、Ansible 等工具,进一步拓展了 Terraform 的功能,实现基础设施可编程。
本文将详细阐述 Terraform 的整个生命周期,从 Provider 开发者的视角,介绍 Terraform 在安全、效率和状态一致性三个方面的内部机理与具体实现。
以首次执行 Terraform 创建 UCloud 云上资源为例,这一资源编排动作的生命周期如下图所示:
图表 1 Terraform 生命周期
图中立方体所示分别为:
以中央的有向无环图为分界线,左侧的部分是 Terraform 本身提供的能力,右侧是由云厂商提供的能力。
当执行 Terraform 命令首次编排云上资源时:
在并行构建资源时:
随着云计算的普及,以及人们对于数据安全性和可用性上的考量,越来越多的企业开始意识到,不能把鸡蛋放在一个篮子里,基础设施的中立和非绑定是云服务商十分关键的属性。
Terraform 中每一个云厂商的实现(Provider)都是一个独立的进程,进程间使用 RPC 通信的方式下发指令和交换数据,这样设计有什么好处呢?
而从使用者的角度来看,Terraform 多进程模型的重中之重,是多云环境下厂商隔离带来的安全性问题。安全性是多云编排的基石,如果无法保证云厂商之间的隔离性和安全性,多云编排则无从谈起。
Terraform 使用插件(Plugin = Provider + Provisioner)来抽象出各个云厂商之间的差异,并相互隔离。
图表 2 Terraform 多云插件管理
在一次编排任务的生命周期中,Provider 将会基于 Terraform 提供的能力,完成静态检查(Validate)、资源状态同步(Read/Refresh)、生成执行计划(Plan)、执行编排(Apply)等操作。
软件工程的实践表明,高层次的抽象,可以简化问题,让复杂的问题变得可以测试。而对于依赖关系的抽象,业界最通行的做法即使用有向无环图(DAG,Directed Acyclic Graph)来描述事务间的依赖关系。有向无环图上的点即事物本身,边则是事物与事物之间的联系。
业界对于 DAG 的使用极为广泛,比较典型的是各种大数据工作流引擎,比如 Oozie,Airflow 等。在这些引擎中,批处理任务作为 DAG 上的节点,而任务间的依赖作为 DAG 上的边。
图表 3 业界常见的 DAG 应用
Terraform 将所有的资源构建为一张有向无环图(DAG),计算它们的依赖关系,并行地去创建和修改相互间没有依赖的那些资源。因此整个基础设施的构建过程是高效且严格有序的。
下面我们将举例介绍它的内部原理和实现。
注意:文中的图与描述为了呈现效果,分别有所简略,仅供参考
假设一个场景,一台主机与一个公网弹性 IP 绑定,且客户使用自有的第三方 DNS 服务,通过 A 记录指向该主机的公网 IP。
图表 4 构建云上资源拓扑
这个场景展现了 Terraform 对于资源拓扑关系的描述能力,以及对于外部服务的集成能力。它背后的工作原理是什么样的呢?
所有云上资源,都抽象为 DAG 的一个节点,而资源与资源之间的关系,则有两种抽象方式:
图表 5 有向无环图变换
在图构建的过程中,Terraform 需要对 DAG 进行若干次变换(Transform)操作,如:
最后对整张图进行遍历,对每一个资源节点分别执行资源编排操作,比如读取、创建、更新和删除等。
图表 6 并行遍历,执行资源动作
从根节点开始,Terraform 并行地去编排整个资源拓扑,遍历整个有向无环图,直到所有资源都被成功编排,并执行清理操作。
可以看出,由于有向无环图出色的拓扑性质,整个遍历过程,存在着充分的局部并行化,编排时间跟基础设施复杂度有显著关系,而同构基础设施的规模则对编排时间影响较小,保证了 Terraform 在大规模水平扩展时拥有较好的性能。
Terraform 引入了面向资源的设计,将资源的状态描述为一个状态的集合,并支持若干种不同类型的状态存储。
默认情况下,在 Terraform 的执行目录下,会存储一个本地的资源状态文件,并在每次编排开始时,从远程同步状态到本地,比较该状态与用户定义的资源之间的差异,从而生成编排计划。
在这一抽象中,Terraform 官方给出了几个基本的定义:
从上文中的定义可以看出,执行计划(Plan)本质上就是 Diff 格式化输出的结果,而执行编排就是应用这个 Diff 的过程。
Terraform 将对资源状态的管理抽象出了一个统一的状态管理层(Backend),使得基于 Terraform 的资源编排系统可以保持基础设施的一致性。
想象一个场景,如果 A 同学在操作基础设施的变更,B 同学此时也想执行变更,这个变更会执行么?
图表 7 同时操作云上资源
答案显然是不会的,任何一个成熟的系统都应该对这样的问题提出解决方案。
Terraform Backend 通过对状态加锁来解决资源的竞态问题。A 在操作资源的时候状态会被锁定,此时 B 执行的任何变更行为都将被拒绝。
其中,consul、etcd 和 http 是比较推荐的扩展:
Terraform 对 Backend 的抽象增强了状态存储的可扩展性,同时提供了可选的锁机制扩展,基于此云厂商可以定义自己的远程状态存储,用于托管用户的资源状态,并为用户提供可靠的并发安全保障。
Terraform 的杀手级特性之一 —— 执行计划,允许导出执行计划,延后执行,提供了在 CI/CD 环境下人工审查执行计划的可能,对关键基础设施变更的安全性提供了保障。所以,导出的执行计划是否过期是生产环境中最常见的问题。
Terraform 如何保证已经失效的执行计划不再被执行?Terraform 使用多版本快照(Multi-Version Snapshot)的方式来实现。可以类比于常规的 MVCC(多版本并发控制)来理解,下图是一个最小化的 MVCC 实现:
图表 8 常规的多版本 MVCC 实现
进程 P1 和 P2 依次读到了序号为 1 的数据,并且都想进行写操作,P1 先修改数据,自增序号为 2 并写入成功,此时 P2 进行写操作时,由于修改后的序号同样为 2,此时应抛出写失败,P2 需要主动重新读取最新的数据再次修改,才能成功写入。
由于 Terraform 可以执行一个已导出的执行计划,一个事务的时间被极大延长了,所以版本冲突的可能被无限放大。
基于此,Terraform 同样选择该方式,通过一个序号来标识状态的版本,当执行计划的状态序号小于当前状态的序号时,直接丢弃过时的执行计划:
图表 9 Terraform 的执行计划过期实现
基于这样的原理,Terraform 保证了导出的执行计划是有时效性的。例如一个用户导出了一份执行计划,将云主机从 1 台水平扩容到 3 台,但在该执行计划审查通过之前,另一个用户已经扩容到 5 台云主机,此时这份执行计划执行时会 Abort,而不会从 5 台降为 3 台,从而保证关键基础设施的变更是安全的。
在软件构建或产品设计中,不可避免的会出现一些破坏性的变更,而这些破坏性的变更又不可避免地会影响资源状态。
图表 10 状态迁移的痛点
常见的在线服务(比如 HTTP API)设计中,通常在 HTTP Header 甚至 URL 加一个版本号来区分新老版本。但 Terraform 作为一个二进制分发的软件,且在用户的本地存储有一份资源状态,如果进行破坏性的升级,则必须同时考虑存量用户的正常使用,以及旧版状态文件的原地升级。
Terraform 的解决方案是标定资源的 Schema Version,默认 Version 为 0,当资源的 Schema 有破坏性的更改时,作为 Provider 的云厂商必须为此提供一个原地升级函数。
图 11 资源状态平滑升级
假设 UCloud 的 EIP 共有 3 个版本,0,1,2,则须提供 2 个升级函数。
当一个使用版本 0 的用户升级到最近版本 2 执行编排的时候,他的状态文件将会依次经过两个升级函数,将资源状态原地升级至最新版本的状态,而无需任何额外操作。
总体而言,Terraform 是一个安全的,可扩展的,有扎实的理论基础,也有渐进式工程实践的资源编排工具。Terraform 的关键特性:基础设施即代码、多云编排、执行计划与过程分离、统一的资源状态管理,是我们在新一代资源编排系统实践中的重要保障。
作者简介
李宇飞,UCloud 后台研发工程师,参与资源编排等接入产品项目研发,专注于云计算,DevOps,分布式系统等领域。
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/126083.html
摘要:宋体为了解决此类问题,开发了相关代码,并被自动化构建镜像工具的官方仓库所采纳。宋体宋体可以运行在常用的主流操作系统上,它不是等软件的替代品,而是集成并使用这些自动化配置工具在镜像上预装软件等。背景 云主机是用户使用最高频的云产品之一。随着云主机数量的增多,如何在云主机中保证版本化部署的一致性,成为用户常见的难题。在现有情况下,用户首先需要手动或使用脚本连接主机,然后再进行部署安装,操作...
摘要:如何允许开发人员团队在多云和混合云环境中编写和实施一致的策略和授权。使用跨云创建一致的策略和流程开放策略代理是一种流行的工具,正是因为它与域无关。简而言之,组织无需浪费任何时间对应用程序进行逆向工程以实现多云可移植性。OpenPolicy Agent如何允许开发人员团队在多云和混合云环境中编写和实施一致的策略和授权。 随着多云战略成为完全主流,公司和开发团队必须弄清楚如何在云环境中创建...
摘要:企业将业务迁移到云平台的最大好处之一是可以降低工作和运营成本,其中一个最重要的因素是云计算基础设施的自动化和配置。幸运的是,有许多云计算基础设施自动化工具可用于帮助加快流程。企业需要深入了解将工作负载迁移到公共云的正确步骤,并因此降低成本。云迁移不会自行发生,在迁移项目成功之前并不能完成工作和任务。企业将业务迁移到云平台的最大好处之一是可以降低工作和运营成本,其中一个最重要的因素是云计算基础...
摘要:此案例使用创建一台服务器基础设施,通过创建一台云主机并在云主机上绑定云硬盘和外网弹性,同时使用外网防火墙来保护云主机的网络安全性。搭建一台 web 服务器本篇目录摘要拓扑图操作步骤参考文献关键词:UHost,EIP,UDisk摘要云主机是构建在云环境的弹性计算资源,是 UCloud 最为核心的服务。有些服务,如弹性 IP、镜像、云硬盘等必须与云主机结合后使用,另一些服务,如数据库、缓存、对象...
摘要:是基于公司开源的实现的多云资源编排工具,用户可以通过编写规格文件,实现对基础设施的自动化管理。资源编排工具将资源的状态描述为一个状态的集合,并支持若干种不同类型的状态存储。UCloud Terraform 是基于 Hashicorp 公司开源的Terraform实现的多云资源编排工具,用户可以通过编写 HCL(Hashicorp Configuration Language) 规格文件,实现...
阅读 3473·2023-04-25 20:09
阅读 3684·2022-06-28 19:00
阅读 2994·2022-06-28 19:00
阅读 2995·2022-06-28 19:00
阅读 3048·2022-06-28 19:00
阅读 2834·2022-06-28 19:00
阅读 2969·2022-06-28 19:00
阅读 2578·2022-06-28 19:00