Skip to content

Upgrading from v0.7 to v0.8 ​

v0.8.0 moves day-2 operations (BMC user management, BIOS/BMC settings, firmware updates, maintenance workflows) out of the metal-operator. They are now expected to be handled by external tooling; one potential implementor is the metal-maintenance-operator. To that end, all resources that were deprecated in v0.7 are removed:

  • BMCUser
  • ServerMaintenance (including Server.spec.serverMaintenanceRef and the Maintenance server state)
  • BIOSSettingsSet, BIOSSettings (including Server.spec.biosSettingsRef)
  • BIOSVersionSet, BIOSVersion
  • BMCSettingsSet, BMCSettings (including BMC.spec.bmcSettingsRef)
  • BMCVersionSet, BMCVersion

It also removes the deprecated Server.spec.power field. Power is controlled via ServerClaim requests and out-of-band operations such as park/unpark, and tracked in the server status.

Additionally, ServerClaim scheduling was extracted into a dedicated scheduler controller. The scheduler runs inside the same manager binary, so no extra component needs to be deployed.

1. Move day-2 operations out of the metal-operator ​

If you still use any of the removed resources, migrate them to external day-2 tooling before upgrading, so BMC user, BIOS/BMC settings and firmware management continue without a gap. One potential implementor of these tasks is the metal-maintenance-operator: install it and create the equivalent resources there first. There is no replacement inside the metal-operator.

If you used ServerMaintenance for out-of-band operations, use the parked state instead. It powers the server off and makes the reconcilers stand down:

bash
kubectl annotate server <server-name> metal.ironcore.dev/operation=park
# when done:
kubectl annotate server <server-name> metal.ironcore.dev/operation=unpark

2. Delete the removed resources while v0.7 is still running ​

Let in-flight BIOS/BMC upgrades and settings updates finish first, then delete all custom resources of the removed kinds:

bash
kubectl delete bmcusers.metal.ironcore.dev --all
kubectl delete servermaintenances.metal.ironcore.dev --all -A
kubectl delete biossettingssets.metal.ironcore.dev --all
kubectl delete biossettings.metal.ironcore.dev --all
kubectl delete biosversionsets.metal.ironcore.dev --all
kubectl delete biosversions.metal.ironcore.dev --all
kubectl delete bmcsettingssets.metal.ironcore.dev --all
kubectl delete bmcsettings.metal.ironcore.dev --all
kubectl delete bmcversionsets.metal.ironcore.dev --all
kubectl delete bmcversions.metal.ironcore.dev --all

Wait until all instances are gone. Owned children (e.g. BIOSSettings created by a BIOSSettingsSet) are garbage-collected automatically. If those children are still needed, recreate them standalone before deleting the sets.

Verify that no server reports the Maintenance state anymore:

bash
kubectl get servers.metal.ironcore.dev \
  -o jsonpath='{range .items[?(@.status.state=="Maintenance")]}{.metadata.name}{"\n"}{end}'

3. Clean up your manifests ​

Remove all manifests of the removed kinds from your GitOps/IaC repositories, and drop these fields from the remaining resources:

  • spec.power and spec.biosSettingsRef from Server
  • spec.bmcSettingsRef from BMC

Stored values of these fields on existing objects are pruned automatically on the next write.

4. Upgrade the operator ​

Upgrade using your usual installation method:

  • Kustomize: kubectl apply -k https://github.com/ironcore-dev/metal-operator/config/default?ref=v0.8.0
  • Helm: helm upgrade with the v0.8.0 chart (see the Helm installation guide)

5. Remove leftover CRDs ​

With kubectl apply installs (and Helm installs using the default crd.keep: true), the removed CRDs are not deleted automatically. Verify and delete them:

bash
kubectl delete crd bmcusers.metal.ironcore.dev
kubectl delete crd servermaintenances.metal.ironcore.dev
kubectl delete crd biossettingssets.metal.ironcore.dev
kubectl delete crd biossettings.metal.ironcore.dev
kubectl delete crd biosversionsets.metal.ironcore.dev
kubectl delete crd biosversions.metal.ironcore.dev
kubectl delete crd bmcsettingssets.metal.ironcore.dev
kubectl delete crd bmcsettings.metal.ironcore.dev
kubectl delete crd bmcversionsets.metal.ironcore.dev
kubectl delete crd bmcversions.metal.ironcore.dev

Helm installs only prune the CRDs on upgrade when crd.keep: false. With crd.keep: true (the chart default), the CRDs carry helm.sh/resource-policy: keep and must be deleted manually as shown above.

If a CRD hangs in Terminating due to leftover resources with finalizers, clear them:

bash
kubectl patch <resource> <name> --type=merge -p '{"metadata":{"finalizers":null}}'

Only strip finalizers once the resource's in-flight work has finished or been safely aborted on the BMC. Removing them mid-update skips the operator's cleanup and can leave the physical server stuck halfway through a firmware flash or settings change.

The removed validating webhook entries (e.g. vbiosversion-v1alpha1.kb.io) in the shared webhook configuration are replaced on apply; no manual step is needed.

EU and German government funding logos

Funded by the European Union – NextGenerationEU.

The views and opinions expressed are solely those of the author(s) and do not necessarily reflect the views of the European Union or the European Commission. Neither the European Union nor the European Commission can be held responsible for them.