iLO Virtual Media iSCSI Deploy Driver

https://blueprints.launchpad.net/ironic/+spec/ironic-ilo-virtualmedia-driver

添加支持通过启动虚拟介质和使用conductor节点上的iscsi来部署具有iLO4及更高版本的proliant裸机节点,从而重用现有的部署机制。

问题描述

  • 目前Ironic的PXE参考驱动程序使用pxe协议启动机器。由于其不可靠性和安全问题,一些客户不喜欢在他们的环境中采用PXE协议。

  • 目前Ironic的PXE参考驱动程序通过tftp在数据网络上以明文形式传递keystone认证token到裸机节点。

提议的变更

Ironic部署的提议更改将分两个阶段进行

  • 将当前pxe部署驱动程序中的iscsi部署代码重构到一个新的模块 ironic/drivers/modules/iscsi_deploy.py 中,以便可以在新的部署驱动程序中重用。

  • 在 ironic/common/images.py 中添加两个新方法 create_vfat_imagecreate_iso_image,分别用于创建vfat镜像和iso镜像。vfat镜像将用于在通过虚拟介质启动时将token和参数传递给ramdisk。ISO镜像将用于在裸机上启动内核/ramdisk。

  • 添加一个新的模块 ironic/common/swift.py 来管理swift中的对象。

  • 添加两个通用方法 setup_virtual_media_bootcleanup_virtual_media__boot,它们有助于分别设置和清理用于启动的虚拟介质。

  • 在 ironic/drivers/modules/ilo/deploy.py 中创建一个名为 IloVirtualMediaIscsiDeploy 的新部署模块,该模块遵循 base.DeployInterface

  • 在 ironic/drivers/modules/ilo/deploy.py 中创建一个新的类 VendorPassthru,该类遵循 base.VendorInterface。在其中实现一个vendor passthru方法 pass_deploy_info

  • IloPower 模块中的 reboot() 方法将被更改。

详细更改

用于启动的虚拟介质

这个类暴露了以下方法

setup_virtual_media_boot()

  • 使用proliantutils模块验证节点的iLO是否启用了虚拟介质功能。如果节点没有虚拟介质功能,则报错退出。

  • 如果 boot_parameters 不为空

    • 创建一个包含用户token和配置文件的虚拟软盘镜像,其中包含 boot_parameters

    • 将虚拟软盘镜像上传到swift。设置 X-Delete-After,以便在 deploy_helper_images_ttl 分钟后删除镜像。默认值为10分钟。上传到容器 swift_ilo_container,其默认值为“ironic_ilo_container”。

    • 生成虚拟软盘镜像的swift临时url。将其命名为 floppy_image_temp_url。tmpurl的超时时间为 deploy_helper_images_ttl 分钟。

    • 将 floppy_image_temp_url 作为虚拟软盘介质附加到iLO。将超时时间设置为 deploy_helper_images_ttl

  • 生成 boot_iso 的tmpurl,并将其作为虚拟光盘介质附加。tmpurl的超时时间为 deploy_helper_images_ttl 分钟。

  • 使用proliantutils模块和BOOT_ONCE选项,将裸机节点设置为下次启动时从虚拟光盘介质启动。

cleanup_virtual_media_boot()

  • 删除上传到swift的节点的虚拟软盘镜像。swift中的对象名称将为“image-<node uuid>”

ironic/common/swift.py

这个模块将提供一个类 SwiftAPI,它将处理swift对象的创建和管理。默认情况下,此SwiftAPI模块将使用admin凭据与swift通信。该模块的用户也可以选择传递 usertenant_namekeyauthurl 来创建swiftAPI对象。

  • upload_object - 如果需要,创建容器,然后使用swiftclient在swift中创建新对象。返回swift对象id。

  • delete_object - 从指定的swift容器中删除对象。

  • get_tmp_url - 这将调用python-swiftclient中可用的 swift_utils.generate_temp_url()

ironic/common/images.py

添加一个新的方法 create_vfat_image,它有助于创建虚拟软盘镜像。此方法将要包含在软盘镜像中的文件和参数作为输入,然后创建一个vfat软盘镜像。

添加一个新的方法 create_iso_image,它有助于创建ISO镜像。此方法将要包含在ISO中的文件和参数作为输入,然后创建ISO镜像。

上述两种方法之间的公共组件将被重用。

ironic/drivers/modules/iscsi_deploy.py

这个模块将重构来自pxe驱动程序的iscsi部署机制中的所有方法。以下方法将被移动到新模块

  • parse_instance_info()

  • _cache_instance_image

  • InstanceImageCache

  • _check_image_size

  • _destroy_images()

  • _get_deploy_info

  • _continue_deploy()

重构需要进行一些小的更改,以删除上述方法中的“pxe”部分。

IloVirtualMediaIscsiDeploy

这个类将实现以下内容

  • validate() - 验证节点是否添加了端口,解析deploy_info(),检查conductor api url是否可用,并验证驱动程序信息中是否存在 deploy_iso 属性。使用了重构的iscsi_deploy的大部分功能。

  • deploy() - 缓存实例镜像,使用虚拟介质引导助手方法 setup_virtual_media_boot 来设置机器,以便使用driver_info[‘deploy_iso’] 启动。

  • tear_down() - 关闭节点电源。

  • clean_up() - 销毁镜像,调用 cleanup_virtual_media_boot 方法来清理临时软盘镜像。如果 boot_iso 是ironic创建的,则swift中 boot_isousage_count 元属性减少1。

