Skip to content

[v0.8.0] ProxmoxMachine.status.addresses not populated after v1alpha1→v1alpha2 migration, breaking RKE2 bootstrap (internal-first) #714

@ibra-coul

Description

@ibra-coul

What steps did you take and what happened:
After migrating from infrastructure.cluster.x-k8s.io/v1alpha1 to v1alpha2, existing ProxmoxMachine objects no longer have status.addresses populated. As a result, Machine.status.addresses is also null, causing the RKE2 bootstrap controller to loop indefinitely on:

"No ControlPlane IP Address found for node registration"
This blocks every rolling update step — new VMs are never created in Proxmox because bootstrap data is never generated.

What did you expect to happen:
After migration to v1alpha2, CAPMOX should re-reconcile existing ProxmoxMachine objects and repopulate status.addresses automatically.

Environment:

  • Proxmox version: 9.1.1
  • Cluster-api-provider-proxmox version: v1.12.5
  • Kubernetes version: (use kubectl version): v1.34.4+rke2r1
  • OS (e.g. from /etc/os-release): Ubuntu 24.04.4 LTS
  • CAPMOX version: v0.8.0 (ghcr.io/ionos-cloud/cluster-api-provider-proxmox:v0.8.0)
  • CAPI version: v1beta2
  • Bootstrap provider: RKE2 with registrationMethod: internal-first
  • Trigger: migration of existing cluster from v1alpha1 → v1alpha2

Steps to reproduce

  • Have a running cluster provisioned with CAPMOX v1alpha1
  • Upgrade CAPMOX to v0.8.0 (which adds v1alpha2 support)
  • Update manifests to use infrastructure.cluster.x-k8s.io/v1alpha2
  • Trigger a rolling update (e.g. change a ProxmoxMachineTemplate field)
  • Observe ProxmoxMachine.status.addresses is null on existing machines
kubectl get proxmoxmachine -n <namespace> -o json | \
  jq '.items[] | {name: .metadata.name, addresses: .status.addresses}'
# → all null

Root cause
CAPMOX does not re-reconcile existing ProxmoxMachine objects after the API version migration. The status.addresses field is never populated unless a reconciliation is explicitly triggered

Workaround
Manually annotate each ProxmoxMachine to force reconciliation, then patch Machine.status.addresses:

kubectl annotate proxmoxmachine <name> -n <namespace> \
  reconcile.cluster.x-k8s.io/requestedAt="$(date -u +%Y-%m-%dT%H:%M:%SZ)" --overwrite

kubectl patch machine <name> -n <namespace> \
  --subresource=status --type=merge \
  -p '{"status":{"addresses":[{"address":"<IP>","type":"InternalIP"}]}}'

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions