iPXE boot

https://blueprints.launchpad.net/ironic/+spec/ipxe-boot

This blueprint presents the work needed to add support for iPXE in Ironic.

Problem description

As the size of our deploy ramdisk would continue to increase (Ironic Python Agent) we need a more reliable way to transfer such data via the network without relying on TFTP. The problem with TFTP is that it’s unreliable and any transmission error will result consequently in boot problems (The first T in TFTP stands for trivial).

Proposed change

By adding support for iPXE we would have the ability to transfer data through HTTP which is a reliable protocol.

  • New config options:
    • ipxe_enabled: Whether iPXE is enabled or not.

    • ipxe_boot_script: The path to the main iPXE script file.

    • http_server: The IP address of the HTTP server.

    • http_root: The HTTP root path.

  • When generating the PXE configuration file the kernel and initrd parameters should contain the HTTP URL for the files and not the TFTP path.

  • All the configuration files, ramdisks and kernels will now be put in the HTTP directory instead of the TFTP directory.

  • The pxe_bootfile_name config option should point to the iPXE image (undionly.kpxe).

  • A configuration template for iPXE.

  • The pxe_config_template config option should point to the iPXE configuration template.

  • An iPXE script file (ipxe_boot_script config option) which is the file fetched by the client after it has loaded the iPXE image, and from there the script will load the MAC-specific iPXE configuration file for that request.

  • When passing the DHCP boot options to Neutron we also have to pass the HTTP link pointing to the iPXE script file.

It’s important to note that Ironic is not responsible for managing the HTTP server, just like the TFTP server, it should be configured and running on the Node that ironic-conductor was deployed.

Another important note is that the iPXE image (undionly.kpxe) used for chainloading is sent to the clients via TFTP, so we still need a TFTP server up and running, this is the only TFTP transaction in the whole process, once the client has loaded iPXE, everything happens over HTTP.

Alternatives

Continue to use the standard PXE and rely on the TFTP protocol to transfer the data.

Data model impact

None

REST API impact

None

Driver API impact

None

Nova driver impact

None

Security impact

While not part of work proposed by this spec, iPXE supports using the HTTPS protocol which allows encrypting all communication with the HTTP server, this patch can be considered a plumbing work for that to be implemented in the future.

Other end user impact

To enable iPXE users would have to set the http_root, http_server and ipxe_enabled configuration options along with the tftp_root and tftp_server options.

Scalability impact

As a future work, we can add support to be able to fetch images and configuration files directly from Glance or Swift since those are already scalable.

Performance Impact

TFTP can be extremely slow, so fetching data over HTTP can improve the speed of transferring the images from the conductor to the Node being booted.

Other deployer impact

New config options:
  • ipxe_enabled: Whether iPXE is enabled or not.

  • ipxe_boot_script: The path to the main iPXE script file.

  • http_server: The IP address of the HTTP server.

  • http_root: The HTTP root path.

By default iPXE will be disabled and so should not change anything on the current flow to deploy/configure Ironic. In the future since we are moving towards having the Ironic Python Agent to be the standard provisioning method, we might want to enable iPXE by default as part of that effort.

Developer impact

None

Implementation

Assignee(s)

Primary assignee:

lucasagomes

Other contributors:

None

Work Items

See the “Proposed change” section.

Dependencies

A HTTP server up and running.

Testing

  • Unit tests.

  • Add support to DevStack to be able to configure Ironic to use iPXE.

Documentation Impact

Documentation should be modified to instruct operators about how to enable and configure Ironic to use iPXE.

References

None