Murano/多云支持
总结
这是为 Murano 添加跨不同云部署应用程序能力的高级提案,目标云的选择应可通过配置和通过云操作员和/或最终用户通过用户界面控制的策略来控制。Murano 应包括对以下云的支持:OpenStack(原生)、VMWare、Amazon。我们认为 Murano 是 OpenStack 的一部分,可以不仅部署到安装它的云,还可以部署到其他多个云(混合云应用程序/灾难恢复)。
建议的方案包括实现以下特性/组件
- 用于实现低级云资源生命周期的每个云的插件
- 描述抽象云资源层次结构和具有云特定功能的实际实现的内核库类
- 基于配置的云身份/凭证管理
- 基于策略的类依赖注入机制
- 用户界面(OpenStack Dashboard)所需的更改
高级描述
Murano 中的应用程序使用名为 MuranoPL 的面向对象语言定义。Murano 不允许直接从 MuranoPL 执行任何 IO 操作,所有对所需 HTTP API 的调用都应在 Python 中编写,然后从 MuranoPL 中使用。Murano 具有一组预定义的 MuranoPL 类内置,称为内核库,它提供对云资源的访问,并且本质上是用于开发应用程序的 SDK。
我们需要设计内核库中抽象云资源(例如,vm、镜像)和每个云的实际实现的新类层次结构,这些实现具有由基于 Python 的插件支持的云特定功能,这些插件具有这些资源的实际生命周期。
Murano 中的身份管理比较简单,因为当前 Murano 在不存储任何凭证的情况下,在用户处接收到的 auth-token 下运行。起初,在简单的配置文件中存储每个云的配置可能就足够了,而如何正确实现身份管理规范将另行制定。策略是云操作员用来控制应用程序行为的一组规则和设置。这是 Murano 中尚未覆盖的另一个领域。其中,策略可用于配置应将应用程序部署到哪个云平台。目标是创建一个能够为特定云或策略要求选择最佳接口实现机制。
技术方案
现有实现
Murano 使用面向对象建模方法来定义所有云实体,从低级基础设施实体(如服务器、网络、卷等)到应用程序组件和应用程序本身。在这种方法中,任何可以以任何方式使用或部署或消耗的东西都是一个对象。像大多数 OOP 系统一样,对象暴露数据字段(属性)和方法 - 可以对给定对象执行的操作。
正如大多数 OOP 系统中常见的,对象是定义其结构和行为的类的实例。Murano 使用一种名为 MuranoPL 的自研编程语言来实现这一目的。
MuranoPL 是一种动态面向对象语言,如 Python 一样,并且具有该类语言典型的许多概念:类继承(包括多重继承)、方法重载、多态性、异常处理以及变量、循环等基本内容。另一方面,它也是一种专门为 Murano 用例而设计的领域特定语言 (DSL)。
一个主要用例是应用程序组合。通常,不同的类由不同的供应商独立开发。事实上,Murano 应用程序目录是类的存储库,当用户在 UI 中构建应用程序环境时,他实际上是从存储库中的类构建一个新程序。为了使不同的类能够一起存在于该程序中并能够相互通信,MuranoPL 提供了丰富的类来表达它们彼此的要求的能力。MuranoPL 的另一个特性是,它以 YAML 格式表示。
由于任何人都可以为类存储库做出贡献,因此 MuranoPL 被设计为沙盒化和安全的,以便在共享服务器上运行,而无需信任代码。因此,它不能自行执行任何 I/O。相反,它依赖于用 Python 编写的较低级别的代码片段,这些代码片段为 MuranoPL 提供与其它云服务交互、对虚拟机执行操作等的 API。其中一些 API 是 Murano 源代码的一部分,而另一些可以作为插件实现。
Murano 附带了许多代表常见基础设施实体(如实例、网络等)的类。这些类合起来被称为 Murano 内核库,并且被大多数应用程序用于与底层云交互。目前,这些类是只考虑 OpenStack 的编写的,它们的实现主要依赖于 OpenStack Heat API 来创建 OpenStack 资源。这使得它不足以用于没有这种 API 的其它云,并且实体并不总是具有与在 OpenStack 中相同的属性。
拟议的解决方案
Murano 缺少一些技术,以便在多个云上运行
- 与各种云管理平台 API 通信的云 Python 绑定
- 多云内核库
- 多云身份管理
- 云凭证
- 实例凭证(用于登录编排虚拟机的凭证)
- 策略系统
- Openstack Dashboard 增强
云 Python 绑定
为了使 Murano 具备多云能力,我们需要 python 绑定来与这些各种云管理平台的 API 通信。目前,murano 只能使用 Heat Orchestration Engine APIs(HOT 模板)在 Openstack 云管理平台上编排低级云资源。此功能内置于 Murano 内核库中,而不是作为插件,这使得提供选择各种 python 绑定的灵活性变得困难。在本版本中,低级云 python 绑定将作为 MuranoPL 内核库可以调用的插件实现。
将实现以下云的插件
- Openstack、VMWare vCenter 和 Amazon AWS
将为以下低级云资源提供生命周期实现
- 计算(虚拟机)。
- 以下云的安全组
- Openstack 和 AWS
- 需要在 vCenter 中探索安全组的概念。
- 其他云资源(如网络和存储块)的生命周期实现将在未来的版本中解决。此版本解决了将计算附加到已存在的网络和存储资源的问题。
这些 python 绑定将与 murano 代码捆绑在一起,但不会作为 murano 安装的一部分默认安装。为了减少通过 openstack 批准流程获取支持这些云 python 绑定的软件包的依赖性,这些绑定必须通过 pip install 或通过插件提供的 setup.py 脚本单独安装。
多云内核库
我们需要更复杂的类层次结构,需要提取通用于所有(或大多数)云的属性和方法到顶级接口,并让云特定的类来实现这些接口。这些类可以暴露额外的属性和方法,这些属性和方法是特定于特定云的,以便应用程序可以使用完整的云功能,在没有跨云可移植性要求的情况下。
为了构建这样的类层次结构,我们需要对广泛的云平台进行仔细分析,以找出什么是通用的,以及每个实现的具体内容。不仅是不同云中属性或类似实体之间的差异,还需要考虑不同的网络拓扑、安全管理。还可能存在影响设计的其它因素,例如 Linux 和 Windows 实例之间的区别、与实例交互的不同方式、同一云中的替代网络实现等。
新类需要新的原生 API 来与不同的云平台通信 - Python 类或函数,这些类或函数将暴露低级云功能给 MuranoPL。API 方法应提供执行目标云上基本 CRUD 操作的能力。这些 API 应该尽可能小和灵活,而大部分编排和逻辑应该放在 MuranoPL YAML 类中。
身份管理
Murano 是一个与 OpenStack 良好集成的多租户解决方案。特别是,Murano 既不处理身份验证和授权,也不要求用户提供密码或其他凭证。相反,它依赖于 OpenStack dashboard 在部署时向 Murano 提供一个 Keystone token,该 token 可用于进一步验证到其它 OpenStack 服务的身份。
但是,Keystone token 对在 Murano 运行的云之外进行部署没有帮助。因此,对于目标云不是 Murano 运行的云的情况,身份验证必须成为 Murano 工作流程的一部分,并且成为用户输入的一部分。这也意味着策略必须影响用户输入,因为不同的云平台可能需要不同的输入字段和不同的处理。
目标云的配置(包括访问凭证)应成为 Murano 的一等对象,可以在 MuranoPL 中作为云关联类(应用程序、VM 等)的属性访问。将来,应该可以使用常规 Murano 工具创建这样的配置对象,但现在我们可能需要一组自定义数据库表来存储它们,API 方法来访问和修改,以及 UI 表单来与它们交互。
以下是本项目 Murano 需要管理的两个基本身份
- 云凭证
- 云凭证是访问用户云帐户所需的凭证
- 通常,云凭证由以下字段组成
- 用户 (User)
- 密钥:对于某些云(如 Azure),密钥不是字符串,而是 PEM 文件
- 云端点
- 云管理平台的 IP 地址。
- 特定于每个云的环境变量
- 数据中心(GCE、vCenter)
- 项目(GCE)
- 通常,云凭证由以下字段组成
等等..
因此,需要设计云凭证对象,以便支持不同的密钥类型和其他需要包含的属性。
- 访问启动的虚拟机的凭证。
- 这需要支持 SSH 作为传输机制,将执行计划传递给 Murano Agent 或
使用 SSH 作为传输机制执行计划,类似于 Ansible 的方法,一种基于代理的执行计划实现方法。
实施细节和深入细节将在单独的规范中捕获。此外,该规范还将捕获如何将其与其它 openstack 项目(如 Barbican 和 Keystone)集成。
依赖注入机制
MuranoPL 需要有一种机制来选择低级云资源的最佳接口实现,具体取决于操作员想要在哪个云上部署给定的环境(一组应用程序)。如果没有这种机制,云管理员或用户很难定义云无关的包。
例如,应用程序只需要指定它需要任何“Instance”接口的实现,但如果云操作员希望将应用程序部署到 AWS,那么依赖注入机制需要找到可以适用于 AWS 的特定 Instance 实现。这对于其它低级资源(如网络、安全组、存储卷)也是如此。
此外,为了表达类能力(例如,它可以在哪个云平台上使用),MuranoPL 中需要存在额外的元数据。这需要设计和开发。总而言之,策略系统可以分为以下几个部分
- 需要开发依赖注入机制,以便 Murano 自动注入任何请求接口的最佳实现和策略规则。
- 改进 MuranoPL,以便可以在类(方法、属性)上放置额外的元数据,以表达它们的能力。该机制可以用于表达其它有用的元数据,如 UI 提示、属性组、ACL 提示等,因此需要足够的可扩展性。
Murano 多云的初始版本将支持一个简单的策略,该策略允许用户随时在他们选择的云上部署应用程序/环境。此版本的未来版本将针对更复杂的策略,例如云爆发、云平衡和云迁移,让用户能够充分实现他们的云策略。
Openstack Dashboard 增强
为了使此版本成为一个最小可行版本,而无需依赖于用户门户策略,需要对 Openstack Murano Dashboard 进行以下最少的增强
- 配置云属性的面板,例如
- 云凭证
- 实例凭证
- 增强功能,提供选择配置环境的云的功能。
- 设计需要考虑到未来版本中需要提供的功能,例如云爆发、云平衡和迁移,以及高可用性场景(主/辅助云概念)。
- 增强功能以选择网络(VPC、分布式端口组)等。
- 增强功能以选择安全端口组。
- 增强功能以选择各种云特定的风味
- vCenter 没有风味的概念,需要提供一种输入 CPU 数量和 RAM 数量的方式。
这些是为 Openstack Murano Dashboard 进行的增强,以使此版本成为一个最小可行版本,直到与用户云门户集成的策略确定为止。关于此方面的更多详细信息将在单独的规范中捕获。
替代方案
备选方案 1
- 扩展 heat 以支持原生多云实例和其他对象
- 在 heat 模板中定义新的资源
- 扩展 nova 以支持原生实例扩展
- 需要从整体上查看网络
- Horizon 扩展以支持多云
文档
Blueprints
- Murano 中的多云支持
- 主要负责人:Satish Grandhi
- 向 Murano 内核库类添加多云能力
- 主要负责人:Nagraj Shenoy
- 多云功能 Murano Amazon EC2 Python 绑定
- 主要负责人: Ruchika Luthra
- 多云支持的 Murano - 身份管理
- 主要负责人: Govardhan Sakanna
规范
- 多云支持的 Murano Amazon EC2 Python 绑定规范
- 主要负责人: Ruchika Luthra
- 向 Murano 内核库类添加多云能力
- 主要负责人:Nagraj Shenoy
- 多云支持的 Murano - 身份管理
- 主要负责人: Govardhan Sakanna
测试用例
本节提供有关 Murano 扩展的多云支持测试用例的大致指南。
系统级测试用例
系统级测试用例 1
用户能够部署一个由多层应用程序组成的云环境,跨多个 Openstack 安装
- 基于 Linux 的应用程序
- 基于 Windows 的应用程序
系统级测试用例 2
用户能够从 Openstack 云部署一个由多层应用程序组成的云环境到 AWS
- 基于 Linux 的应用程序
- 基于 Windows 的应用程序
系统级测试用例 3
用户能够部署一个由多层应用程序组成的云环境到另一个 Openstack 云
- 基于 Linux 的应用程序
- 基于 Windows 的应用程序
系统级测试用例 4
用户能够部署一个由多层应用程序组成的云环境到基于 VMware 的云 (vSphere vCenter)
- 基于 Linux 的应用程序
- 基于 Windows 的应用程序
系统级测试用例 5
用户能够部署一个由多个应用程序组成的云环境,每个应用程序都选择在自己的云上
- 基于 Linux 的应用程序
- 基于 Windows 的应用程序
系统级测试用例 6
用户能够部署一个由多层应用程序组成的云环境到两个云上,以实现高可用性 (给定应用程序的主/备云概念)
功能测试用例
功能测试用例 1
目标功能区域 云身份管理
描述
- 用户登录 Murano 工作区并点击“管理”->“云凭据”
- 用户应该能够创建、读取、更新和删除云凭据。
- 用户应该能够在将凭据创建到 Murano 数据库之前验证云凭据。
- 验证凭据以加密形式存储在数据库中。
- 凭据按 OpenStack 项目限定
- 如果凭据被现有应用程序部署使用,则不允许更新和删除。
功能测试用例 2
目标功能区域 安全组管理
描述 开发人员可以通过应用程序能够创建、读取、更新和删除云安全组,即以云无关方式建模的安全组
功能测试用例 3
目标功能区域 环境管理
描述
- 用户登录 Murano 工作区并点击“应用程序目录”->“环境”
- 用户在 Openstack 云上创建一个新环境。
- 用户会看到与 Openstack 关联的一组应用程序显示出来以供选择。
- 用户应该能够输入所需的信息,例如 flavor、glance 镜像名称、keypair、ssh 用户名/密码。
注意:在多云的情况下,我们需要单独建模云实例,这将保持与不同云中实例的松散耦合。
功能测试用例 4
目标功能区域 环境管理
描述
- 用户登录 Murano 工作区并点击“应用程序目录”->“环境”
- 用户在 EC2 云上创建一个新环境。
- 用户会看到与 EC2 关联的一组应用程序显示出来以供选择。
- 用户应该能够输入所需的信息,例如 flavor、ami 名称、安全组、keypair、ssh 用户名/密码。
- 用户现在安排部署环境。
功能测试用例 5
目标功能区域 环境管理
描述
- 用户登录 Murano 工作区并点击“应用程序目录”->“环境”
- 用户创建一个新环境,选择 EC2 和 Openstack 云。
- 用户会看到与两个云都关联的相关应用程序。
- 用户输入所需的信息,例如 flavor、镜像名称、安全组、keypair、ssh 用户名/密码。
- 用户现在安排部署环境。

