Troubleshoot an unreachable machine
When a provisioned server fails to join the Kubernetes cluster and becomes completely unreachable over the network, you cannot access it through SSH or kubectl.
In this state, the standard syself-log-collector cannot run. To diagnose the failure on the machine, you must use out-of-band tools: a remote console to observe early-boot issues, and the Hetzner rescue system to mount the disk and extract logs.
Step 1: Pause automation to prevent machine deletion
When a machine fails to register with Kubernetes before its timeout expires, Cluster API and the Hetzner provider controllers mark it as failed and prepare to delete or reprovision it. Reprovisioning wipes the root disk, destroying the diagnostic logs.
Freeze controller actions on the machine object before you begin troubleshooting:
$ kubectl -n <cluster-namespace> annotate machine <machine-name> cluster.x-k8s.io/paused="true"
If troubleshooting a bare-metal server, you can alternatively set spec.maintenanceMode: true on the corresponding HetznerBareMetalHost resource. For more details on pausing automation, see Where to start troubleshooting .
Step 2: Confirm network unreachability
Verify whether the server has completely lost network connectivity or is only rejecting specific services:
- Test basic network reachability with ICMP:
$ ping <server-ip> - Test SSH connectivity on both the Syself default port (
100):$ ssh -v -p 100 -i <path-to-key> root@<server-ip>
If ping fails or SSH connections time out with no response, the machine either crashed during boot or its network interface failed to initialize.
Step 3: Inspect early boot with a remote console
Early boot issues—such as BIOS configuration problems, kernel panics, device-mapper verity (dm-verity) hash mismatches, or missing NIC drivers—occur before systemd starts and are never written to disk logs. A remote console is the only way to observe them.
Hetzner Cloud servers feature a built-in browser VNC console that connects directly to the virtual machine display:
- Open the Hetzner Cloud Console and navigate to your project.
- Select the affected server and click the Console button in the upper right. See Hetzner Cloud Console documentation.
- From the server actions menu, trigger a reboot (Power -> Reboot or Reset).
- Watch the console display in real time as the virtual machine boots.
Dedicated servers require a remote KVM console to view the display output:
- Log in to Hetzner Robot and select the affected server.
- Order a remote KVM console. Hetzner provides KVM consoles free of charge for up to three hours. Follow Hetzner’s KVM console documentation to request and open the remote viewer.
- In Hetzner Robot, navigate to the Reset tab and issue an Execute automatic hardware reset (or send CTRL+ALT+DEL).
- Watch the console screen as the physical server restarts.
What to watch for during boot
Pay close attention to error messages on the console screen:
- dm-verity errors:
device-mapper: verity: data block ... is corruptedindicates an integrity failure in the root filesystem. - Kernel panics: Call traces identifying missing drivers, memory faults, or CPU panics.
- Network initialization: Messages regarding link status or interface naming (e.g.,
virtio_neton cloud, or hardware drivers such asbnxt_en,e1000e,igb, orr8169on bare metal). - Systemd freezes: Services hanging indefinitely during first-boot initialization.
Take screenshots of any errors or panic traces displayed on the console viewer to attach to your support case.
Step 4: Boot into the Hetzner rescue system
If the server boots without a kernel panic but remains inaccessible over the network, boot into Hetzner’s RAM-based rescue environment to access the local disk files directly.
- In the Hetzner Cloud Console, select the server and navigate to the Rescue tab.
- Choose your public SSH key, and click Enable Rescue & Power Cycle. See Hetzner Cloud Rescue documentation.
- The virtual machine reboots into the rescue environment.
- In Hetzner Robot, select the server and open the Rescue tab.
- Choose your public SSH key, and click Activate rescue system. See Hetzner Robot Rescue documentation.
- Navigate to the Reset tab and trigger an Execute automatic hardware reset.
- Wait a few minutes for the server to boot into RAM.
Once the server has rebooted into rescue mode, connect via SSH:
$ ssh root@<server-ip> -i <path to ssh key>
Step 5: Mount the disk and inspect the logs
Both Hetzner Cloud and bare-metal servers running Syself Linux use standard partition labels. Inspect the partitions and mount the machine’s data filesystem.
List available storage devices and partitions:
# lsblk -fIdentify the partition labeled
DATA(formatted asext4, typically/dev/vda5on Hetzner Cloud or/dev/nvme0n1p5//dev/sda5on bare metal).Mount the partition read-only under
/mnt:# mount -o ro /dev/disk/by-label/DATA /mntReview the provisioner debug logs:
# ls -la /mnt/var/log/syself/provision/This directory contains diagnostic artifacts collected by the Syself provisioner before rebooting, including partition dumps, storage layout, sysctl parameters, and image verification data.
Check the first-boot activation log:
# cat /mnt/var/log/syself-activate.log(Optional) Check offline systemd journal logs:
# journalctl -D /mnt/var/log/journal
Important
The existence of /var/log/syself-activate.log is critical for diagnosis:
- Log does not exist: The server failed during early boot (bootloader, kernel panic, or dm-verity verification) before the operating system reached the activation service.
- Log exists: Inspect the end of the file. It records network configuration steps, certificate generation, and attempts to join the Kubernetes control plane. Any network failure or token rejection will be logged here.
Step 6: Collect the bundle and contact support
Create an archive containing the diagnostic logs while still in the rescue shell:
# tar -czf /tmp/unreachable-machine-logs.tar.gz -C /mnt/var/log syself syself-activate.log
From your local machine, copy the archive using scp:
$ scp root@<server-ip>:/tmp/unreachable-machine-logs.tar.gz .
When submitting a ticket, include:
- The
unreachable-machine-logs.tar.gzarchive. - Any screenshots captured from the Cloud or KVM console.
- Output from
kubectl describe machine <machine-name>. - Server type and identifier (Hetzner Cloud Server ID or Robot Server ID).
For bare-metal servers, if Syself engineers request access to investigate the host directly in Hetzner Robot, follow Grant Syself bare-metal access .
Step 7: Cleanup and next steps
- Unmount the disk before rebooting:
# umount /mnt - If the investigation concluded that the OS image was corrupted or failed verification, the machine must be reprovisioned. See Serial console and rescue system .
- Return the server to regular boot:
- Hetzner Cloud: In the Cloud Console, ensure rescue mode is disabled, then power cycle the server.
- Bare Metal: In Hetzner Robot, reset the server without activating rescue mode.
- Once ready for automated management to resume, remove the pause annotation:
$ kubectl -n <cluster-namespace> annotate machine <machine-name> cluster.x-k8s.io/paused-
Related
Grant Syself bare-metal access
Put a Hetzner bare-metal server into maintenanceMode, create a temporary Hetzner Robot admin login for Syself support, then revoke it and let the server rejoin the cluster.
FAQ
Answers to the most common questions about Syself Autopilot: what it is, how billing works, and how upgrades work.