prepare() 和 take_over() 将为空。

VendorPassthru

实现一个新的vendor passthru方法 ‘pass_deploy_info’。此vendor passthru方法将调用iscsi_deploy.py中的continue_deploy()。

在通过iSCSI部署后,它会按照以下顺序检查以获取启动ISO

  • 如果用户在glance镜像中指定了启动ISO,则获取此ISO。

  • 检查是否为镜像在swift的 swift_ilo_container 中已经存在用于所述(镜像、内核、ramdisk)的boot_iso(通过对镜像、内核、ramdisk的UUID进行哈希以获得唯一的名称)。如果boot iso存在,则swift对象的 usage_count 元属性增加1。

  • 如果仍然找不到boot ISO,则创建一个可启动的ISO镜像,将其上传到swift的 swift_ilo_container,并设置 usage_count 为1。

然后,它将关于 boot_iso 的信息记录在节点的 instance_info[boot_iso]

IloPower reboot()

如果节点在其instance_info中具有 boot_iso,则使用 setup_virtual_media_boot 将机器设置为从 boot_iso 启动。

备选方案

proliant裸机机器可以使用提议的iPXE启动,但即使这样也涉及使用PXE启动机器以加载iPXE软件。此外,它也无法解决将token传递到裸机节点中的安全问题。

数据模型影响

新的部署驱动程序将使用两个新参数

  • driver_info[‘deploy_iso’] - 这将用于在部署之前启动节点。

  • instance_info[‘boot_iso’] - 部署驱动程序在裸机节点部署完成后设置此参数。

REST API 影响

将添加一个vendor_passthru方法

pass_deploy_info

  • 描述:使用deploy-ironic element of diskimage-builder构建的部署ramdisk将在节点上调用此方法。它还将传递完成部署所需的连接到裸机节点本地磁盘使用iSCSI的信息。

  • 方法类型:POST

  • 正常响应代码:200

  • 预期错误:400:发送的数据不足/无效或缺少部署数据。

  • URL:/{api_version}/nodes/<node-uuid>/vendor_passthru/pass_deploy_info

  • 参数

    • address - 裸机节点的地址。

    • key - ironic生成的部署密钥。

    • iqn - 裸机节点上目标磁盘的iqn,镜像必须部署到该磁盘。

    • error - 如果遇到错误,则为错误消息。

  • Body JSON schema

    {
     "address": "10.10.1.150"
     "iqn": "iqn-12345678-1234-1234-1234-1234567890abcxyz"
     "key": "1234567890"
     "error": ""
    }
    
  • Response JSON:None

驱动程序 API 影响

无。

Nova 驱动程序影响

nova ironic virt驱动程序不需要进行任何更改。新的iLO驱动程序将继续使用nova ironic virt驱动程序在节点的instance_info中设置的以下5个参数

  • image_source

  • root_gb

  • swap_mb

  • ephemeral_gb

  • ephemeral_format

安全影响

  • PXE驱动程序需要admin token在tftp中可用,而任何部署网络中的人都可以访问该tftp(因为token的文件名是可预测的,即token-<node uuid>)。在虚拟介质引导中,用户token通过OOB通道通过https安全地发送到conductor节点。因此,可以使用此部署方法进行更安全的部署。

  • 虚拟软盘镜像上传到swift容器中,并由swift在超时后自动销毁。建议使用单独的容器来保护软盘镜像。

  • 可以通过swift存储多租户来配置由swift支持的glance,以便只有镜像的所有者和定义的管理员帐户才能访问该镜像。有关更多信息,请参阅[1]中的使用 swift_store_multi_tenant

其他最终用户影响

可扩展性影响

无。

性能影响

无。

其他部署者影响

云操作员应执行以下操作以配置iLO驱动程序

  • 将deploy_iso上传到glance,并在driver_info[‘deploy_iso’]中提及其UUID。

此外,用户/操作员还可以选择指定一个 boot_iso,内核/ramdisk可以从中启动以进行部署镜像。这可以指定为glance元属性 boot_iso,用于要部署的镜像。

diskimage-builder中将提供用于创建部署ISO的实用程序。

此部署方法不需要在conductor节点上运行额外的服务(如pxe驱动程序中的tftp服务)。

开发人员影响

无。

已知限制

  • 如果用户需要重新启动裸机节点,则需要从Ironic(或Nova)触发重新启动。

  • 如果用户需要发出裸机节点内的重新启动(从裸机节点内部重新启动),则裸机节点将无法启动。在这种情况下,用户可以再次从ironic发出重新启动以启动节点。

实现

负责人

主要负责人

rameshg87

工作项

工作将分为以下单独的项目(或补丁)

  1. 重构当前pxe部署驱动程序中的iscsi部署代码。

  2. 实现对ironic/common/images.py模块的更改。

  3. 实现ironic/common/swift.py模块。

  4. 实现虚拟介质引导助手方法,添加新的部署驱动程序和新的vendor passthru模块。

  5. 实现对IloPower中reboot()方法的更改。

依赖项

依赖hpproliant模块

测试

将为所有代码添加单元测试。

部署的Tempest测试将在以后考虑。

文档影响

需要记录配置 ProLiant 裸机节点的流程。 这将在 ironic 源代码树的 doc/ 目录下以 rst 格式记录。 此文件的内容也可以放入 ironic wiki 中。

参考资料

  1. https://docs.openstack.org/admin-guide-cloud/objectstorage_tenant_specific_image_storage.html