Terraform Infra-driver for VNF 实例化和终止¶
本规范描述了 Tacker 中的 Terraform Infra-driver。本文档的范围包括使用 AWS 作为示例 NFVI,通过此新的 infra-driver 进行 VNF 实例化和终止。
https://blueprints.launchpad.net/tacker/+spec/terraform-infra-driver
问题描述¶
Tacker 被设计为一个 G-VNFM,支持 VNF 和 CNF LCM。然而,OpenStack 是 Tacker 可以在各种云平台中部署 VNF 的唯一平台。鉴于云计算中最近的多云趋势,Tacker 必须通过实现额外的 infra-driver 来克服这种潜在的劣势。
提议的变更¶
本规范建议支持 Terraform infra-driver。Terraform [1] 是 IaC 领域的实际标准,它与平台无关、声明式且开源。将 Terraform 作为后端工具能够使 Tacker 在 Terraform 已经支持的几个平台上创建虚拟资源,例如 AWS。Terraform 有自己的配置语言来定义虚拟资源,例如 Kubernetes 中的 manifest 或 Helm 中的 Helm chart。用户可以通过包含配置轻松创建 Terraform infra-driver 的 VNF 包。
为了实现这一点,必须实现以下项目。
使用 Terraform Infra-driver 进行 VNF 实例化
使用 Terraform Infra-driver 进行 VNF 终止
添加 DB 表/字段以存储 Terraform 状态 (可选)
Terraform Infra-driver 的示例 VNF 包
更新用户文档
Terraform¶
HashiCorp Terraform 是一种基础设施即代码工具,可让您在可版本控制、重用和共享的人类可读配置文件中定义云和本地资源。 简单来说,您可以将 Terraform 视为通用的 OpenStack Heat,可以在多个云平台中使用。Terraform 支持许多云基础设施提供商,例如
亚马逊网络服务 (Amazon Web Services)
Cloudflare
微软 Azure (Microsoft Azure)
IBM Cloud
Serverspace
谷歌云平台 (Google Cloud Platform)
DigitalOcean
Oracle 云基础设施 (Oracle Cloud Infrastructure)
Yandex.Cloud
VMware vSphere
OpenStack
Kubernetes
Helm
Terraform 使用声明式配置来描述期望的最终状态,其客户端仅提供 CLI 工具,类似于 Helm。因此,Terraform infra-driver 的基本架构可以类似于 Helm infra-driver。
Terraform 的特点如下
- 配置文件
Terraform 有自己的语言 HCL 用于资源定义。包含 Terraform 代码的文件通常称为配置文件。这些文件对应于 Helm 中的 Helm chart。
- 变量
Terraform 允许用户在配置文件中定义变量。变量可以设置为文件或 Terraform CLI 的参数。这与 Helm 中的 values 类似。
- 状态文件和状态锁文件
Terraform 在创建实际资源时会创建一个状态文件和一个状态锁文件 [2]。这可能是与 Helm 最大的区别。此状态文件记录了 Terraform 创建的资源的信息。状态锁文件可防止其他人获取锁并在多个用户在不同位置使用 Terraform 管理相同资源时潜在地破坏您的状态。
注意
在 Kubernetes 中,状态文件对应于 Kubernetes worker 节点上的资源,这些资源存储了 Kubernetes 管理的所有实际资源的信息。由于没有对应于 worker 节点的实体,Terraform 会创建状态文件。
下图显示了 Terraform 的操作概述以及输入/输出文件。
Terraform Infra-driver¶
下图显示了使用 Terraform infra-driver 实例化 VNF 的概述。VNF 终止被省略,因为它几乎与 VNF 实例化相同。
实例化 VNF 包括以下步骤
- 请求创建 VNF
用户请求创建 VNF,其中包含 Terraform 配置和变量文件以及 VNFD 的 VNF 包。
- 请求实例化 VNF
用户请求使用实例化参数实例化 VNF,这些参数可以覆盖 Terraform 变量文件中定义的变量。
- 执行 Terraform 命令
Terraform infra-driver 执行 terraform 命令以将配置文件应用于 Terraform。
- 调用目标服务 API
Terraform 根据配置文件调用目标服务 API。
- 创建 VM(s)
目标服务(例如,OpenStack Nova、AWS EC2 等)创建 VM(s)。
状态文件管理¶
鉴于 terraform 配置文件位于 VNF 包中,状态文件是为每个 VNF 实例创建和管理的。Terraform 提供了几种选项(即后端)来存储状态文件 [3]。根据可用的后端,Tacker 可用的选项如下
将状态文件存储为本地文件
将状态文件存储在 InstantiatedVnfInfo 中
将状态文件存储在新的 DB 表/字段中
将状态文件存储在 Kubernetes Secret 中
将状态文件存储在 PostgresDB 中
第一个选项是最简单的方法。由于 Tacker 将 VNF 包提取到本地目录,因此我们可以将状态文件放在该本地目录中。但是,这使得从一个 VNF 包创建多个 VNF 实例几乎不可能。因此,实际上,我们需要为每个 VNF 实例创建一个目录,复制 VNF 包的所有内容并在那里保留状态文件。
如果第一个选项不可行,例如,无法创建临时目录,我们可以管理 InstantiatedVnfInfo 字段中的状态文件。由于此字段的数据类型是结构 [4] 并且状态文件以 JSON 格式编写,因此我们可以直接将状态文件存储在该字段中。该字段也适用于状态文件的生命周期与 VNF 实例的生命周期相匹配。
其余选项不建议使用,因为它会给 Tacker 的数据模型带来变化或需要另一个组件来管理状态文件。
下图显示了第一个选项的基本思想。
状态锁文件管理¶
理想情况下,我们可以禁用生成状态锁文件 [5],因为 Tacker 是管理与实例化 VNF 关联的资源的唯一实体。如果我们需要使用锁文件,我们有与状态文件类似的选项,如下所示
将状态文件存储为本地文件
将状态文件存储在 InstantiatedVnfInfo 中
将状态文件存储在新的 DB 表/字段中
备选方案¶
为单个平台实现 infra-driver 可以作为替代方案。
数据模型影响¶
无。数据模型更改的可能原因是创建新的表/字段来存储状态和状态锁文件。如“状态文件管理”部分所述,我们有几种替代方法。
REST API 影响¶
无。
安全影响¶
Terraform 在某些场景中使用敏感数据。例如,Terraform 需要凭据才能进行 API 请求。通常,我们可以通过使用环境变量来避免暴露敏感数据。但是,同时,我们需要仔细制作配置文件。
潜在风险如下,但可能还有更多
目标服务的硬编码凭据
状态文件后端的硬编码凭据 [10]
有关详细信息,请参阅最佳实践 [11]
通知影响¶
无。但是,如果状态文件存储在 InstantiatedVnfInfo 中,则可以从 LcmOpOccNotification 中省略它们。
其他最终用户影响¶
无。
性能影响¶
无。Terraform 本身和状态文件(可能位于 DB 上)可能会使用存储,但它微不足道。由于 infra-driver 由 Tacker 的 VNF LCM 驱动程序抽象,因此 Terraform infra-driver 不会影响整体性能。
其他部署者影响¶
合并此功能后,必须考虑以下几点
用户在使用 Terraform infra-driver 时需要安装 Terraform
Tacker 社区应在 Zuul 中添加 Terraform 的安装,以测试 Terraform infra-driver
对现有部署没有影响,因为这是一个独立于现有部署的新功能。
开发人员影响¶
开发人员可能需要根据 Terraform 的更新来更新 Terraform infra-driver。
开发人员可能需要修复 Terraform 引起的 Terraform infra-driver 的错误。
开发人员需要小心更改其他组件,而不是 Terraform infra-driver,例如 VNF 包格式、控制器、conductor 等,以便使其在 Terraform infra-driver 中工作。
实现¶
负责人¶
- 主要负责人
Hiromu Asahina (hiromu) <hiromu.asahina@ntt.com> <hiromu.a5a@gmail.com>
- 其他贡献者
待定
工作项¶
使用 Terraform Infra-driver 进行 VNF 实例化
使用 Terraform Infra-driver 进行 VNF 终止
添加 DB 表/字段以存储 Terraform 状态 (可选)
Terraform Infra-driver 的示例 VNF 包
更新用户文档
依赖项¶
Terraform v1.4.0 或更高版本
测试¶
Terraform 支持几个提供商,包括 OpenStack [6]、Kubernetes [7]、Docker [9] 和本地文件 [8]。最简单的方法是在功能测试中使用 OpenStack。由于 terraform infra-driver 对 VNF 包是透明的,因此其正常性不应受所用提供商的差异影响。从这个意义上说,我们可以使用其他可用的提供商(例如 Kubernetes、docker 或本地提供商)来测试其正常性。
或者,我们可以使用 LocalStack [12],它充当 AWS 服务的存根。
文档影响¶
需要解释 Terraform infra-driver 的用例。