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:
BMCUserServerMaintenance(includingServer.spec.serverMaintenanceRefand theMaintenanceserver state)BIOSSettingsSet,BIOSSettings(includingServer.spec.biosSettingsRef)BIOSVersionSet,BIOSVersionBMCSettingsSet,BMCSettings(includingBMC.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:
kubectl annotate server <server-name> metal.ironcore.dev/operation=park
# when done:
kubectl annotate server <server-name> metal.ironcore.dev/operation=unpark2. 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:
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 --allWait 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:
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.powerandspec.biosSettingsReffromServerspec.bmcSettingsReffromBMC
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 upgradewith 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:
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.devHelm 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:
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.