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_image和create_iso_image,分别用于创建vfat镜像和iso镜像。vfat镜像将用于在通过虚拟介质启动时将token和参数传递给ramdisk。ISO镜像将用于在裸机上启动内核/ramdisk。添加一个新的模块 ironic/common/swift.py 来管理swift中的对象。
添加两个通用方法
setup_virtual_media_boot和cleanup_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通信。该模块的用户也可以选择传递 user、tenant_name、key、authurl 来创建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_iso的usage_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_sourceroot_gbswap_mbephemeral_gbephemeral_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
工作项¶
工作将分为以下单独的项目(或补丁)
重构当前pxe部署驱动程序中的iscsi部署代码。
实现对ironic/common/images.py模块的更改。
实现ironic/common/swift.py模块。
实现虚拟介质引导助手方法,添加新的部署驱动程序和新的vendor passthru模块。
实现对IloPower中reboot()方法的更改。
依赖项¶
依赖hpproliant模块
测试¶
将为所有代码添加单元测试。
部署的Tempest测试将在以后考虑。
文档影响¶
需要记录配置 ProLiant 裸机节点的流程。 这将在 ironic 源代码树的 doc/ 目录下以 rst 格式记录。 此文件的内容也可以放入 ironic wiki 中。