Repository navigation
Conversation
|
Docs preview: https://modelplane-docs-pr-594.vercel.app (ready once the site's Content workflow finishes) |
dennis-upbound
left a comment
There was a problem hiding this comment.
compose-upcloud-cluster: removing spec.autoscaler orphans a running autoscaler (should-fix)
The ProviderConfigs, the token Object and the Release are composed only while spec.autoscaler is set. When a user turns their last autoscaled pool into a fixed pool and drops autoscaler (which the CEL rule then allows), all three leave desired state. The Release and Object exclude Delete. The autoscaler keeps running with its old group list, and its node counts fight the nodeCount Crossplane now enforces on those pools. compose_cluster_autoscaler's docstring already handles this for the last pool going fixed. Composing the sub-block when spec.autoscaler or "release-cluster-autoscaler" in observed would cover this case the same way, with an empty group list.
Pool named system (should-fix)
On this one I'd reserve the name with CEL. The PR body says the other clouds can't hit it, but EKS and Nebius key their groups nodegroup-{name} next to nodegroup-system, and GKE uses nodepool-system, so they have the same collision. One rule on InferenceCluster spec.nodePools[].name would cover every cloud. Here the external name is also system, so a declared system pool would take over the system group in UKS as well.
Merge order with #556 (FYI)
_node_pool and compose_upcloud_cluster hard-code role="GPU". Once #556 merges, UpCloud needs the same changes the other six clouds got there: the role derived from accelerator, draDrivers tags on its stack and CPU pools.
Before ready: the checklist is unchecked, and Tested has no live UKS run yet (the e2e-clouds (upcloud) leg is KWOK).
|
found one issue in the e2e run: UpCloudLtd/upcloud-cloud-controller-manager#14 |
|
because of the LB issue - i updated the code to set annotations to override the default behaviour until UpCloudLtd/upcloud-cloud-controller-manager#3 gets shipped, disk size configurable like the other clouds because the default is to low for models and added dcgm exporter |
Signed-off-by: Christopher Haar <christopher.haar@upbound.io>
Modelplane can't provision clusters on UpCloud. This adds a namespaced UpCloudCluster XR and a compose-upcloud-cluster function that provision a UKS cluster on a dedicated SDN network, with a fixed system node group and a KubernetesNodeGroup per user pool. UKS has no inline pools, so unlike Civo and Vultr the system pool is its own Ready-gated node group. KubernetesNodeGroup has no name field, so the function pins each group's external name to its pool name, keeping UKS node group names deterministic. The UKS kubeconfig embeds static client certificates, so the connection secret alone reaches the cluster. fetchKubeconfig must be true or the provider publishes no kubeconfig at all. UKS has no server-side autoscaler and the cluster autoscaler's UpCloud cloud provider is an unmerged upstream PR (kubernetes/autoscaler#10234), so pools with maxNodeCount are scaled by UpCloud's fork image installed through the upstream chart. UpCloud provisions no API credentials on the cluster, so spec.autoscaler names a token Secret that an Object copies to kube-system, resolved server-side through patchesFrom so the token never passes through the function. The newest fork image is built for Kubernetes 1.29, older than any UKS version this XR provisions; it talks to the UpCloud API rather than version-skewed Kubernetes APIs, but the skew is outside the autoscaler's support policy. No ModelCache storage is composed: UpCloud File Storage is managed NFS without a CSI driver, so it only supports statically provisioned volumes. Signed-off-by: Christopher Haar <christopher.haar@upbound.io>
An InferenceCluster could not be provisioned on UpCloud. This wires the new UpCloudCluster XR into the platform: source: UpCloud on InferenceCluster (zone, version, credentials and the autoscaler's token Secret), an upcloud provisioning block on InferenceClass naming the GPU server plan, and a hand-written UpCloud serving-stack half. UKS GPU node images ship the NVIDIA driver and container toolkit at the default root, so the half matches Nebius's shape: NFD and the DRA driver, no GPU Operator. With no operator there is no DCGM exporter either, so the modelplane_gpu_* and energy series are empty on UpCloud, the same gap Nebius has. The UKS kubeconfig embeds static client certificates, so the ClusterProviderConfig carries no identity. No cache StorageClass is relayed: UpCloud File Storage is NFS without a CSI driver. Fabric is not mapped; UKS has no EFA or InfiniBand analog. A CEL rule requires the upcloud.autoscaler Secret reference when a pool sets maxNodeCount, failing at admission rather than on the composed UpCloudCluster's own validation, where the user wouldn't see it. The upcloud e2e leg fakes GPU nodes the way compose-upcloud-cluster shapes them and audits the stack's placement on them. Signed-off-by: Christopher Haar <christopher.haar@upbound.io>
UpCloud wasn't in the providers table or any of the provisioning docs. This adds the UKS row and tabs across the platform and getting-started pages, the UpCloud manifests they embed, and the API-reference example. The getting-started path includes a model deployment, which the other recent clouds still lack. The docs state what UpCloud doesn't support: no ModelCache (File Storage is NFS without a CSI driver, so only static volumes), no fabric, no GPU metrics (no GPU Operator, so no DCGM exporter), and GPU plans in fi-hel2 only with account-gated quota. Pools with maxNodeCount need the autoscaler token Secret, which the concepts manifest shows how to create. Signed-off-by: Christopher Haar <christopher.haar@upbound.io>
Signed-off-by: Christopher Haar <christopher.haar@upbound.io>
Signed-off-by: Christopher Haar <christopher.haar@upbound.io>
Signed-off-by: Christopher Haar <christopher.haar@upbound.io>
Signed-off-by: Christopher Haar <christopher.haar@upbound.io>
04b6b69 to
1cb4fe7
Compare
Description of your changes
Modelplane couldn't provision clusters on UpCloud. This adds source: UpCloud to InferenceCluster, backed by a new namespaced UpCloudCluster XR and a compose-upcloud-cluster function on crossplane-contrib/provider-upcloud v1.0.2. An UpCloudCluster provisions a UKS cluster on a dedicated SDN network (UKS requires one per cluster, DHCP on, default route off), a fixed system node group, and one KubernetesNodeGroup per pool. UKS has no inline pools, so unlike Civo and Vultr the system pool is itself a Ready-gated composed resource, and KubernetesNodeGroup has no name field, so each group's external name is pinned to its pool name to keep UKS node group names deterministic.
The cloud-specific decisions, and why:
Known rough edge: a pool named system on an UpCloudCluster silently replaces the injected system node group (they share the node-pool-system composition key). The other clouds can't hit this because their system pools are inline on the cluster resource. Left unguarded for now; worth deciding in review whether a CEL reservation is wanted.
No breaking changes; UpCloud is additive to the source, provider and cloud enums.
Validation: nix flake check passes (unit tests for compose-upcloud-cluster, compose-inference-cluster and compose-serving-stack, type checks, docs-manifest validation, Vale).
Fixes #
I have:
nix flake check(or./nix.sh flake check) and made sure it passes.git commit -s.Tested