Skip to main content
An Ankra Cloud server runs Proxmox VE well: its vCPUs expose hardware virtualisation (vmx), so Proxmox runs KVM guests at native speed rather than in emulation. That makes one server a full Proxmox lab, a place to rehearse an on-premises estate, or the host for a Proxmox VE cluster that Ankra builds and operates. This guide takes a fresh Debian 13 server to Proxmox VE 9, connects it to Ankra and builds a small kubeadm cluster on it. The same steps work on any provider that hands out a single public address per server. The parts specific to Ankra Cloud are the network layout (a /32 address, an on-link gateway and an MTU of 1370) and the serial console you fall back on if a network change goes wrong.

Before you start

  • An Ankra Cloud account and API token, or the console, to create one server.
  • An Ankra organisation, an SSH key credential, and the ankra CLI.
  • A local SSH key pair to reach the server.
Size the server for what you will run on it. Proxmox itself needs about 1 GB of memory, and an Ankra cluster on one host with a px-small bastion, a px-small control plane and a px-medium worker needs 8 vCPUs and 16 GB. starter-12c-24g with 200 GiB of storage leaves headroom for that. VM disks are thin, so they only use the space their guests write.

1. Create the server

Create a Debian 13 server with a public IPv4 address. Ankra reaches the Proxmox API and the cluster’s bastion through this address.
Note the server’s ID and public address (ankra-cloud servers list shows them again later). Check that nested virtualisation is available before you install anything:
A non-zero count and /dev/kvm mean KVM guests will run accelerated.
Set a root password before you change any networking (sudo passwd root). The server has no other login on the serial console (ankra-cloud api get_server_console / stream_server_console), and that console is your only way back in if a network change cuts you off.

2. Install Proxmox VE

Proxmox VE installs on top of Debian 13 (trixie) from its own package repository. A cloud image needs three adjustments that a bare-metal install does not:
  • The network moves from netplan to ifupdown2. Proxmox reads and writes /etc/network/interfaces; the image configures its NIC through netplan and systemd-networkd.
  • The NIC name is pinned. Netplan renames the NIC to eth0 by MAC address. Without netplan the kernel names it ens3, the eth0 stanza no longer matches anything, and the server boots with no network. A systemd .link file keeps the name.
  • GRUB gets its install device. The image carries both grub-pc and grub-efi, and the Proxmox kernel upgrade stops at grub-pc until it is told which disk to install to.
Run the install in two stages with a reboot between them. Stage 1 installs the Proxmox kernel and switches the network to ifupdown2 for the next boot. Stage 2 installs Proxmox VE.
install-proxmox-ve.sh
The stage 1 file keeps the server’s own addressing, so the /32 address and its on-link gateway (169.254.0.2 on Ankra Cloud) carry over unchanged: ifupdown2 adds the onlink default route itself. The MTU of 1370 carries over too. The web interface now answers on https://<server-ip>:8006 with a self-signed certificate. Log in as root with the password you set.

3. Create an API token for Ankra

Give Ankra its own Proxmox user with a role that holds exactly what provisioning needs:
The last command prints the token secret once; keep it for the next step. The token ID is ankra@pve!ankra. Proxmox VE Credentials explains why each privilege is needed.

4. Add a jumphost user

Ankra puts the cluster’s VMs on a private network, ankra (10.20.0.0/16), behind the host’s NAT. The server has a single public address, so nothing on that network is reachable from outside, including the bastion Ankra provisions. Ankra reaches it through an SSH jumphost, and the Proxmox host itself is the natural one. Create a user that can forward ports and do nothing else, with a key pair dedicated to Ankra:
restrict,port-forwarding gives the key no shell, no agent and no X11 forwarding, only TCP forwarding. To narrow it further, add permitopen="<server-ip>:8006" and one permitopen="<bastion-ip>:22" per cluster once you know the bastion’s address.

5. Connect the server to Ankra

The CLI asks for the token secret. --tls-insecure accepts the self-signed certificate Proxmox generated; with a DNS name for the server you can order a Let’s Encrypt certificate from Datacenter → ACME instead and leave the flag off. Saving the credential sets up what the host is missing, which takes a few minutes the first time:
  • vmbr0 - the NIC becomes the port of a Linux bridge that keeps the host’s address, gateway and MTU
  • the ankra SDN zone, vnet and subnet, with SNAT and dnsmasq DHCP. The zone takes the uplink’s MTU (1370 here), and every cluster VM’s NIC inherits it
  • images, rootdir and import content on the local storage
  • the ankra-ubuntu-24-04 cloud-init template, built from the Ubuntu 24.04 cloud image
Check what Ankra now sees:
Expect one online host, the local directory storage, the vmbr0 and ankra bridges, and the ankra-ubuntu-24-04 template.

6. Create a cluster

Pass --storage local: a Proxmox VE installed on Debian has no local-lvm, which is the CLI’s default. --include-dns=false skips the generated public domain, because Traefik on a single-host Proxmox cluster has no public load balancer for the domain to point at. Follow the build:
The cluster reads online once the agent connects. On this host a px-small control plane and a px-medium worker reach Ready about fifteen minutes after the create:
Persistent volumes are not available yet. The bundled Proxmox CSI node plugin needs topology.kubernetes.io/region and topology.kubernetes.io/zone labels on every node, which Ankra does not set on Proxmox nodes today, so its pods restart with Failed to get region or zone for node. Run stateless workloads, or bring your own storage, until this is fixed.
From then on it is an ordinary Proxmox VE cluster. Proxmox VE Clusters covers node groups, upgrades, stop and start, and teardown.

Clean up

Terminate the cluster first so Ankra deletes its VMs, then delete the credential and the server:

Troubleshooting