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 的特点如下

  1. 配置文件

    Terraform 有自己的语言 HCL 用于资源定义。包含 Terraform 代码的文件通常称为配置文件。这些文件对应于 Helm 中的 Helm chart。

  2. 变量

    Terraform 允许用户在配置文件中定义变量。变量可以设置为文件或 Terraform CLI 的参数。这与 Helm 中的 values 类似。

  3. 状态文件和状态锁文件

    Terraform 在创建实际资源时会创建一个状态文件和一个状态锁文件 [2]。这可能是与 Helm 最大的区别。此状态文件记录了 Terraform 创建的资源的信息。状态锁文件可防止其他人获取锁并在多个用户在不同位置使用 Terraform 管理相同资源时潜在地破坏您的状态。

注意

在 Kubernetes 中,状态文件对应于 Kubernetes worker 节点上的资源,这些资源存储了 Kubernetes 管理的所有实际资源的信息。由于没有对应于 worker 节点的实体,Terraform 会创建状态文件。

下图显示了 Terraform 的操作概述以及输入/输出文件。

../../../_images/tf-op.svg

Terraform Infra-driver

下图显示了使用 Terraform infra-driver 实例化 VNF 的概述。VNF 终止被省略,因为它几乎与 VNF 实例化相同。

实例化 VNF 包括以下步骤

  1. 请求创建 VNF

    用户请求创建 VNF,其中包含 Terraform 配置和变量文件以及 VNFD 的 VNF 包。

  2. 请求实例化 VNF

    用户请求使用实例化参数实例化 VNF,这些参数可以覆盖 Terraform 变量文件中定义的变量。

  3. 执行 Terraform 命令

    Terraform infra-driver 执行 terraform 命令以将配置文件应用于 Terraform。

  4. 调用目标服务 API

    Terraform 根据配置文件调用目标服务 API。

  5. 创建 VM(s)

    目标服务(例如,OpenStack Nova、AWS EC2 等)创建 VM(s)。

../../../_images/insta-for-tf.svg

状态文件管理

鉴于 terraform 配置文件位于 VNF 包中,状态文件是为每个 VNF 实例创建和管理的。Terraform 提供了几种选项(即后端)来存储状态文件 [3]。根据可用的后端,Tacker 可用的选项如下

  1. 将状态文件存储为本地文件

  2. 将状态文件存储在 InstantiatedVnfInfo 中

  3. 将状态文件存储在新的 DB 表/字段中

  4. 将状态文件存储在 Kubernetes Secret 中

  5. 将状态文件存储在 PostgresDB 中

第一个选项是最简单的方法。由于 Tacker 将 VNF 包提取到本地目录,因此我们可以将状态文件放在该本地目录中。但是,这使得从一个 VNF 包创建多个 VNF 实例几乎不可能。因此,实际上,我们需要为每个 VNF 实例创建一个目录,复制 VNF 包的所有内容并在那里保留状态文件。

如果第一个选项不可行,例如,无法创建临时目录,我们可以管理 InstantiatedVnfInfo 字段中的状态文件。由于此字段的数据类型是结构 [4] 并且状态文件以 JSON 格式编写,因此我们可以直接将状态文件存储在该字段中。该字段也适用于状态文件的生命周期与 VNF 实例的生命周期相匹配。

其余选项不建议使用,因为它会给 Tacker 的数据模型带来变化或需要另一个组件来管理状态文件。

下图显示了第一个选项的基本思想。

../../../_images/op1-local-file.svg

状态锁文件管理

理想情况下,我们可以禁用生成状态锁文件 [5],因为 Tacker 是管理与实例化 VNF 关联的资源的唯一实体。如果我们需要使用锁文件,我们有与状态文件类似的选项,如下所示

  1. 将状态文件存储为本地文件

  2. 将状态文件存储在 InstantiatedVnfInfo 中

  3. 将状态文件存储在新的 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 中工作。

实现

负责人

主要负责人
其他贡献者
  • 待定

工作项

  • 使用 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 的用例。

参考资料