服务器太多了不好管?UCloud基于Terraform的资源编排工具详解

背景

随着用户在 UCloud 上资源用量的指数增长,传统 API/SDK 手动编写脚本的资源管理方式已经无法满足其需要。为此,UCloud 研发团队基于 Terraform 编写了一套自己的资源编排工具,帮助用户降低云上资源的管理成本,为其提供安全可靠、高度一致的产品使用体验,尽可能消除迁移上云时的风险。

Terraform 代表了业界前沿的技术和标准,我们基于此,并配合 UCloud CLI 等工具,编写了新一代 UCloud 资源编排工具,进一步拓展 Terraform 的功能,实现基础设施可编程。在一个通过 ULB 卸载流量至云主机的案例中,相比于传统方式,新方案下的构建时间从原先的 3 分 20 秒缩短至 43 秒,编排的效率、稳定性和可描述性都得到了显著提升。

Terraform是什么?

Terraform 是 Hashicorp 公司开源的一种多云资源编排工具,目前已经形成完整生态,并与多家主流云厂商建立合作。

使用者通过一种特定的配置语言(HCL, Hashicorp Configuration Language)来描述基础设施,由 Terraform 工具统一解析,构建资源之间的关系,生成执行计划,并通过调用 UCloud 公有云 API 来完成整个基础设施生命周期的管理。

相对于其它的云上资源管理方式,Terraform 的主要特点有:

  1. 有广泛的兼容性,目前海内外累计已有超过 40 家公有云厂商支持,其中包括 UCloud 在内的 4 家国内云厂商,另有 200 多个软件服务商为其提供支持。
  2. 基于 IaC(基础设施即代码,Infrastructure as Code)的设计,可以将基础设施以一种领域特定语言描述出来,消除了在基础设施自动化时描述语义上的歧义,同时减轻人为因素造成的不确定影响。
  3. Terraform 在执行编排动作前,会生成一份可读性良好的执行计划,关键基础设施的变更可以得到充分审查,保证了基础设施的可靠性。
  4. 基于 DAG(有向无环图,Directed Acyclic Graph)描述资源与资源之间的关系,由于 DAG 良好的拓扑性质,当资源属性与资源关系发生改变时,变更动作将被充分并行地执行。

(图片来源于Terraform)

下图是一张资源编排与传统资源管理方式的对比表:

表格1:资源编排与传统资源管理方式对比

可以看出,在自动化 DevOps 环境下,资源编排相对传统资源管理方式具有明显优势,目前已覆盖了 IaaS 层的核心产品,但随着时间的推移,将来 UCloud 资源编排会支持更多的产品。

应用场景

用户可以很容易的从Terraform受益,因为初始化云服务时若缺少资源编排工具,将投入大量的时间成本,而且对于云上资源的变更,往往需要很复杂的变更逻辑以保证基础设施的安全性。

UCloud 资源编排工具能够很好地解决如下常见的问题:

– CI/CD 自动化资源管理

– 高峰期应用缩扩容

– 部署复杂资源拓扑(例如两地三中心的应用架构)

例如,驿氪作为一家SaaS解决方案提供商,已经将UCloud Terraform编排系统接入自身业务。

下图是驿氪业务架构的示意图。它同时使用了多家云服务,需要统一的资源管理平台进行多云管理,而独立研发一套资源管理平台,需要对接各云厂商接口,同时还要研发人员深入了解各家云服务的产品细节,这无疑会加重企业的研发成本和运营成本。

而在应对SaaS 业务时,Terraform可以灵活的动态调整资源,用户只需要调整部分参数,就可以利用模板进行非常快速的资源管理,相较于自建管理平台,UCloud Terraform可以极大节省用户的运营成本和效率。

生命周期

以首次执行 Terraform 创建 UCloud 云上资源为例,这一资源编排动作的生命周期如下图所示:

图:Terraform 生命周期

图中立方体所示分别为:

Terraform 核心进程:负责资源定义文件,构建有向无环图,管理状态存储;

Provider 进程:即提供资源编排能力的进程,包括由云厂商实现的能力(比如 UCloud 的资源编排实现),和应用程序提供的能力(比如 TLS 自签名证书)等;

Provisioner 进程:即提供资源编排后处理操作的进程,比如执行 Shell 命令,上传文件等。

以中央的有向无环图为分界线,左侧的部分是 Terraform 本身提供的能力,右侧是由云厂商提供的能力。

Terraform 核心的良好抽象,保证了资源编排的安全和稳定,为 UCloud 资源编排提供了坚实的工程基础。

UCloud资源编排实践

在一个生产环境的资源编排系统中,往往要依赖数目庞大的云资源后台管理服务。资源编排的工程实现中,以下几个方面的根本诉求需要首先得到保障:

– 保障资源编排在复杂终端环境下的成功率。这个是最基本也是最核心的诉求。

– 保障产品的一致性。使用户可以平滑迁移,变更无感知。

– 保障产品的工程质量。资源编排作为关键基础设施的接入方式,本身需要足够稳定可靠。

下文,我们将详细分享 UCloud 在基于 Terraform 的资源编排工具研发中,在容错能力、接入能力和工程能力优化上的一些实践。

容错能力优化

容错能力是衡量系统可用性的一个重要维度,资源编排作为 UCloud 服务的入口,本身必须足够稳定,具有对故障可以做出合理应对的能力,包括对上游服务异常的容错能力,以及对于输入异常的纠错能力。

首先,Terraform 的杀手级特性是执行计划与过程分离,用户在执行真正的资源编排动作变更现网基础设施之前,可以先生成执行计划,比较资源定义文件和当前资源状态的差异,检查关键基础设施的变更。

UCloud 在实现资源编排的过程中,借助 Terraform 执行计划的 CustomDiff 特性,自定义了部分资源的 Diff 过程。比如,两个地域之间仅能存在一条高速通道(UDPN),如果执行编排动作前已经存在了一条高速通道(UDPN),将会把所有的编排动作阻止在执行计划阶段,提高终端用户的使用效率。

图:自定义 Diff 以在执行计划中检查输入

对于错误的处理,UCloud 编排工具通过梳理整个编排工作流的生命周期,将错误信息严格压缩在(动词、附加动作、资源名、ID)这个形式化的四元组中,转化为人类可读的描述信息反馈给使用者,对于输入异常可以在提供一定的交互纠错能力的前提下,精确定位到源码行。

图:错误信息四元组的自然语言表示样例

其次, UCloud 通过下文介绍的 API 一致性工程,识别出了所有操作的幂等性质(即该操作是否存在副作用,导致真正的资源创建),并对所有幂等(无副作用的)操作执行自动重试,大幅提升了编排工具的容错能力,同时保证了自动重试机制是真正安全的。对于非幂等操作,得益于 Terraform 的状态管理机制,可以简单地重新执行编排计划,仅重试失败的创建过程。

UCloud 编排工具还提供对于异步操作的同步封装,使用 Terraform 内建的等待机制,创建资源后,将会轮询等待资源完成可以查询方才返回成功,保证操作的原子性和资源状态的一致性。

最后, 对于上述的重试或等待机制,使用指数级增长的间隔(Exponential Backoff),以及优雅退出(Gracefully Shutdown)的方案,进一步提升资源编排的容错能力。

接入能力优化

基于 Terraform 的资源编排有一定固有的局限性,比如其本身更适合基础设施的构建,不适合 adhoc 的临时日常工作,比如列表查询和开关机这样的操作。

如要批量重启主机,使用 Terraform 的做法是使用 data source 查询出对应的数据,定义输出变量,再将输出变量值作为参数传递给外部的脚本。在这样的即席查询场景下,相对于 Ansible 等配置管理工具并没有明显的优势。

因此 UCloud 在资源编排之外,开发了 UCloud CLI 工具来扩展资源编排的能力。例如,使用 CLI 来查询和重启通过 UCloud 编排工具创建的资源:

UCloud 实现了资源编排与 UCloud CLI 的集成,资源编排工具可以直接使用 CLI的权限配置信息。也可以通过编排工具的特性,调用 UCloud CLI 进行额外的资源管理操作。

图:Terraform 与 CLI 集成用法示例

打通资源编排与 UCloud CLI 之后,资源编排可以复用 CLI 即席查询的能力,而CLI 可以复用资源编排所持有的资源拓扑信息,例如主机列表,网络 CIDR 信息等,极大拓展了双方的的产品接入能力。

工程能力优化

UCloud 资源编排从立项之初,就将终端用户使用上的一致性和可用性作为核心诉求。要满足这些诉求,在工程上必须攻破几个关键的技术难关:

  1. 尽可能使用户实现跨版本、跨云的平滑迁移。
  2. 同时对资源编排工具所依赖的基础 API 的实现自动化管理,从源头上提高编排工具的可用性。
  3. 资源编排作为关键基础设施的接入方式,本身需要足够的质量保障措施。

平滑迁移

首先,对于资源编排工具的升级,UCloud 严格按照 Terraform 的 Schema 变更策略,每当资源的属性有破坏性的变更,都会随之提供版本迁移的实现,使终端用户在升级工具时,自动将其资源状态平滑迁移至新版本。

其次,对于云平台之间的迁移,UCloud 实现了通用的风格转换函数,通过将 UCloud 接口的大写驼峰(Camel)命名,统一映射成 Terraform 常用的小写下划线(Snake)风格,并使用 Terraform 建议的产品命名法,降低用户的跨云迁移成本。终端用户只需要少量改动模板,即可通过资源编排工具平滑接入 UCloud。

变更自动化

资源编排作为 UCloud 重要的产品接入方式,对于 UCloud 全线产品都有很强的依赖,接口变更对接时的一点微小错误,都可能导致破坏性的后果。

所以一致性工程的重要目标是,快速响应产品新特性的变更,同时尽可能降低人工成本,使变更自动化,减少错误的发生。

为了使 API 能够得到统一管理,同时防止产品间竖井式的信息隔离,UCloud 很早以前就打造了公共、统一的 API 管理平台,将所有现网 API 的定义收敛至统一的 API 注册中心上,使用自定义的格式来形式化地描述 API Schema。API 管理平台将 API 的场景抽象成测试集(Test Set),一次 API 的调用抽象成测试用例(Test Case),并使用自定义的表达式语法构造随机的参数注入到用例中执行。

图:API 管理平台示意图

基于 API 管理平台,UCloud 资源编排团队编写了 API SDK 的自动化生成程序,通过严格形式化的 API 定义,转译成 Go SDK 代码。同时通过编写一个递归下降的表达式解析器,将测试用例中表达式语法,转译成等价的 Go 代码。实现了 API 定义和 Go 代码的直接映射,低成本同步上游变更。

图:通过编写 API 建模工具转译 API SDK 代码

此外在这个过程中,UCloud 通过在 API 管理平台与 SDK 之间编写 API 建模工具,用以抽象出一个中间层,在该层统一标注出 API 的幂等性质,为资源编排工具提供了真正安全的重试机制。

这样就完成了整个调用链路上的接口一致性工程建设,实现了从 API 管理平台到 SDK 到 Terraform 的完整语义映射,降低了 SDK 的开发和维护成本,同时消除了人为变更带来的不确定影响。

质量工程建设

资源编排作为大规模云上资源管理的推荐方式,涉及到关键基础设施的操作与管理,编排工具本身的质量十分关键。

表格2:资源编排持续集成检查表

如表2所示,作为一个开源项目,UCloud 资源编排工具共有三个质量周期,

– 开源协作周期,使用 Travis CI 进行代码风格检查和单元测试,不会发起真正的 API 请求;

– 合并主分支周期,UCloud 使用 Gitlab CI on Kubernetes 进行风格检查、单元测试和集成测试,其中集成测试会调用现网 API 操作真正的云上资源,并在每天凌晨进行 Daily Regression;

– 发布正式 Release 到 Terraform 官方仓库周期,合作方 Hashicorp 使用 TeamCity 进行全量验收测试,当所有测试完成后,发布新版本。

为了保证代码不会随时间腐化,提前清除一些隐患,比如拼写错误、安全密钥泄露、抽象不合理等等,UCloud 接入产品团队选取了三种不同维度的静态检查工具来量化代码质量,其中包括:

– GoReportCard,用来做最基本的风格检查

– SonarCloud,发现代码的 Bug 和安全问题

– Gocyclo,计算函数的圈复杂度(圈复杂度是用来衡量一个函数复杂程度的指标,和控制流的复杂程度相关)

并通过周期性的代码优化,将代码质量的量化指标始终维持在 A+ 评级。

写在最后

经过长时间的发展,Terraform 已经成为一个业内通用的资源编排工具,且近年来海内外的友商也陆续开始支持基于 Terraform 的资源编排系统,证明了业内对通用资源编排系统的强需求。

UCloud 深入研究了 Terraform 的内部机理,并基于此为 UCloud 下一代资源编排系统进行了深度的探索,在研发过程中多次优化,打通整个链路上的基础工程建设,最后通过充分的质量工程实践,为资源编排的可靠性与稳定性保驾护航。UCloud Terraform 的具体使用细节和样例请点击阅读原文至 UCloud 资源编排官方文档查阅。

欢迎添加小助手微信rocsun,加入UCloud Terraform群,和我们一起畅谈关于Terraform的各种需求、使用、疑难等。

原文地址:https://blog.51cto.com/13832960/2360209

时间: 2024-10-11 00:04:07

服务器太多了不好管?UCloud基于Terraform的资源编排工具详解的相关文章

转:基于科大讯飞语音API语音识别开发详解

最近项目需要用到android语音识别,立马就想到科大讯飞,结合官方实例及阅读API文档,初步的完成了Android语音识别,下面是实现过程实录. 一.准备工作 1.你需要android手机应用开发基础 2.科大讯飞语音识别SDK android版 3.科大讯飞语音识别开发API文档 4.android手机 关于科大讯飞SDK及API文档,请到科大语音官网下载:http://open.voicecloud.cn/ 当然SDK和API有多个版本可选,按照你的需要下载,其次,下载需要填写资料申请注册

Linux-6.5下 MariaDB-10基于LVM快照的备份数据 详解

理解部分: LVM是逻辑盘卷管理(Logical Volume Manager)的简称,它是Linux环境下对磁盘分区进行管理的一种机制,LVM是建立在硬盘和分区之上的一个逻辑层,来提高磁盘分区管理的灵活性.LVM可以对分区在线扩容,快照,镜像和条带化,功能非常强大.这篇文章的主题就是其中一个功能--快照. 快照(Snapshot)就是关于指定数据集合的一个完全可用拷贝,该拷贝包括相应数据在某个时间点(拷贝开始的时间点)的映像.快照可以是其所表示的数据的一个副本,也可以是数据的一个复制品: 其实

基于H5的微信支付开发详解

这次总结一下用户在微信内打开网页时,可以调用微信支付完成下单功能的模块开发,也就是在微信内的H5页面通过jsApi接口实现支付功能.当然了,微信官网上的微信支付开发文档也讲解的很详细,并且有实现代码可供参考,有的朋友直接看文档就可以自己实现此支付接口的开发了. 一.前言 为何我还写一篇微信支付接口的博文呢?第一,我们必须知道,所谓的工作经验很多都是靠总结出来的,你只有总结了更多知识,积累了更多经验,你才能在该行业中脱颖而出,我个人觉得如今的招聘,很多都需要工作经验(1年.3年.5年....),其

****基于H5的微信支付开发详解[转]

这次总结一下用户在微信内打开网页时,可以调用微信支付完成下单功能的模块开发,也就是在微信内的H5页面通过jsApi接口实现支付功能.当然了,微信官网上的微信支付开发文档也讲解的很详细,并且有实现代码可供参考,有的朋友直接看文档就可以自己实现此支付接口的开发了. 一.前言 为何我还写一篇微信支付接口的博文呢?第一,我们必须知道,所谓的工作经验很多都是靠总结出来的,你只有总结了更多知识,积累了更多经验,你才能在该行业中脱颖而出,我个人觉得如今的招聘,很多都需要工作经验(1年.3年.5年....),其

Spring基于注解TestContext 测试框架使用详解

概述 Spring 2.5 相比于 Spring 2.0 所新增的最重要的功能可以归结为以下 3 点: 1.基于注解的 IoC 功能:  2.基于注解驱动的 Spring MVC 功能:  3.基于注解的 TestContext 测试框架. Spring 推荐开发者使用新的基于注解的 TestContext 测试框架,本文我们将对此进行详细的讲述. 低版本的 Spring 所提供的 Spring 测试框架构在 JUnit 3.8 基础上扩展而来,它提供了若干个测试基类.而 Spring 2.5

基于JavaSE阶段的IO流详解

1.IO流基本概述 在Java语言中定义了许多针对不同的传输方式,最基本的就是输入输出流(俗称IO流),IO流是属于java.io包下的内容,在JavaSE阶段主要学下图所示的: 其中从图中可知,所有输入流类都是抽象类,是InputStream或者抽象类Reader的子类:而所有输出流都是抽象类,是OutputStream或者Writer的子类.输入输出流的定义是根据流向所决定的,我们可以是本地为一个实体物质,从外界往本地输入,按照本地的状态就是读取,反之,从本地向外写入就是输出.IO流是最基本

基于Java的TCP Socket通信详解(计算机端/Android手机端)

TCP Socket通信是一种比较常用的基于连接的网络通信方式.本文通过Java实现TCP Socket通信,并将其用于计算机端.Android手机端,同时做到代码规范化,实现代码最大化复用. 本文代码可在GitHub下载,建议对照源码阅读文章 https://github.com/jzj1993/JavaTcpSocket TCP连接的建立 客户端和服务器间通过三次握手建立TCP连接.在Java中,连接建立完成后,服务器端和客户端分别获取到一个Socket实例,之后就可以通过这个Socket实

基于 Apache 构建 web虚拟主机详解

虚拟 web 主机指的是在同一台服务器中运行多个 web 站点,其中的每个站点实际上并不独立占用整个服务器,因此被称为"虚拟" web主机.通过虚拟 web 主机可以充分利用服务器的硬件资源,从而大大降低网站构建及运行成本.使用 httpd 可以非常方便地构建虚拟主机服务器,只需要运行一个 httpd 服务就能够同时支撑起大量的 web 站点.httpd 支持的虚拟主机类型包括以下三种:基于域名:相同IP .相同端口 .不同域名基于IP地址:不同IP.相同端口基于端口:相同IP.不同端

基于JDK的动态代理技术详解

虽然对于Spring的基本思想Aop是基于动态代理和CGlib这一点很早就有所认识,但是什么是动态代理却不甚清楚.为了对Spring加深理解,我觉得好好学习一下java的动态代理是非常有必要的. 静态代理 在学习动态代理之前我先花一点时间了解一下静态代理,从静态代理出发了解代理到底是怎么一回事,以及了解静态代理的局限性,进而明白为什么要发展及使用动态代理技术. 相信使用过Spring框架的同学都知道Spring利用Aop完成声明式事务管理以及其他的代理增强,也就是在方法执行前后加上一些譬如时间.