Skip to main content

Migrate ARM servers to x86 in your cluster

This guide explains how to replace ARM-based (CAX) nodes in your cluster with x86 nodes.

Step 1: Add x86 worker machine deployments and scale down ARM ones#

Do not change the class of an existing machine deployment in-place. Instead, add a new machine deployment with the workeramd64hcloud class and set the replicas of the ARM machine deployment to 0.

workerMachineTypeHcloud can be set at the cluster level under spec.topology.variables as well as inside a machine deployment's variables.overrides. Check both and update them wherever a CAX type appears:

Under spec.topology.variables:

cluster.yamlyaml
		 
...
variables:
  - name: workerMachineTypeHcloud
    value: cax31
    value: cpx42
	

In the machine deployments — scale down the ARM deployment, add a new x86 one:

cluster.yamlyaml
		 
...
workers:
  machineDeployments:
    - class: workerarm64hcloud
      name: md-0
      replicas: 3
      replicas: 0
      failureDomain: nbg1
      variables:
        overrides:
          - name: workerMachineTypeHcloud
            value: cax31
    - class: workeramd64hcloud
      name: md-0-x86
      replicas: 3
      failureDomain: nbg1
      variables:
        overrides:
          - name: workerMachineTypeHcloud
            value: cpx42
	

Wait for the new x86 nodes to become ready and for the ARM nodes to be fully removed before continuing.

Step 2: Remove the ARM machine deployment#

Once the ARM machine deployment has no nodes remaining, remove it from your Cluster resource:

cluster.yamlyaml
		 
...
workers:
  machineDeployments:
    - class: workerarm64hcloud
      name: md-0
      replicas: 0
      failureDomain: nbg1
      variables:
        overrides:
          - name: workerMachineTypeHcloud
            value: cax31
    - class: workeramd64hcloud
      name: md-0-x86
      replicas: 3
      failureDomain: nbg1
      variables:
        overrides:
          - name: workerMachineTypeHcloud
            value: cpx42
	

Step 3: Update control plane nodes (if applicable)#

If your control plane runs on ARM servers, your cluster variables will include controlPlaneMachineArchHcloud: arm64 and a CAX server type for controlPlaneMachineTypeHcloud.

Note

If you do not have controlPlaneMachineArchHcloud in your cluster variables, your control plane is already using x86 and no changes are needed here.

Warning

Do not change the number of control plane replicas while any control plane nodes are running on ARM. Our recommendation is to not touch replicas at all until the migration is complete.

Check your current control plane count#

Before making any changes, verify that the number of control plane nodes currently running matches the number defined in your Cluster resource.

In your workload cluster, count the ready control plane nodes:

		$ kubectl get nodes -l node-role.kubernetes.io/control-plane
NAME                           STATUS   ROLES           AGE   VERSION
mycluster-xb2gr-abc12          Ready    control-plane   2d    v1.33.1
mycluster-xb2gr-def34          Ready    control-plane   2d    v1.33.1
mycluster-xb2gr-ghi56          Ready    control-plane   2d    v1.33.1
	

In the management cluster, check the defined replica count:

		$ kubectl get cluster <name> -o jsonpath='{.spec.topology.controlPlane.replicas}'
3
	

If the counts match, you can proceed with the change below.

If the counts do not match, it means some ARM control plane nodes were already removed by the health check and could not be replaced due to unavailable ARM servers. Please contact support and still proceed with the change as switching to x86 will allow the missing nodes to be provisioned.

Apply the change#

Change the architecture to amd64 and the server type to an x86 type. Do not change replicas.

These variables can be set in two locations in your Cluster resource. Check both and update them wherever they appear:

Under spec.topology.variables:

cluster.yamlyaml
		 
...
variables:
  - name: controlPlaneMachineArchHcloud
    value: arm64
    value: amd64
  - name: controlPlaneMachineTypeHcloud
    value: cax31
    value: cpx42
	

Under spec.topology.controlPlane.variables.overrides:

cluster.yamlyaml
		 
...
controlPlane:
  variables:
    overrides:
      - name: controlPlaneMachineArchHcloud
        value: arm64
        value: amd64
      - name: controlPlaneMachineTypeHcloud
        value: cax31
        value: cpx42
	

Verifying the migration#

After applying all changes, verify that no CAX server types remain by checking the spec.type field of the HCloudMachine objects:

		$ kubectl get hcloudmachines -o custom-columns='NAME:.metadata.name,TYPE:.spec.type'
NAME                           TYPE
mycluster-xb2gr-rcnbs          cpx42
mycluster-md-0-x86-abc12       cpx42
	

Once no CAX server types appear in the output, the migration is complete and you can proceed with your cluster update.