This guide provides the information you need to add your baremetal machines to your cluster. If you haven't set up a cluster yet, start with [creating clusters](/docs/hetzner/apalla/getting-started/creating-clusters) first. If you run into issues during this process, refer to [troubleshooting bare metal servers](/docs/hetzner/apalla/troubleshooting/baremetal-servers). {% callout %} Autopilot only manages the installation of necessary software on bare metal machines and the adding/removing of machines from the cluster. Autopilot does **NOT** buy nor sell the servers. {% /callout %} ## Define the HetznerBareMetalHost Create a `baremetalhosts.yaml` file, following the example below: ```yaml /// baremetalhosts.yaml apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 kind: HetznerBareMetalHost metadata: name: baremetal-1 spec: description: My first baremetal machine serverID: 1234567 rootDeviceHints: wwn: eui.726163646f6d2d2d maintenanceMode: false --- apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 kind: HetznerBareMetalHost metadata: name: baremetal-2 spec: description: My second baremetal machine serverID: 7654321 rootDeviceHints: wwn: eui.737472696e677349cd maintenanceMode: false ``` And apply it to your management cluster. {% callout type="warning" %} If the baremetal machines were previously configured to use RAID, you must follow the steps in [Wiping baremetal server disks](/docs/hetzner/apalla/troubleshooting/wiping-baremetal-server-disks) before adding them to your cluster. If you have already added them to your cluster, you will need to remove and reapply the HetznerBareMetalHosts after wiping the disk. By default, newly purchased machines come with RAID enabled. If you are unsure whether you need RAID or not, we recommend that you disable it. {% /callout %} If you don't have the `wwn` of your disk, you can find it by running the following command on the bare metal machine: ```bash lsblk -o name,WWN ``` As an alternative, you can omit the `rootDeviceHints` field from the definition. When you do this, the `HetznerBareMetalHost` resource will show an error, and you can copy the WWN from the `Status -> Hardware Details -> Storage` section shown when running `kubectl describe HetznerBareMetalHost `. Or get it using `yq`: ```bash kubectl get hbmh -o yaml | yq .spec.status.hardwareDetails.storage ``` ## Use your hosts in the cluster Edit your Cluster resource in the management cluster (or cluster.yaml in your GitOps repository), adding the snippet below to `spec.topology.workers.machineDeployments`: ```yaml - class: workeramd64baremetal name: md-1 replicas: 2 ``` Now, your cluster will request two machines from the baremetal class. Since you have exactly two hosts, all of them will be used. If you want to prioritize specific machines for addition, you can use labels and selectors: Add a label to your machine: ```yaml /// baremetalhost.yaml apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 kind: HetznerBareMetalHost metadata: name: baremetal-1 labels: // [!code ++] environment: production // [!code ++] spec: description: My first baremetal machine serverID: 1234567 rootDeviceHints: wwn: eui.726163646f6d2d2d maintenanceMode: false ``` And use `matchLabels` to select it in your Cluster resource, under `spec.topology.workers`: ```yaml - class: workeramd64baremetal name: md-2 replicas: 1 variables: // [!code ++] overrides: // [!code ++] - name: workerHostSelectorBareMetal // [!code ++] value: // [!code ++] matchLabels: // [!code ++] environment: production // [!code ++] ``` It is recommended to always use `matchLabels` in your cluster's machine deployments. If you don't set any `matchLabels`, this means any HetznerBareMetalMachine available can get selected to the cluster, even those which have labels.