虚拟裸机集群管理器¶
测试 Ironic 一直具有挑战性。裸机计算资源昂贵且不灵活。解决此问题的典型方案是使用虚拟机 (VM) 模拟裸机计算资源,从而提高测试基础设施的利用率,并使用通用测试基础设施测试各种场景。DevStack 和 Bifrost 中都提供支持创建虚拟裸机环境的功能。这些功能被用于 OpenStack CI。本规范涵盖了用于管理虚拟裸机集群的新工具的创建。
问题描述¶
随着 Ironic 和裸机云用例的日益普及,确保提供用于执行代表性测试的工具变得必要。DevStack 插件和 Bifrost playbook 有所帮助,但并不适用于所有环境,因为它们会引入额外的依赖项,并且与这些环境的具体细节紧密相关。
特别是,利用 Ironic 的 OpenStack 部署工具(例如 Kayobe、Kolla Ansible 和 TripleO)将受益于一个共享工具,用于管理虚拟裸机测试环境的配置。
希望新工具具有可扩展性,并在未来支持更复杂的配置——例如,网络配置。基于 shell 脚本的工具(例如 DevStack 插件)本质上存在变得单一化的风险,因为添加了新功能。重要的是,新工具能够在不牺牲其易用性或简化配置的维护的情况下支持更复杂的用例。
用户故事¶
作为 OpenStack 开发人员,我希望能够轻松地按需创建通用的、一体化的虚拟裸机集群,以便将其用作开发环境。
作为 OpenStack 开发人员,我希望能够在完成虚拟集群后将其拆除,以便将我的系统恢复到干净状态。
作为 Ironic 开发人员,我希望能够根据特定 VM 和虚拟网络的规范创建虚拟裸机集群,以便模拟给定的系统架构以进行我的开发。
作为 Ironic 开发人员,我希望能够重新配置我的虚拟集群,以便测试不同裸机架构中的更改。
作为 CI 工具链的维护者,我希望有一个事实上的虚拟集群管理工具用于 CI 作业,这样我就不必使用定制的/不可扩展的实用程序。
作为 Ironic 开发人员,我希望 CI 作业使用我用来设置我的开发环境的相同工具来设置作业环境,以便我可以在自己的机器上轻松重现 CI 作业的结果。
作为系统部署人员,我希望能够本地/虚拟地执行裸机规模测试,以便在部署到实际系统之前诊断扩展问题。
提议的变更¶
我们建议添加一个用于管理虚拟裸机集群的新工具,名为 *Tenks*。Tenks 的范围包括
创建和删除代表裸机节点的 VM
编排用于模拟基板管理控制器 (BMC) 的工具,例如 虚拟 BMC 和 sushy-tools。
创建和删除代表裸机网络的虚拟网络
Tenks 最初将针对典型的 Libvirt/QEMU/KVM 环境,但以典型的 OpenStack 方式编写,以便将来可以添加对其他虚拟化提供程序的支持。
注意:Libvirt 提供了一个 极其广泛的 API 用于配置 VM 属性。Tenks 的目标不是暴露其中除了最小公共子集之外的任何内容。这提供了更易于与多个虚拟化提供程序交叉兼容的优势,并且与每个虚拟化提供程序的耦合度较低。Tenks 旨在用于开发和测试目的,而不是用于微调虚拟集群配置。
构建完成后,我们建议将 Ironic DevStack 插件和/或 Bifrost 测试 playbook 迁移到使用 Tenks。
Tenks 的源代码在 GitHub 上可用。有关 Tenks 初始开发的博客文章可以在 StackHPC 网站上找到。文档可以在 Read the Docs 上找到。
词源学侧记¶
Tenks
ten-k-s
10-thousand-spoons
Alanis Morissette - Ironic: 歌词 L27
名称想法由 mgoddard 提供。
建议的实现¶
建议使用 Ansible 实现 Tenks。Ansible 非常适合此类工具,因为
它提供了一个良好的平台来编写幂等应用程序。由于 Tenks 将以声明方式配置,因此幂等性很重要,因为它允许将系统带到声明的状态,无论其初始状态如何(例如,如果某些声明的 VM 已经存在)。
它允许轻松引用现有的 Ansible 角色来帮助进行配置。
它鼓励开发一个有观点的工具,该工具可以根据需要轻松配置。这意味着 Tenks 的默认 Ansible 配置能够创建具有最少设置要求的基本虚拟裸机集群(由于 Ansible 角色默认值),但可以覆盖任何选项以自定义配置,从而利用 Ansible 的变量优先级和作用域逻辑。
根据 Tenks 的增长大小,可能需要编写一个类似于 OpenStack 的 CLI 来包装 Ansible playbook。
多阶段流程¶
主机设置
在每个主机上安装和配置相关软件
Open vSwitch(容器化?)
虚拟化工具包(例如 Libvirt/QEMU/KVM)
虚拟平台管理工具包:目前为 Virtual BMC 用于 IPMI。未来可以扩展到包含其他工具(例如 VirtualPDU 用于 SNMP,sushy-tools 用于 Redfish)。
LVM - 设置用于 VM 卷的存储池
网络设置
为每个物理网络创建桥接,并连接到物理接口。
VM 配置
将不同 VM 规范的请求调度到最合适的 BM 超visor。调度算法最初可以是简单的(甚至随机的),并且可以迭代改进。Tenks 甚至可以配置为优先考虑某些调度启发式方法或降低其优先级。
通过虚拟化提供程序创建指定的 VM。
根据它们配置为连接到的物理网络,将 VM 的 NIC 附加到相关的桥接。
使用适合其驱动程序的平台管理工具(例如 Virtual BMC 用于 IPMI)注册每个 VM。
VM 注册(如果使用内省,则这些步骤是可选的)
使用指定的部署 ramdisk 和内核将每个 VM 注册到 Ironic。
设置节点上的任何其他属性。这可以包括从卷启动的详细信息、功能和启动模式(对于 Tenks 支持的启动模式)。
设置节点上的任何特性。
为 VM 的每个 NIC 在 Ironic 中创建一个端口。
使 Ironic 节点可用于部署。
部署后
根据需要创建 Nova flavor。这些可以指定所需的或禁止的节点特性。
Tenks 还应支持“拆除”模式,该模式将清理所有创建的资源并将系统(或多或少)恢复到其初始状态。
配置¶
描述 Tenks 提供的虚拟基础设施的声明式配置风格会很合适。这可以包括
主机清单。Tenks 需要一个裸机超visor 的列表,即模拟裸机节点的虚拟机的宿主机。可以使用 Ansible 清单来实现此目的。
物理网络。Tenks 将配置为包含所有主机在清单中共享的物理网络列表。需要物理网络到源接口/桥接的每主机映射。Tenks 将在每个主机上为每个物理网络创建一个桥接。
所需的虚拟裸机 VM 配置。Tenks 将配置为具有 VM 的“flavor”,以及要创建的每种 flavor 的 VM 数量。Flavor 理想情况下应该与虚拟化提供程序无关,但应具有以下属性
物理网络。将为每个物理网络向 VM 添加一个虚拟 NIC,并且 NIC 将插入超visor 上的相应桥接。
通用 VM 属性。这些将包括 CPU 数量和 RAM 容量。
要附加到 VM 的卷。应支持创建空白卷和从现有镜像创建卷,以及使用现有卷。
这些属性可用于影响 VM 放置过程中的调度。Libvirt 提供程序的初始 flavor 映射可以使用 StackHPC libvirt-vm Ansible 角色 作为接口来促进。
备选方案¶
继续在每个环境中使用特定工具
数据模型影响¶
无
状态机影响¶
无
REST API 影响¶
无
客户端 (CLI) 影响¶
无
RPC API 影响¶
无
驱动程序 API 影响¶
无
Nova 驱动程序影响¶
无
Ramdisk 影响¶
无
安全影响¶
无
其他最终用户影响¶
无
可扩展性影响¶
无
性能影响¶
无
其他部署者影响¶
无
开发人员影响¶
无
实现¶
负责人¶
- 主要负责人
Will Miller: willm@stackhpc.com
其他贡献者
工作项¶
开发概念验证 Ansible playbook
完善 Tenks,包括更多高级功能,例如
集群拆除
改进的调度启发式方法
无需拆除即可重新配置集群
其他提供程序,而非 Libvirt
命令行界面
必要的单元、功能和集成测试
使用各种环境/配置手动测试 Tenks
将 Tenks 提交到 PyPI(如果 Python 代码的范围需要这样做)
调整 CI 管道以使用 Tenks 进行临时集群管理
依赖项¶
无
测试¶
TODO
升级和向后兼容性¶
无
文档影响¶
TODO