Skip to content

Proxmox as a supported platform: where the work stands and what a decision needs #3481

Description

Moving the Proxmox work out of a stalled pull request and into a place where it can be discussed, since a 32k-line draft is not a format anyone can respond to. This issue records where the effort actually stands. It is not a commitment to ship Proxmox support, and it does not carry a decision either way.

Where it stands

#1927 carried a paas-proxmox bundle preset: proxmox-csi, proxmox-worker, proxmox-ve, the Cluster API provider wiring and the platform bundle entries, across 157 files. It stayed a draft from January, conflicts with main, and nothing in that direction exists in the tree today beyond two module-install helper scripts under the linstor and piraeus packages. I closed it, because the diff had drifted far enough that reviewing it line by line would have told us nothing about the actual question.

The earlier tracking issue, #69, was closed by the stale bot in July rather than by anyone deciding the topic. Its last substantive comment is worth repeating here, because it comes from the person who wrote the PR:

The system is not production-ready due to the lack of automated VM provisioning. This is a hard blocker, not a "remaining 10%".

So the storage and networking pieces got most of the attention, while the layer that creates the VMs in the first place stayed unspecified. That ordering is what left the work unable to land.

What a decision would need

The open question is not whether the individual components work. It is whether Proxmox becomes a supported way to run Cozystack, which means someone maintains it, tests it, and answers issues about it for as long as it ships. That is a larger commitment than any single PR represents, and it should be made deliberately rather than accumulated by merging parts.

If the answer turns out to be yes, the provisioning layer is the thing to specify first, and the rest is reviewable in pieces afterwards: the CSI driver, the cloud-controller integration and the bundle wiring are separable and each small enough to reason about. If the answer is no, saying so plainly is more useful to everyone who has asked about Proxmox over the past two years than leaving the topic in limbo, which is where it has been.

Either outcome is fine. Drifting is what is not.

Activity

  1. added
    triage/needs-triageIndicates an issue needs triage by a maintainer
    area/platformIssues or PRs related to platform infrastructure (bundle, flux, talos, installer)
    on Jul 29, 2026
  2. themoriarti commented on Sep 5, 2026

    @themoriarti
    Collaborator

    the provisioning layer is the thing to specify first, and the rest is
    reviewable in pieces afterwards

    That is what this is. The provisioning layer works, and the rest is split the
    way the issue asks for.

    The hard blocker was not a capmox incompatibility

    #69 called automated VM provisioning "a hard blocker, not a remaining 10%", and
    in eight months nobody produced a VM through ProxmoxMachine. It turns out that
    was four independent packaging and configuration causes, each hidden behind the
    previous one:

    1. PROXMOX_URL carried /api2/json, which capmox appends itself — every call
      went to /api2/json/api2/json/… and returned 501.
    2. No IPAM provider was installed. capmox allocates from an InClusterIPPool and
      has no DHCP mode, so ProxmoxCluster never reached Ready.
    3. templateSelector.matchTags is set equality, not containment. A template with
      four tags is not matched by naming one: found 0 VM templates with tags.
    4. capmox waits for the qemu-guest-agent, which Talos does not ship —
      error waiting for agent: timed out.

    None of them is in the provider. That is why the earlier work could look
    complete and still never boot a machine, and it is the part I would ask a
    reviewer to weigh: the thing that stalled this for two years was not a missing
    capability.

    What runs now

    On Proxmox VE 9.2.11, Talos v1.13.6, Cozystack's own CAPI stack:

    Cozystack → CAPI + Kamaji + capmox + IPAM
       → linked-clone VM on Proxmox (8 KiB per worker, not 10.2 GiB)
          → Talos via the nocloud ISO
             → Ready node in a tenant cluster
                → CCM: providerID + topology labels
                   → CSI: PVC bound to a real disk on the hypervisor
    
    $ KUBECONFIG=<tenant> kubectl get node -o wide
    kubernetes-px-md0-jmzds-h9npx  Ready  v1.35.6  10.0.0.160  Talos (v1.13.6)
    
    $ KUBECONFIG=<tenant> kubectl get pvc csi-probe
    csi-probe  Bound  pvc-831a2db6-…  1Gi  RWO  proxmox
    
    $ qm config 106
    scsi1: vm-disks1:vm-9999-pvc-831a2db6-…,size=1G
    

    Three PRs, in the order you named

    1. Provisioning — capmox v0.7.7 and in-cluster IPAM v1.0.3 as optional
      packages, plus the bundle wiring. Reviewable on its own.
    2. Substrate switch — one substrate: kubevirt | proxmox value in
      apps/kubernetes and apps/kubernetes-nodes, not parallel charts. The
      KubeVirt path renders byte-for-byte unchanged; the golden snapshots pin it.
    3. Storage and cloud-controller — proxmox-csi and proxmox-ccm. Stacked on
      2, because it is the substrate value it gates on.

    make unit-tests passes on each branch independently, and each is codegen-clean.

    On the question the issue actually asks

    You are right that the components working is a different question from Proxmox
    being supported, and that the second one is a commitment rather than a merge.
    Answering it directly rather than leaving it implied: I am offering to carry it.

    What that means concretely:

    • Hardware. A Proxmox VE 9 host (48 threads, 251 GiB RAM, ZFS) dedicated to
      this. That is the thing upstream CI does not have — e2e here runs on
      oracle-vm-* runners, and a Proxmox substrate cannot be exercised on them at
      all, which is a large part of why this has never been testable.
    • e2e. A self-hosted runner on that host, so the substrate is covered by the
      same bats/chainsaw suite as everything else rather than by my word. I would
      write the job and keep it green.
    • Maintenance. capmox tracks the Cluster API contract and moves with it —
      v0.8 already declares v1beta2, which is why v0.7.7 is pinned here. Following
      those bumps, keeping the vendored components current, and triaging Proxmox
      issues is the recurring work, and I am taking it.

    What does not exist today, plainly: there is no e2e coverage for Proxmox in
    CI, and everything above was verified by hand — one hypervisor, one tenant
    cluster. That is the gap. It is also the first thing I would close, and closing
    it is only worth the effort if the direction is acceptable to you — so I am
    asking for the answer rather than assuming it.

    Two limitations worth knowing before reviewing:

    • proxmox-cloud-controller-manager chart 0.2.30 is incompatible with PVE 9's
      HA-groups API (ha groups have been migrated to rules, every five minutes).
      Node initialization is unaffected.
    • TalosConfigTemplate.spec is immutable by schema, so the reconcile Job cannot
      rewrite an apiserver endpoint it has already published. Pre-existing, but it
      becomes visible on this substrate.

    If the answer is still no, that remains more useful than limbo — and the four
    causes above are worth recording either way, so the next person does not spend
    eight months on them.

  3. themoriarti commented on Sep 5, 2026

    @themoriarti
    Collaborator

    The three pull requests are open, in the order above:

    #4087 and #4088 share no files and can be reviewed in parallel. #4089 builds on #4088, and since GitHub cannot base a cross-fork PR on another fork's branch, its diff carries #4088's commits until that one merges — the two that belong to it are the last two.

    DCO, codegen-drift, pre-commit and the package builds pass on all three.

  4. lexfrei commented on Sep 21, 2026

    @lexfrei
    ContributorAuthor

    On shared storage, Proxmox-backed tenants cannot be isolated from each other at the volume level. That matters for the decision here. I found it reviewing #4089, but no change to that PR fixes it.

    The storage and cloud-controller components keep a Proxmox token inside the tenant cluster, where the tenant can read it. The CSI driver and the cloud-controller-manager both run there with a Proxmox API token. The token lands in plain text, in the chart's Secrets and in the Helm release Secrets. The tenant is cluster-admin in that cluster. The ACL the upstream charts document for the token sits on /. With it a tenant can read every VM's config, detach another tenant's disks, delete volumes, and attach any volume on the storage to one of its own workers.

    Narrowing the token does not help on shared storage. Every volume the CSI driver creates is owned by the same placeholder VMID. Deleting a volume needs Datastore.Allocate on the storage, and the same privilege lets the holder attach any volume on it. So there is no token scope that lets one tenant manage its own volumes without reaching everyone else's. Per-tenant tokens would narrow VM access, not this.

    Tearing a tenant down leaves its data behind with no owner. Teardown removes the CSI driver first, and nothing deletes the PVCs. Destroying a VM only frees volumes owned by that VM's ID. The CSI volumes stay behind with their data, and since they all carry the same owner there is no way to tell afterwards whose they were.

    So Proxmox-backed tenants need either storage that is not shared between them, or something outside the tenant cluster that holds the token and brokers volume operations. The series as it stands does neither. The rest of the findings are in the reviews on the three pull requests.

  5. added
    kind/featureCategorizes issue or PR as related to a new feature
    triage/needs-proposalIndicates an issue needs a design proposal in cozystack/community before work starts here
    priority/important-longtermImportant over the long term, but may not be staffed and/or may need multiple releases to complete
    and removed
    triage/needs-triageIndicates an issue needs triage by a maintainer
    on Sep 23, 2026
  6. themoriarti commented on Sep 30, 2026

    @themoriarti
    Collaborator

    The series this issue asked for is in main. Where it stands, and what is still open:

    Merged

    The isolation point raised above, and what #4089 does about it

    The token no longer reaches the tenant. Both the CSI controller and the CCM run in the management cluster, in the tenant's namespace, and read the operator's Secret there; the tenant cluster gets the node plugin, the CSIDriver object and the storage classes, none of which carry a credential. Two runs on a live stand scanned every Secret in the tenant cluster for the token and found none.

    Scope is one ACL per tenant on a Proxmox resource pool: proxmox.pool on every KubernetesNodes of the cluster, capmox adds each worker VM to it as it clones, replacements included, and the README's table lists the privileges each token needs on /pool/<pool> and on the tenant's storage — checked live with privilege-separated tokens holding exactly those rows, including a Machine replacement that the CSI attached to with no ACL touched. One thing learned the hard way is now in the README: Proxmox caps a privilege-separated token at its user's permissions, so the roles have to be granted to the user as well.

    Volumes are owned per cluster (controllerVmID derived from the tenant namespace and the release name), so leftovers on shared storage are attributable. Deleting a cluster frees its disks: the pre-delete hook releases the claims while the driver is still up, deleting the claims before the Pods that hold them, and waits for the PVs.

    What stays open by design, as stated in the README: a storage shared between tenants cannot be scoped — Datastore.Allocate on it is what deletes volumes and also what lets any volume on it be attached — so tenant-level isolation of volumes needs a storage per tenant. The controllers act on what the tenant's own PV objects name, which is the same reach a cluster-admin of the tenant has anyway.

    Also in #4089

    The worker reconcile Job now replaces the TalosConfigTemplate when CABPT's webhook refuses to patch it (the kubelet flag this series adds changes that spec on existing pools). This changes the KubeVirt path too: every existing worker pool gets a new reconcile Job on upgrade, and a pool whose live template has drifted from the render gets it recreated instead of failing. Machines already running keep the bootstrap data they joined with. If #3523 lands, its hashed template name has to be reflected in that Job's RBAC resourceNames and in the kubectl delete target, as discussed on the PR.

    Not done

    • e2e for the Proxmox substrate: the suite and its workflow are in the tree (hack/e2e-chainsaw/kubernetes-proxmox, .github/workflows/e2e-proxmox.yaml), parked — the workflow runs on workflow_dispatch or a nightly gated on vars.PROXMOX_NIGHTLY, and needs a self-hosted runner with the proxmox label that this repository does not have. Until then the substrate is covered by unit tests and by manual runs against a stand, not by CI.
    • The Proxmox CCM image v0.15.0 logs ha groups have been migrated to rules against PVE 9.x every reconcile; node initialisation is unaffected.

    I will keep following capmox's Cluster API contract bumps and triaging Proxmox issues, as offered above. Thanks to Aleksei Sviridkin (@lexfrei) for five rounds of review that reshaped this into something that can be trusted with a hypervisor token.

  7. themoriarti commented on Oct 5, 2026

    @themoriarti
    Collaborator

    Aleksei Sviridkin (@lexfrei) Since the Proxmox integration PRs have now been merged and I have been added as a reviewer for the related components, would it make sense to update this issue with the current status and clarify the maintenance model for the Proxmox integration?

    My understanding is that the Proxmox integration can continue to be developed and maintained as part of the open-source Cozystack project.

    I’m happy to continue contributing to and maintaining this part of the project, including the related components, testing and further integration work. It would be useful to document this in the issue so that the current status and ownership are clear. FYI Timur Tukaev (@tym83) Timofei Larkin (@lllamnyp) Andrei Kvapil (@kvaps) myasnikovdaniil Kingdon Barrett (@kingdonb) Matthieu ROBIN (@matthieu-robin) mattia-eleuteri IvanHunters

  8. themoriarti commented on Oct 7, 2026

    @themoriarti
    Collaborator

    The networking piece is up for discussion, on top of the provisioning layer that #4087, #4483, #4088 and #4089 put in main:

    It puts Proxmox VMs, the workers of Proxmox-backed tenant clusters included, on a subnet of the tenant's own VPC, with the VLAN, bridge and IP pool allocated by the platform rather than taken from tenant values. It does not change how VMs are provisioned, and it does not settle the question this issue asks.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Labels

area/platformIssues or PRs related to platform infrastructure (bundle, flux, talos, installer)kind/featureCategorizes issue or PR as related to a new featurepriority/important-longtermImportant over the long term, but may not be staffed and/or may need multiple releases to completetriage/needs-proposalIndicates an issue needs a design proposal in cozystack/community before work starts here

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions