PersistentVolumeClaim gets a real virtual disk on your Proxmox storage. That disk is attached to the VM that runs the pod. There is no extra install and no extra credential: the driver uses the same Proxmox API token the cluster was built with. That token needs Datastore.Audit on top of what provisioning uses - see Proxmox VE Credentials.
What Ankra installs
Theproxmox-csi Stack on each cluster holds:
When the cluster’s disks span more than one Proxmox storage, each further storage gets its own class, named
proxmox-csi-<storage>.
The driver reaches the Proxmox API from inside the cluster at the credential’s API URL. If that address is not reachable from the cluster’s VMs, for example on a routed SDN where guest traffic is SNATed, create the credential through the API with internal_api_url set to an address the VMs can reach. The driver then uses that address and Ankra keeps using api_url.
Use a volume
An unqualified claim lands on the default class:Pending until a pod uses it, because the class binds with WaitForFirstConsumer: a Proxmox disk is created on one host, so Kubernetes first picks the node, then the driver creates the disk on that node’s host.
Volumes are ReadWriteOnce disks attached to one VM at a time, as an extra SCSI disk on the VM (scsi1, scsi2, …). On directory storage such as local each volume is a raw image file; on LVM-thin, ZFS or Ceph it is a volume of that storage.
How volumes follow Proxmox hosts
Ankra labels every node with:topology.kubernetes.io/region: proxmox, the name the driver uses for the Proxmox installationtopology.kubernetes.io/zone: <proxmox host>, the host the VM runs on
proxmox://proxmox/<vmid>, which is how the driver finds the VM to attach a disk to.
On a single-host cluster this is invisible. On a host-spread cluster a volume on local storage belongs to one host, so a pod that uses it can only run on a node on that host. Kubernetes enforces this through the zone label. Use shared storage (Ceph RBD, for example) when a stateful pod must be able to move between hosts.
Clusters created before the fix
Before 30 October 2026, Ankra set neither the topology labels nor the providerID on nodes of kubeadm Proxmox clusters, and pointed the driver at the bare API address instead of/api2/json. On those clusters the node plugin restarts endlessly, and every claim stays Pending:
- Add
Datastore.Auditto the role of the cluster’s Proxmox token (pveum role modify <role> --append 1 --privs Datastore.Auditon the Proxmox host). - Let Ankra correct the API address in the
proxmox-csi-plugin-configSecret. It does so on the next reconcile, and restarts the controller when the Secret changes. - Replace the worker nodes. A node’s providerID cannot change once it has registered, so existing nodes cannot be repaired in place, and new nodes get the labels and the providerID: