Repository navigation
docs(design-proposals): add GPU in Kairos worker pools proposal - #101
Aleksei Sviridkin (lexfrei) wants to merge 3 commits into
Conversation
|
Important
This repository does not receive automatic reviews because it has fewer than 10 stars. ⚙️ Run configuration
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
Tenants of managed Kubernetes cannot get GPUs on Kairos pools: the platform image carries no GPU driver. The NVIDIA vGPU guest driver cannot be shipped by Cozystack because it is licensed per customer and may not be published, for example in a public image or repository. The proposal adds an extension point instead: a build recipe that layers a hoster-supplied driver onto the platform worker image, one image per mode (vGPU or passthrough), a platform setting naming the hoster's images, the vGPU license Secret and optional registry credentials, and chart support that selects the image by the pool's mode and delivers the license files to vGPU pools. Pools take GPUs only through GPUDevice, by device selector or device template, and vGPU is allowed only for tenants whose GPUDevice vGPU flag holds, so the proposal is implemented after GPUDevice. Assisted-by: LLM Signed-off-by: Aleksei Sviridkin <f@lex.la>
955171f to
a068f44
Compare
Andrei Kvapil (kvaps)
left a comment
There was a problem hiding this comment.
I'd postpone this one until we decide on Kairos for tenant worker pools. A second worker OS is a bigger decision than GPU: its own image pipeline, a young CAPI bootstrap provider and a migration path for existing Talos pools. Today it comes as code in cozystack/cozystack#4911 without a design proposal. Let's have that proposal first, and then come back to how GPUs attach to Kairos workers.
Two things for later, no need to address them now:
workerImagesentries must match the chart's pinned patch, so every Cozystack upgrade that moves the patch breaks the render of all GPU pools until the hoster rebuilds, and it can't be prepared beforehand. Taking the Machine version from the hoster's entry would avoid it.- A KubeVirt
secretvolume for the token. CAPK appends its config drive to the template volumes instead of replacing them (pkg/kubevirt/utils.go:144-155), so the token doesn't have to be inline inKairosConfigTemplate, and rotation becomes a VMI restart instead of replacing every vGPU machine.
Andrei Kvapil (kvaps)
left a comment
There was a problem hiding this comment.
Read it as if #99 had landed, and the blocker is still the one from my previous comment: Kairos pools need their own proposal first. cozystack/cozystack#4911 also carries downstream patches to the Kairos CAPI provider, and this proposal only mentions the merged upstream kairos-io/cluster-api-provider-kairos#141. That proposal should say what we carry and for how long.
I'd also like that proposal to move the OS settings off the pool into a hoster-side class, NodeGroupClass in kubernetes.cozystack.io/v1alpha1, like StorageClass: the OS, the worker image, the GPU mode, and the references to the license and registry Secrets. Tenants can't create Secrets through the Cozystack API, so a Secret reference on a pool is really a hoster setting anyway. With a class the platform reads the hoster's Secrets directly, and the per-tenant copies, the entitlement check on them and licenseRevision go away. The class should be immutable, a new version is a new name, otherwise one change rolls the pools of every tenant.
That also removes kairos.gpuMode. If mode on GPUClass is immutable and the pool entry names the class (className in deviceSelector), the chart can take the mode from the class.
For when we come back to it:
- The license token is just a file, so the KubeVirt
secretvolume from my previous comment should be the main path. Rotation becomes a VMI restart. gpu=onis set for HAMi in both modes. Is HAMi meant to share a whole passthrough GPU between pods there?- cozystack/cozystack#4949 counts
gpu-countas the number ofgpusentries. With acounton devices, scale from zero will see the wrong number of GPUs per node.
The GPU proposal this one builds on renamed GPUDevice to GPUClaim and its pool entries to claimSelector and claimTemplate, so the references here use the new names. Assisted-by: LLM Signed-off-by: Aleksei Sviridkin <f@lex.la>
The GPU proposal now keeps a class's mode fixed for its lifetime and has claimSelector name the class, so a pool no longer states its mode in its own field and no label carries it to the webhook. The chart reads the mode from the named class instead. Assisted-by: LLM Signed-off-by: Aleksei Sviridkin <f@lex.la>
|
Hi! We removed Sorry for the extra work, I wanted to mention this now so it doesn't come up late in review. |
Kairos worker pools exist as a draft pull request in cozystack/cozystack without a design proposal, and the GPU in Kairos pools proposal (#101) is on hold until one exists. This proposal states why a second worker OS is worth its cost for tenant pools, keeps Talos the default, and moves the OS and the worker image into a hoster-side immutable NodeGroupClass, so hoster images and registry credentials stay out of tenant namespaces and do not break on a platform patch bump. It also lists what is carried on top of the upstream Kairos provider and when each piece is dropped. Assisted-by: LLM Signed-off-by: Aleksei Sviridkin <f@lex.la>
Kairos worker pools exist as a draft pull request in cozystack/cozystack without a design proposal, and the GPU in Kairos pools proposal (#101) is on hold until one exists. This proposal states why a second worker OS is worth its cost for tenant pools, keeps Talos the default, and moves the OS and the worker image into a hoster-side immutable NodeGroupClass, so hoster images and registry credentials stay out of tenant namespaces and do not break on a platform patch bump. It also lists what is carried on top of the upstream Kairos provider and when each piece is dropped. Assisted-by: LLM Signed-off-by: Aleksei Sviridkin <f@lex.la>
Kairos worker pools exist as a draft pull request in cozystack/cozystack without a design proposal, and the GPU in Kairos pools proposal (#101) is on hold until one exists. This proposal states why a second worker OS is worth its cost for tenant pools, keeps Talos the default, and moves the OS and the worker image into a hoster-side immutable NodeGroupClass, so hoster registry credentials stay out of tenant namespaces and a hoster image does not break on a platform patch bump. It also lists what is carried on top of the upstream Kairos provider and when each piece is dropped. Assisted-by: LLM Signed-off-by: Aleksei Sviridkin <f@lex.la>
Kairos worker pools exist as a draft pull request in cozystack/cozystack without a design proposal, and the GPU in Kairos pools proposal (#101) is on hold until one exists. This proposal states why a second worker OS is worth its cost for tenant pools, keeps Talos the default, and moves the OS and the worker image into a hoster-side immutable NodeGroupClass, so hoster registry credentials stay out of tenant namespaces and a hoster image does not break on a platform patch bump. It also lists what is carried on top of the upstream Kairos provider and when each piece is dropped. Assisted-by: LLM Signed-off-by: Aleksei Sviridkin <f@lex.la>
Kairos worker pools exist as a draft pull request in cozystack/cozystack without a design proposal, and the GPU in Kairos pools proposal (#101) is on hold until one exists. This proposal states why a second worker OS is worth its cost for tenant pools, keeps Talos the default, and moves the OS and the worker image into a hoster-side immutable NodeGroupClass, so hoster registry credentials stay out of tenant namespaces and a hoster image does not break on a platform patch bump. It also lists what is carried on top of the upstream Kairos provider and when each piece is dropped. Assisted-by: LLM Signed-off-by: Aleksei Sviridkin <f@lex.la>
Kairos worker pools exist as a draft pull request in cozystack/cozystack without a design proposal, and the GPU in Kairos pools proposal (#101) is on hold until one exists. This proposal states why a second worker OS is worth its cost for tenant pools, keeps Talos the default, and moves the OS and the worker image into a hoster-side immutable NodeGroupClass, so hoster registry credentials stay out of tenant namespaces and a hoster image does not break on a platform patch bump. It also lists what is carried on top of the upstream Kairos provider and when each piece is dropped. Assisted-by: LLM Signed-off-by: Aleksei Sviridkin <f@lex.la>
Kairos worker pools exist as a draft pull request in cozystack/cozystack without a design proposal, and the GPU in Kairos pools proposal (#101) is on hold until one exists. This proposal states why a second worker OS is worth its cost for tenant pools, keeps Talos the default, and moves the OS and the worker image into a hoster-side immutable NodeGroupClass, so hoster registry credentials stay out of tenant namespaces and a hoster image does not break on a platform patch bump. It also lists what is carried on top of the upstream Kairos provider and when each piece is dropped. Assisted-by: LLM Signed-off-by: Aleksei Sviridkin <f@lex.la>
Timofei Larkin (lllamnyp)
left a comment
There was a problem hiding this comment.
Thanks for this. The Hadron findings in Context (the tmpfiles.d entry, ordering nvidia-modprobe before nvidia-persistenced, the glibc prefix) are exactly the hands-on detail a hoster needs, and I'd like to keep all of it. I know #101 is waiting on #115. Here's the shape I'd hope it comes back in.
The direction I'd like: worker pools that don't know about GPUs or OSes beyond what they must. A worker is a VM that happens to join a control plane. Whatever a tenant VM can have (a GPU, a licensed guest driver, an image from a private registry) a worker should get through the same mechanism, not through a parallel one in KubernetesNodes. Karpenter on AWS is a good model. The node class names an OS family and an image, the instance type carries the accelerator, and nothing about GPUs is implemented per OS or per node pool.
Measured against that, most of #101 sits in the wrong layer. Roughly a quarter of the Design section is about Kairos: the image recipe (§1), the file entries in the bootstrap template (§3), and gpu-operator on Kairos (§4). The other three quarters have nothing to do with Kairos or with worker pools:
- the license Secret and
FeatureType; - the vGPU entitlement;
- replicating the token and registry credentials into namespaces;
- rotation;
- choosing an image by GPU mode.
A tenant VM with a vGPU (#100) needs every one of these, and today #100 answers them differently: the hoster may bake the token into a shared golden image. If they stay here, the next worker OS and the VM path each get their own copy.
What I'd suggest moving where:
-
GPU mode and license settings belong on
GPUClass(#99), not on the worker side. The mode already lives there and can't change (#99, decision 0009). The license also follows the profile: compute profiles are licensed through NVIDIA AI Enterprise and graphics profiles through vGPU software, andFeatureTypedepends on the profile type. A reference to the license Secret and theFeatureTypeon the class would serve VMs and workers alike. I'd go a step further than Andrei Kvapil (@kvaps)'s suggestion of putting the GPU mode and Secret references onNodeGroupClass, and keep them off the worker side altogether. -
License delivery belongs to the VM, defined once with #99 and #100. I agree with Andrei Kvapil (@kvaps) that a KubeVirt
secretvolume should be the main path. A KubeVirtsecretvolume references a Secret in the VM's own namespace, so a per-namespace copy is still needed, but #99's controller already knows which namespaces hold entitled vGPU claims. One option is for #99's VMI webhook, which already resolves claim references at VMI creation, to add the license volume for a vGPU claim. Then a plain VM and a worker get it identically, with no chart change invm-instanceorkubernetes-nodes. Rotation becomes a VMI restart instead of rolling every vGPU worker of every tenant. Tokens stop accumulating in old bootstrap templates. The dependency on upstreamcontentFromdisappears, and so dolicenseRevisionand the gate. The only part left for the OS is "mount the volume and put the file wherenvidia-griddreads it", which belongs in the image. -
Driver images belong to image distribution (#115 for workers, #100 for VMs). A GPU worker image is a hoster
NodeGroupClasswhose image is the hoster's GPU build. That removesgpu.kairosGuest.workerImages, the per-mode registry copies, and the render failure when the pinned patch moves. Whether an image carries the vGPU guest driver is a property of the image. I'd mark and check it the same way for VM golden images and worker classes. A vGPU VM booted from an image without the guest driver gets a GPU that doesn't work, and #100 doesn't refuse that. A worker pool should be treated the same, or both should get the same check. Keeping the vGPU driver away from tenants without the entitlement is then one requirement on image distribution, and it feeds directly into #115's open question 7 (clone rights on goldens incozy-public). -
What stays in #101 is the Kairos guest: the image recipe for both modes, its
teststage, the unit that places the license file, and the gpu-operator contract below. On theKubernetesNodesside the only change left would be lifting thegpusrefusal on Kairos pools and passing the entries through to the VM template unchanged. That's small enough to be a section of #115 plus a hoster guide, rather than a proposal of its own.
More broadly, KubernetesNodes and VMInstance. The worker pool chart currently has its own copy of the VM shape: instance type or explicit resources, disks, firmware, networking and gpus. #99 then adds GPU references to both charts in different shapes: claim/claimTemplate on VMs, claimSelector/claimTemplate on pools. I'd like worker pools to be "N VMs from a VM template, plus a bootstrap config", where the template is shared with vm-instance, so a VM feature doesn't have to be implemented twice. CAPK takes a full VirtualMachineSpec, so this works with Cluster API as it is. It's a separate proposal, but it's the direction I'd like this one to move toward, not away from.
On the Kairos image itself:
- gpu-operator in mixed clusters. The gpu-operator addon is per tenant cluster, but the OS is per pool. A cluster with a Talos pool and a Kairos pool, which is every cluster moving pools from one OS to the other, runs one gpu-operator whose
DRIVER_ROOT,NVIDIA_DRIVER_ROOTandNVIDIA_CTK_PATHmust work on both. So "the addon gets an override for Kairos" (L163) isn't available. Could the image be required to meet the existing contract (driver libraries resolvable from/,nvidia-ctkat/usr/local/bin), with theteststage checking it? - musl vs glibc. The NVIDIA userspace is glibc-linked, and that drives the prefix and most of the open questions (the validator and CDI lookup, HAMi, the data center driver). #115 lists an Ubuntu-based Kairos flavour as an alternative. Would a glibc flavour for GPU images remove most of these? A sentence in Alternatives either way would help.
- Testing. The passthrough image hasn't been tested on Hadron yet. It would be good to run it once, alongside the vGPU path, before the image contract is written down.
| The chart: | ||
|
|
||
| 1. Refuses raw `name` entries on a Kairos pool, `claimSelector` together with `claimTemplate`, and a class name that names no `GPUClass`, with a message naming it. | ||
| 2. Looks up `workerImages` for the pool's mode and minor. A missing entry or an empty field fails the render with a message naming the mode and the minor. For a `vgpu` pool, a `featureType` that is not a positive integer or an empty `licenseSecretName` fails it too. A `kubernetesVersion` that differs from the chart's pin fails the render with both versions in the message. |
There was a problem hiding this comment.
I think #115 supersedes this. A hoster class carries kubernetesVersion, and the Machine version comes from it, so a Cozystack upgrade that moves the patch no longer breaks GPU pools. Could this check go when the proposal moves onto the class?
|
|
||
| `featureType` is a plain value, not part of the Secret, because the chart renders `gridd.conf` from it and it is not sensitive. The value NVIDIA documents for a vGPU guest is `1`, with the license type chosen from the vGPU type. `4` appears only in a comment of the `gridd.conf` template. The live test used `4` on a C-series profile. The hoster sets the value. `kubernetesVersion` is required on each entry: the bootstrap provider refuses a join unless kubeadm matches the Machine's version to the patch, and a Cozystack upgrade can move the pinned patch of a minor. With the patch recorded, the chart compares it with its own pin and refuses to render, instead of every new GPU node failing at join. | ||
|
|
||
| The images reach workers the way the platform disk does: CDI on the management cluster imports them into each worker's disk in the tenant namespace, through the `registry` source of a `DataVolume`. Registry access is set per mode, because the vGPU guest driver must not reach tenants without a vGPU entitlement. The reconciler of section 3 copies a mode's Secret and ConfigMap into a tenant namespace only for the modes that namespace has a Kairos GPU pool in, for `vgpu` only when the tenant is entitled, and the chart sets the copies of the pool's mode as the source's `secretRef` and `certConfigMap`; CDI requires both in the namespace of the `DataVolume`. Without them the import is anonymous, as for the platform disk today. The images are never pulled from inside a tenant cluster. |
There was a problem hiding this comment.
#115 avoids copying registry credentials into tenant namespaces by importing catalog disks once into a golden. I'd rather this proposal state its requirement (the vGPU guest driver must not reach tenants without the entitlement) and leave the mechanism to #115 and #100, so VM images and worker images follow one rule.
| 2. Looks up `workerImages` for the pool's mode and minor. A missing entry or an empty field fails the render with a message naming the mode and the minor. For a `vgpu` pool, a `featureType` that is not a positive integer or an empty `licenseSecretName` fails it too. A `kubernetesVersion` that differs from the chart's pin fails the render with both versions in the message. | ||
| 3. Uses that image instead of the platform disk. `kairos.image` on a GPU pool is refused. | ||
| 4. For a `vgpu` pool, renders `/etc/nvidia/gridd.conf` with `FeatureType` into the `KairosConfigTemplate` files, and adds an entry for `/etc/nvidia/ClientConfigToken/client_configuration_token.tok` whose content comes from the license copy, as a `contentFrom` reference or filled in by the reconcile Job (below). The chart never sees the token. | ||
| 5. Labels the nodes `gpu=on` for HAMi, in both modes. |
There was a problem hiding this comment.
Following up on Andrei Kvapil (@kvaps)'s question: what is HAMi meant to do on these pools? On passthrough it would share a whole GPU between pods. On vGPU it would subdivide a slice that's already fractional. If it isn't intended, I'd leave the label off. If it is, it's a GPU-sharing decision that belongs with #99 rather than in the pool chart.
|
|
||
| The host half of vGPU already lives here: `gpu.vgpuManager` names the hoster's private vGPU Manager image, and `vmImport.vddkImage` follows the same rule for another proprietary image. Those two reach their consumers through Package components, which a per-tenant app cannot use. The `kubernetes-nodes` chart needs `kairosGuest` at render time, so the platform forwards it on the `_cluster` channel, never the token itself, as `_cluster.wildcard-secret-name` already does with a controller replicating the Secret. A dedicated CRD would add an API and RBAC for a few values that rarely change. | ||
|
|
||
| `featureType` is a plain value, not part of the Secret, because the chart renders `gridd.conf` from it and it is not sensitive. The value NVIDIA documents for a vGPU guest is `1`, with the license type chosen from the vGPU type. `4` appears only in a comment of the `gridd.conf` template. The live test used `4` on a C-series profile. The hoster sets the value. `kubernetesVersion` is required on each entry: the bootstrap provider refuses a join unless kubeadm matches the Machine's version to the patch, and a Cozystack upgrade can move the pinned patch of a minor. With the patch recorded, the chart compares it with its own pin and refuses to render, instead of every new GPU node failing at join. |
There was a problem hiding this comment.
Small one: the default is 1, but the only live test used 4 on a C-series profile. Could the text say which value has been validated? If the setting moves to GPUClass as suggested in the review comment, the class can carry the value that matches its profile.
| - **Date:** `2026-10-14` | ||
| - **Status:** Review |
There was a problem hiding this comment.
Per #111, the Status and Date header fields can go. The ## Decisions heading (L23) is empty; either drop it or add records.
Kairos worker pools exist as a draft pull request in cozystack/cozystack without a design proposal, and the GPU in Kairos pools proposal (#101) is on hold until one exists. This proposal states why a second worker OS is worth its cost for tenant pools, keeps Talos the default, and moves the OS and the worker image into a hoster-side immutable NodeGroupClass, so hoster registry credentials stay out of tenant namespaces and a hoster image does not break on a platform patch bump. It also lists what is carried on top of the upstream Kairos provider and when each piece is dropped. Assisted-by: LLM Signed-off-by: Aleksei Sviridkin <f@lex.la>
Kairos worker pools exist as a draft pull request in cozystack/cozystack without a design proposal, and the GPU in Kairos pools proposal (#101) is on hold until one exists. This proposal states why a second worker OS is worth its cost for tenant pools, keeps Talos the default, and moves the OS and the worker image into a hoster-side immutable NodeGroupClass, so hoster registry credentials stay out of tenant namespaces and a hoster image does not break on a platform patch bump. It also lists what is carried on top of the upstream Kairos provider and when each piece is dropped. Assisted-by: LLM Signed-off-by: Aleksei Sviridkin <f@lex.la>
Kairos worker pools exist as a draft pull request in cozystack/cozystack without a design proposal, and the GPU in Kairos pools proposal (#101) is on hold until one exists. This proposal states why a second worker OS is worth its cost for tenant pools, keeps Talos the default, and moves the OS and the worker image into a hoster-side immutable NodeGroupClass, so hoster registry credentials stay out of tenant namespaces and a hoster image does not break on a platform patch bump. It also lists what is carried on top of the upstream Kairos provider and when each piece is dropped. Assisted-by: LLM Signed-off-by: Aleksei Sviridkin <f@lex.la>
Kairos worker pools exist as a draft pull request in cozystack/cozystack without a design proposal, and the GPU in Kairos pools proposal (#101) is on hold until one exists. This proposal states why a second worker OS is worth its cost for tenant pools, keeps Talos the default, and moves the OS and the worker image into a hoster-side immutable NodeGroupClass, so hoster registry credentials stay out of tenant namespaces and a hoster image does not break on a platform patch bump. It also lists what is carried on top of the upstream Kairos provider and when each piece is dropped. Assisted-by: LLM Signed-off-by: Aleksei Sviridkin <f@lex.la>
Kairos worker pools exist as a draft pull request in cozystack/cozystack without a design proposal, and the GPU in Kairos pools proposal (#101) is on hold until one exists. This proposal states why a second worker OS is worth its cost for tenant pools, keeps Talos the default, and moves the OS and the worker image into a hoster-side immutable NodeGroupClass, so hoster registry credentials stay out of tenant namespaces and a hoster image does not break on a platform patch bump. It also lists what is carried on top of the upstream Kairos provider and when each piece is dropped. Assisted-by: LLM Signed-off-by: Aleksei Sviridkin <f@lex.la>
Kairos worker pools exist as a draft pull request in cozystack/cozystack without a design proposal, and the GPU in Kairos pools proposal (#101) is on hold until one exists. This proposal states why a second worker OS is worth its cost for tenant pools, keeps Talos the default, and moves the OS and the worker image into a hoster-side immutable NodeGroupClass, so hoster registry credentials stay out of tenant namespaces and a hoster image does not break on a platform patch bump. It also lists what is carried on top of the upstream Kairos provider and when each piece is dropped. Assisted-by: LLM Signed-off-by: Aleksei Sviridkin <f@lex.la>
Kairos worker pools exist as a draft pull request in cozystack/cozystack without a design proposal. This proposal states why a second worker OS is worth its cost for tenant pools and makes a hoster-side immutable NodeGroupClass the whole OS boundary, for Talos as well as Kairos, so the pool keeps only fields that mean the same thing on every OS and existing pools move onto Talos classes without rolling. It folds in the Kairos GPU guest image from the GPU in Kairos pools proposal (#101), and lists what is carried on top of the upstream Kairos provider and when it is dropped. Assisted-by: LLM Signed-off-by: Aleksei Sviridkin <f@lex.la>
Kairos worker pools exist as a draft pull request in cozystack/cozystack without a design proposal. This proposal states why a second worker OS is worth its cost for tenant pools and makes a hoster-side immutable NodeGroupClass the whole OS boundary, for Talos as well as Kairos, so the pool keeps only fields that mean the same thing on every OS and existing pools move onto Talos classes without rolling. It folds in the Kairos GPU guest image from the GPU in Kairos pools proposal (#101), and lists what is carried on top of the upstream Kairos provider and when it is dropped. Assisted-by: LLM Signed-off-by: Aleksei Sviridkin <f@lex.la>
Kairos worker pools exist as a draft pull request in cozystack/cozystack without a design proposal. This proposal states why a second worker OS is worth its cost for tenant pools and makes a hoster-side immutable NodeGroupClass the whole OS boundary, for Talos as well as Kairos, so the pool keeps only fields that mean the same thing on every OS and existing pools move onto Talos classes without rolling. It folds in the Kairos GPU guest image from the GPU in Kairos pools proposal (#101), and lists what is carried on top of the upstream Kairos provider and when it is dropped. Assisted-by: LLM Signed-off-by: Aleksei Sviridkin <f@lex.la>
Kairos worker pools exist as a draft pull request in cozystack/cozystack without a design proposal. This proposal states why a second worker OS is worth its cost for tenant pools and makes a hoster-side immutable NodeGroupClass the whole OS boundary, for Talos as well as Kairos, so the pool keeps only fields that mean the same thing on every OS and existing pools move onto Talos classes without rolling. It folds in the Kairos GPU guest image from the GPU in Kairos pools proposal (#101), and lists what is carried on top of the upstream Kairos provider and when it is dropped. Assisted-by: LLM Signed-off-by: Aleksei Sviridkin <f@lex.la>
Kairos worker pools exist as a draft pull request in cozystack/cozystack without a design proposal. This proposal states why a second worker OS is worth its cost for tenant pools and makes a hoster-side immutable NodeGroupClass the whole OS boundary, for Talos as well as Kairos, so the pool keeps only fields that mean the same thing on every OS and existing pools move onto Talos classes without rolling. It folds in the Kairos GPU guest image from the GPU in Kairos pools proposal (#101), and lists what is carried on top of the upstream Kairos provider and when it is dropped. Assisted-by: LLM Signed-off-by: Aleksei Sviridkin <f@lex.la>
Kairos worker pools exist as a draft pull request in cozystack/cozystack without a design proposal. This proposal states why a second worker OS is worth its cost for tenant pools and makes a hoster-side immutable NodeGroupClass the whole OS boundary, for Talos as well as Kairos, so the pool keeps only fields that mean the same thing on every OS and existing pools move onto Talos classes without rolling. It folds in the Kairos GPU guest image from the GPU in Kairos pools proposal (#101), and lists what is carried on top of the upstream Kairos provider and when it is dropped. Assisted-by: LLM Signed-off-by: Aleksei Sviridkin <f@lex.la>
Kairos worker pools exist as a draft pull request in cozystack/cozystack without a design proposal. This proposal states why a second worker OS is worth its cost for tenant pools and makes a hoster-side immutable NodeGroupClass the whole OS boundary, for Talos as well as Kairos, so the pool keeps only fields that mean the same thing on every OS and existing pools move onto Talos classes without rolling. It folds in the Kairos GPU guest image from the GPU in Kairos pools proposal (#101), and lists what is carried on top of the upstream Kairos provider and when it is dropped. The kubernetes-nodes-split proposal gets a pointer in two places that said no kubeadm path and no other backend would remain. Assisted-by: LLM Signed-off-by: Aleksei Sviridkin <f@lex.la>
Kairos worker pools exist as a draft pull request in cozystack/cozystack without a design proposal. This proposal states why a second worker OS is worth its cost for tenant pools and makes a hoster-side immutable NodeGroupClass the whole OS boundary, for Talos as well as Kairos, so the pool keeps only fields that mean the same thing on every OS and existing pools move onto Talos classes without rolling. It folds in the Kairos GPU guest image from the GPU in Kairos pools proposal (#101), and lists what is carried on top of the upstream Kairos provider and when it is dropped. The kubernetes-nodes-split proposal gets a pointer in two places that said no kubeadm path and no other backend would remain. Assisted-by: LLM Signed-off-by: Aleksei Sviridkin <f@lex.la>
Kairos worker pools exist as a draft pull request in cozystack/cozystack without a design proposal. This proposal states why a second worker OS is worth its cost for tenant pools and makes a hoster-side immutable NodeGroupClass the whole OS boundary, for Talos as well as Kairos, so the pool keeps only fields that mean the same thing on every OS and existing pools move onto Talos classes without rolling. It folds in the Kairos GPU guest image from the GPU in Kairos pools proposal (#101), and lists what is carried on top of the upstream Kairos provider and when it is dropped. The kubernetes-nodes-split proposal gets a pointer in two places that said no kubeadm path and no other backend would remain. Assisted-by: LLM Signed-off-by: Aleksei Sviridkin <f@lex.la>
Kairos worker pools exist as a draft pull request in cozystack/cozystack without a design proposal. This proposal states why a second worker OS is worth its cost for tenant pools and makes a hoster-side immutable NodeGroupClass the whole OS boundary, for Talos as well as Kairos, so the pool keeps only fields that mean the same thing on every OS and existing pools move onto Talos classes without rolling. It folds in the Kairos GPU guest image from the GPU in Kairos pools proposal (#101), and lists what is carried on top of the upstream Kairos provider and when it is dropped. The kubernetes-nodes-split proposal gets a pointer in two places that said no kubeadm path and no other backend would remain. Assisted-by: LLM Signed-off-by: Aleksei Sviridkin <f@lex.la>
Kairos worker pools exist as a draft pull request in cozystack/cozystack without a design proposal. This proposal states why a second worker OS is worth its cost for tenant pools and makes a hoster-side immutable NodeGroupClass the whole OS boundary, for Talos as well as Kairos, so the pool keeps only fields that mean the same thing on every OS and existing pools move onto Talos classes without rolling. It folds in the Kairos GPU guest image from the GPU in Kairos pools proposal (#101), and lists what is carried on top of the upstream Kairos provider and when it is dropped. The kubernetes-nodes-split proposal gets a pointer in two places that said no kubeadm path and no other backend would remain. Assisted-by: LLM Signed-off-by: Aleksei Sviridkin <f@lex.la>
Kairos worker pools exist as a draft pull request in cozystack/cozystack without a design proposal. This proposal states why a second worker OS is worth its cost for tenant pools and makes a hoster-side immutable NodeGroupClass the whole OS boundary, for Talos as well as Kairos, so the pool keeps only fields that mean the same thing on every OS and existing pools move onto Talos classes without rolling. It folds in the Kairos GPU guest image from the GPU in Kairos pools proposal (#101), and lists what is carried on top of the upstream Kairos provider and when it is dropped. The kubernetes-nodes-split proposal gets a pointer in two places that said no kubeadm path and no other backend would remain. Assisted-by: LLM Signed-off-by: Aleksei Sviridkin <f@lex.la>
Kairos worker pools exist as a draft pull request in cozystack/cozystack without a design proposal. This proposal states why a second worker OS is worth its cost for tenant pools and makes a hoster-side immutable NodeGroupClass the whole OS boundary, for Talos as well as Kairos, so the pool keeps only fields that mean the same thing on every OS and existing pools move onto Talos classes without rolling. It folds in the Kairos GPU guest image from the GPU in Kairos pools proposal (#101), and lists what is carried on top of the upstream Kairos provider and when it is dropped. The kubernetes-nodes-split proposal gets a pointer in two places that said no kubeadm path and no other backend would remain. Assisted-by: LLM Signed-off-by: Aleksei Sviridkin <f@lex.la>
Kairos worker pools exist as a draft pull request in cozystack/cozystack without a design proposal. This proposal states why a second worker OS is worth its cost for tenant pools and makes a hoster-side immutable NodeGroupClass the whole OS boundary, for Talos as well as Kairos, so the pool keeps only fields that mean the same thing on every OS and existing pools move onto Talos classes without rolling. It folds in the Kairos GPU guest image from the GPU in Kairos pools proposal (#101), and lists what is carried on top of the upstream Kairos provider and when it is dropped. The kubernetes-nodes-split proposal gets a pointer in two places that said no kubeadm path and no other backend would remain. Assisted-by: LLM Signed-off-by: Aleksei Sviridkin <f@lex.la>
Kairos worker pools exist as a draft pull request in cozystack/cozystack without a design proposal. This proposal states why a second worker OS is worth its cost for tenant pools and makes a hoster-side immutable NodeGroupClass the whole OS boundary, for Talos as well as Kairos, so the pool keeps only fields that mean the same thing on every OS and existing pools move onto Talos classes without rolling. It folds in the Kairos GPU guest image from the GPU in Kairos pools proposal (#101), and lists what is carried on top of the upstream Kairos provider and when it is dropped. The kubernetes-nodes-split proposal gets a pointer in two places that said no kubeadm path and no other backend would remain. Assisted-by: LLM Signed-off-by: Aleksei Sviridkin <f@lex.la>
Kairos worker pools exist as a draft pull request in cozystack/cozystack without a design proposal. This proposal states why a second worker OS is worth its cost for tenant pools and makes a hoster-side immutable NodeGroupClass the whole OS boundary, for Talos as well as Kairos, so the pool keeps only fields that mean the same thing on every OS and existing pools move onto Talos classes without rolling. It folds in the Kairos GPU guest image from the GPU in Kairos pools proposal (#101), and lists what is carried on top of the upstream Kairos provider and when it is dropped. The kubernetes-nodes-split proposal gets a pointer in two places that said no kubeadm path and no other backend would remain. Assisted-by: LLM Signed-off-by: Aleksei Sviridkin <f@lex.la>
Kairos worker pools exist as a draft pull request in cozystack/cozystack without a design proposal. This proposal states why a second worker OS is worth its cost for tenant pools and makes a hoster-side immutable NodeGroupClass the whole OS boundary, for Talos as well as Kairos, so the pool keeps only fields that mean the same thing on every OS and existing pools move onto Talos classes without rolling. It folds in the Kairos GPU guest image from the GPU in Kairos pools proposal (#101), and lists what is carried on top of the upstream Kairos provider and when it is dropped. The kubernetes-nodes-split proposal gets a pointer in two places that said no kubeadm path and no other backend would remain. Assisted-by: LLM Signed-off-by: Aleksei Sviridkin <f@lex.la>
Kairos worker pools exist as a draft pull request in cozystack/cozystack without a design proposal. This proposal states why a second worker OS is worth its cost for tenant pools and makes a hoster-side immutable NodeGroupClass the whole OS boundary, for Talos as well as Kairos, so the pool keeps only fields that mean the same thing on every OS and existing pools move onto Talos classes without rolling. It folds in the Kairos GPU guest image from the GPU in Kairos pools proposal (#101), and lists what is carried on top of the upstream Kairos provider and when it is dropped. The kubernetes-nodes-split proposal gets a pointer in two places that said no kubeadm path and no other backend would remain. Assisted-by: LLM Signed-off-by: Aleksei Sviridkin <f@lex.la>
Kairos worker pools exist as a draft pull request in cozystack/cozystack without a design proposal. This proposal states why a second worker OS is worth its cost for tenant pools and makes a hoster-side immutable NodeGroupClass the whole OS boundary, for Talos as well as Kairos, so the pool keeps only fields that mean the same thing on every OS and existing pools move onto Talos classes without rolling. It folds in the Kairos GPU guest image from the GPU in Kairos pools proposal (#101), and lists what is carried on top of the upstream Kairos provider and when it is dropped. The kubernetes-nodes-split proposal gets a pointer in two places that said no kubeadm path and no other backend would remain. Assisted-by: LLM Signed-off-by: Aleksei Sviridkin <f@lex.la>
Kairos worker pools exist as a draft pull request in cozystack/cozystack without a design proposal. This proposal states why a second worker OS is worth its cost for tenant pools and makes a hoster-side immutable NodeGroupClass the whole OS boundary, for Talos as well as Kairos, so the pool keeps only fields that mean the same thing on every OS and existing pools move onto Talos classes without rolling. It folds in the Kairos GPU guest image from the GPU in Kairos pools proposal (#101), and lists what is carried on top of the upstream Kairos provider and when it is dropped. The kubernetes-nodes-split proposal gets a pointer in two places that said no kubeadm path and no other backend would remain. Assisted-by: LLM Signed-off-by: Aleksei Sviridkin <f@lex.la>
Kairos worker pools exist as a draft pull request in cozystack/cozystack without a design proposal. This proposal states why a second worker OS is worth its cost for tenant pools and makes a hoster-side immutable NodeGroupClass the whole OS boundary, for Talos as well as Kairos, so the pool keeps only fields that mean the same thing on every OS and existing pools move onto Talos classes without rolling. It folds in the Kairos GPU guest image from the GPU in Kairos pools proposal (#101), and lists what is carried on top of the upstream Kairos provider and when it is dropped. The kubernetes-nodes-split proposal gets a pointer in two places that said no kubeadm path and no other backend would remain. Assisted-by: LLM Signed-off-by: Aleksei Sviridkin <f@lex.la>
Kairos worker pools exist as a draft pull request in cozystack/cozystack without a design proposal. This proposal states why a second worker OS is worth its cost for tenant pools and makes a hoster-side immutable NodeGroupClass the whole OS boundary, for Talos as well as Kairos, so the pool keeps only fields that mean the same thing on every OS and existing pools move onto Talos classes without rolling. It folds in the Kairos GPU guest image from the GPU in Kairos pools proposal (#101), and lists what is carried on top of the upstream Kairos provider and when it is dropped. The kubernetes-nodes-split proposal gets a pointer in two places that said no kubeadm path and no other backend would remain. Assisted-by: LLM Signed-off-by: Aleksei Sviridkin <f@lex.la>
Kairos worker pools exist as a draft pull request in cozystack/cozystack without a design proposal. This proposal states why a second worker OS is worth its cost for tenant pools and makes a hoster-side immutable NodeGroupClass the whole OS boundary, for Talos as well as Kairos, so the pool keeps only fields that mean the same thing on every OS and existing pools move onto Talos classes without rolling. It folds in the Kairos GPU guest image from the GPU in Kairos pools proposal (#101), and lists what is carried on top of the upstream Kairos provider and when it is dropped. The kubernetes-nodes-split proposal gets a pointer in two places that said no kubeadm path and no other backend would remain. Assisted-by: LLM Signed-off-by: Aleksei Sviridkin <f@lex.la>
Kairos worker pools exist as a draft pull request in cozystack/cozystack without a design proposal. This proposal states why a second worker OS is worth its cost for tenant pools and makes a hoster-side immutable NodeGroupClass the whole OS boundary, for Talos as well as Kairos, so the pool keeps only fields that mean the same thing on every OS and existing pools move onto Talos classes without rolling. It folds in the Kairos GPU guest image from the GPU in Kairos pools proposal (#101), and lists what is carried on top of the upstream Kairos provider and when it is dropped. The kubernetes-nodes-split proposal gets a pointer in two places that said no kubeadm path and no other backend would remain. Assisted-by: LLM Signed-off-by: Aleksei Sviridkin <f@lex.la>
Kairos worker pools exist as a draft pull request in cozystack/cozystack without a design proposal. This proposal states why a second worker OS is worth its cost for tenant pools and makes a hoster-side immutable NodeGroupClass the whole OS boundary, for Talos as well as Kairos, so the pool keeps only fields that mean the same thing on every OS and existing pools move onto Talos classes without rolling. It folds in the Kairos GPU guest image from the GPU in Kairos pools proposal (#101), and lists what is carried on top of the upstream Kairos provider and when it is dropped. The kubernetes-nodes-split proposal gets a pointer in two places that said no kubeadm path and no other backend would remain. Assisted-by: LLM Signed-off-by: Aleksei Sviridkin <f@lex.la>
Kairos worker pools exist as a draft pull request in cozystack/cozystack without a design proposal. This proposal states why a second worker OS is worth its cost for tenant pools and makes a hoster-side immutable NodeGroupClass the whole OS boundary, for Talos as well as Kairos, so the pool keeps only fields that mean the same thing on every OS and existing pools move onto Talos classes without rolling. It folds in the Kairos GPU guest image from the GPU in Kairos pools proposal (#101), and lists what is carried on top of the upstream Kairos provider and when it is dropped. The kubernetes-nodes-split proposal gets a pointer in two places that said no kubeadm path and no other backend would remain. Assisted-by: LLM Signed-off-by: Aleksei Sviridkin <f@lex.la>
Kairos worker pools exist as a draft pull request in cozystack/cozystack without a design proposal. This proposal states why a second worker OS is worth its cost for tenant pools and makes a hoster-side immutable NodeGroupClass the whole OS boundary, for Talos as well as Kairos, so the pool keeps only fields that mean the same thing on every OS and existing pools move onto Talos classes without rolling. It folds in the Kairos GPU guest image from the GPU in Kairos pools proposal (#101), and lists what is carried on top of the upstream Kairos provider and when it is dropped. The kubernetes-nodes-split proposal gets a pointer in two places that said no kubeadm path and no other backend would remain. Assisted-by: LLM Signed-off-by: Aleksei Sviridkin <f@lex.la>
Kairos worker pools exist as a draft pull request in cozystack/cozystack without a design proposal. This proposal states why a second worker OS is worth its cost for tenant pools and makes a hoster-side immutable NodeGroupClass the whole OS boundary, for Talos as well as Kairos, so the pool keeps only fields that mean the same thing on every OS and existing pools move onto Talos classes without rolling. It folds in the Kairos GPU guest image from the GPU in Kairos pools proposal (#101), and lists what is carried on top of the upstream Kairos provider and when it is dropped. The kubernetes-nodes-split proposal gets a pointer in two places that said no kubeadm path and no other backend would remain. Assisted-by: LLM Signed-off-by: Aleksei Sviridkin <f@lex.la>
Kairos worker pools exist as a draft pull request in cozystack/cozystack without a design proposal. This proposal states why a second worker OS is worth its cost for tenant pools and makes a hoster-side immutable NodeGroupClass the whole OS boundary, for Talos as well as Kairos, so the pool keeps only fields that mean the same thing on every OS and existing pools move onto Talos classes without rolling. It folds in the Kairos GPU guest image from the GPU in Kairos pools proposal (#101), and lists what is carried on top of the upstream Kairos provider and when it is dropped. The kubernetes-nodes-split proposal gets a pointer in two places that said no kubeadm path and no other backend would remain. Assisted-by: LLM Signed-off-by: Aleksei Sviridkin <f@lex.la>
Kairos worker pools exist as a draft pull request in cozystack/cozystack without a design proposal. This proposal states why a second worker OS is worth its cost for tenant pools and makes a hoster-side immutable NodeGroupClass the whole OS boundary, for Talos as well as Kairos, so the pool keeps only fields that mean the same thing on every OS and existing pools move onto Talos classes without rolling. It folds in the Kairos GPU guest image from the GPU in Kairos pools proposal (#101), and lists what is carried on top of the upstream Kairos provider and when it is dropped. The kubernetes-nodes-split proposal gets a pointer in two places that said no kubeadm path and no other backend would remain. Assisted-by: LLM Signed-off-by: Aleksei Sviridkin <f@lex.la>
Kairos worker pools exist as a draft pull request in cozystack/cozystack without a design proposal. This proposal states why a second worker OS is worth its cost for tenant pools and makes a hoster-side immutable NodeGroupClass the whole OS boundary, for Talos as well as Kairos, so the pool keeps only fields that mean the same thing on every OS and existing pools move onto Talos classes without rolling. It folds in the Kairos GPU guest image from the GPU in Kairos pools proposal (#101), and lists what is carried on top of the upstream Kairos provider and when it is dropped. The kubernetes-nodes-split proposal gets a pointer in two places that said no kubeadm path and no other backend would remain. Assisted-by: LLM Signed-off-by: Aleksei Sviridkin <f@lex.la>
Kairos worker pools exist as a draft pull request in cozystack/cozystack without a design proposal. This proposal states why a second worker OS is worth its cost for tenant pools and makes a hoster-side immutable NodeGroupClass the whole OS boundary, for Talos as well as Kairos, so the pool keeps only fields that mean the same thing on every OS and existing pools move onto Talos classes without rolling. It folds in the Kairos GPU guest image from the GPU in Kairos pools proposal (#101), and lists what is carried on top of the upstream Kairos provider and when it is dropped. The kubernetes-nodes-split proposal gets a pointer in two places that said no kubeadm path and no other backend would remain. Assisted-by: LLM Signed-off-by: Aleksei Sviridkin <f@lex.la>
Kairos worker pools exist as a draft pull request in cozystack/cozystack without a design proposal. This proposal states why a second worker OS is worth its cost for tenant pools and makes a hoster-side immutable NodeGroupClass the whole OS boundary, for Talos as well as Kairos, so the pool keeps only fields that mean the same thing on every OS and existing pools move onto Talos classes without rolling. It folds in the Kairos GPU guest image from the GPU in Kairos pools proposal (#101), and lists what is carried on top of the upstream Kairos provider and when it is dropped. The kubernetes-nodes-split proposal gets a pointer in two places that said no kubeadm path and no other backend would remain. Assisted-by: LLM Signed-off-by: Aleksei Sviridkin <f@lex.la>
Kairos worker pools exist as a draft pull request in cozystack/cozystack without a design proposal. This proposal states why a second worker OS is worth its cost for tenant pools and makes a hoster-side immutable NodeGroupClass the whole OS boundary, for Talos as well as Kairos, so the pool keeps only fields that mean the same thing on every OS and existing pools move onto Talos classes without rolling. It folds in the Kairos GPU guest image from the GPU in Kairos pools proposal (#101), and lists what is carried on top of the upstream Kairos provider and when it is dropped. The kubernetes-nodes-split proposal gets a pointer in two places that said no kubeadm path and no other backend would remain. Assisted-by: LLM Signed-off-by: Aleksei Sviridkin <f@lex.la>
Design proposal for GPUs in Kairos worker pools of tenant Kubernetes clusters, in vGPU mode and in whole-GPU passthrough. Cozystack cannot ship the NVIDIA vGPU guest driver, since it is licensed per customer and may not be published, for example in a public image or repository. So the proposal adds an extension point instead of a driver. Cozystack ships a build recipe that layers a hoster-supplied driver
.runonto the platform Kairos worker image, one image per mode. The hoster names those images in platform values, together with the vGPU license Secret and, when needed, registry credentials and a CA. A Kairos pool then boots the image of its mode, and vGPU pools get the license files.This proposal is implemented after GPUDevice (#99), one of two related proposals. Kairos pools take GPUs only through GPUDevice's
deviceSelectorordeviceTemplate, never through raw resource names. vGPU is allowed only for tenants whose GPUDevicegpu.vgpuflag holds. The hoster sets that flag on top-level tenants and each parent tenant on its children, and it holds only when it also holds on the parent. GPUDevice also owns the host layer and usage records of allocated GPUs (model, count, owner) that an external billing system reads. GPU virtual machines (#100) covers tenant virtual machines. Existing Talos GPU pools are left as they are.It builds on Kairos pools in
kubernetes-nodes, from cozystack/cozystack#4911 (draft). Their bootstrap provider needs Cluster API 1.13.4 or newer, and cozystack/cozystack#4902 moves Cozystack's Cluster API to v1.13.7.What is verified and what is not:
KairosConfigfileshas nocontentFromat b19dd350e84a, so the token needs either an upstream change or a Cozystack-side substitution (Design §3).nvidia-ctkthrough a boot-time link; whether HAMi works on these pools. All of these are listed under Open questions.I would like review mainly on the per-mode images and why the pool states its mode in
kairos.gpuModeinstead of taking it from the device class (§2, §3), on the token path and rotation (§3, §5), and on where the hoster setting lives (§2).Before review
decisions/directory, or says below why none is needed.This is a new proposal and revises none.
DCO
git commit --signoff).