Blog

Read about the newest updates in the community.

Release-1.14.0 Highlights: What's New in CAPM3, IPAM and BMO

By Moshiur Rahman

The Metal3 community has published new releases across three core projects: Cluster API Provider Metal3 (CAPM3) v1.14.0, Bare Metal Operator (BMO) v0.14.0, and IP Address Manager (IPAM) v1.14.0.

This post highlights the key changes in each release, with a focus on major breaking changes and user-facing improvements. It is intended as a concise summary rather than a full changelog.

Full release notes are available here:

Full release notes remain the source of truth for the complete list of fixes, dependency updates, and maintenance changes.

CAPM3 v1.14.0 Highlights

CAPM3 Breaking Changes

  • Deprecate Metal3DataTemplate spec.clusterName (#3520) — A Metal3DataTemplate is no longer tied to a single cluster, so the clusterName field is now optional and unused by the controllers. Setting it produces an admission warning, and the template is no longer garbage-collected with the cluster. To keep it moving during clusterctl move, the template now carries the clusterctl.cluster.x-k8s.io/move label. Drop the field from your manifests:

    apiVersion: infrastructure.cluster.x-k8s.io/v1beta2
    kind: Metal3DataTemplate
    metadata:
      name: nodepool-1
    spec:
      # clusterName: my-cluster   # deprecated: remove this line
      metaData:
        ipAddressesFromIPPool:
          - key: provisioningIP
            name: provisioning-pool
    
  • Add blockmove annotations to allow M3M owner references to be removed from BMH (#3459) — CAPM3 no longer sets a Metal3Machine owner reference on the BareMetalHost; the ConsumerRef is used instead. To keep clusterctl move safe while a host is being claimed, CAPM3 now sets the clusterctl.cluster.x-k8s.io/block-move annotation on the BMH until its pause and status annotations are applied, then removes it. Note that this annotation blocks the entire move operation while present on any object, so a BMH stuck in this state can stall the whole move.

    metadata:
      annotations:
        # set automatically by CAPM3, removed once the BMH is paused
        clusterctl.cluster.x-k8s.io/block-move: ""
    
  • Remove all code related to the legacy form of ProviderID (#3373) — Only the current ProviderID format (metal3://<namespace>/<bmh-name>/<m3m-name>) is supported. Clusters that still carry nodes with the old metal3://<bmh-uid> style provider IDs must be reconciled onto the new format before upgrading.

CAPM3 New Features

  • Fetch DNS servers from IPPool for the CAPI IPAddressClaim path (#3534) — A CAPI IPAddress does not carry DNS information, so when allocating through the Cluster API IPAddressClaim flow, CAPM3 now reads DNS servers directly from the referenced Metal3 IPPool. It resolves the allocated address to the matching pool entry and uses that entry’s per-subnet dnsServers, falling back to the pool-level dnsServers when there is no override:

    apiVersion: ipam.metal3.io/v1alpha1
    kind: IPPool
    metadata:
      name: provisioning-pool
    spec:
      dnsServers: ["8.8.8.8"]        # used as fallback
      pools:
        - subnet: "192.168.1.0/24"
          dnsServers: ["9.9.9.9"]    # used for addresses in this subnet
    

BMO v0.14.0 Highlights

BMO Breaking Changes

  • Deprecate the BMH Taints field (#3465) — The spec.taints field on BareMetalHost is now deprecated because it was never actually implemented. Apply node taints through your Cluster API machine templates instead.

    apiVersion: metal3.io/v1alpha1
    kind: BareMetalHost
    metadata:
      name: node-0
    spec:
      # taints: # deprecated
      #   - key: dedicated
      #     effect: NoSchedule
      online: true
    
  • Provisioner: drop the separate TryInit call (#3327) — Removes the standalone TryInit call from the provisioner initialization flow, simplifying how the Ironic provisioner is brought up. This is an internal refactor with no user-facing configuration change.

BMO New Features

  • Add fast Redfish-based inspection mode (#3482) — Introduces a faster hardware inspection mode using Redfish.
  • Add provisioning retry limit to prevent infinite loops (#3468) — A host that repeatedly fails to provision the same image no longer retries forever. A new --max-provisioning-retries flag (default 5, 0 disables the limit) caps consecutive failures, tracked in a new status.provisioningFailCount. The counter resets on success or when the image spec (URL, checksum, format) changes:

    # disable the limit (previous behavior of unlimited retries)
    baremetal-operator --max-provisioning-retries=0
    
  • Add webhooks to validate URLs (#3333) — New admission webhooks validate URLs before they are accepted.
  • Implementation of the HostClaim controller (#3406) — Adds a controller for the new HostClaim resource.
  • Add BMH and HNA types and cross-resource validation (#3338) — Introduces new types and validation across related resources.
  • Add TLS curve preferences support (#3423) — Allows configuring preferred TLS curves.
  • Implement structured logging pattern from CAPM3 (#2943) — Adopts the structured logging approach already used in CAPM3.
  • Cache Ironic client and its status across reconciliations (#3343) — Reuses the Ironic client and status to reduce overhead between reconciles.
  • Migrate to a go-plugin system for provisioners (#3166) — Provisioners are now loaded through a go-plugin based system.
  • Reduce and simplify requeue delays in the Ironic provisioner (#3302) — Streamlines requeue timing for faster provisioning progress.
  • Add BareMetalSwitch CRD and controller for switch config generation (#3046) — Introduces a new CRD and controller to generate switch configuration.
  • Allow exiting the externally provisioned state (#3181) — Hosts can now leave the externally provisioned state.
  • Validation webhook for HostClaims (#3196) — Adds a validating webhook for HostClaim resources.

IPAM v1.14.0 Highlights

IPAM New Features

  • Add random IP allocation strategy to IPPool (#1359) — IPPool now supports a spec.allocationStrategy field. The default, sequential, allocates the first available address; the new random strategy picks a random free address within a pool. The strategy is immutable after creation, and random requires bounded pools (start/end or subnet) so the pool size can be computed:

    apiVersion: ipam.metal3.io/v1alpha1
    kind: IPPool
    metadata:
      name: provisioning-pool
    spec:
      allocationStrategy: random     # "sequential" (default) or "random"
      pools:
        - start: "192.168.0.10"
          end: "192.168.0.100"
    

Notes

As always, review the full release notes linked above before upgrading, and pay particular attention to the breaking changes in CAPM3 and BMO. If you run into issues or have questions, reach out on the Metal3 community channels.

Thanks to all our contributors who made these releases possible!