Skip to content

feature(cluster): Add VULTR vke as an inference cluster provider - #370

Open
haarchri wants to merge 1 commit into
modelplaneai:mainfrom
haarchri:feature/vultr
Open

feature(cluster): Add VULTR vke as an inference cluster provider#370
haarchri wants to merge 1 commit into
modelplaneai:mainfrom
haarchri:feature/vultr

Conversation

@haarchri

Copy link
Copy Markdown
Contributor

Description of your changes

Modelplane can provision inference clusters on GKE, EKS, AKS, and Nebius; Vultr was listed as Planned on the providers page. This adds Vultr VKE as a fifth provisioned cluster source, built on the xpkg.upbound.io/upbound/provider-vultr provider.

An InferenceCluster with source: Vultr composes a new VultrCluster XR, served by the new compose-vultr-cluster function. The VKE cluster carries a fixed inline system pool for control-plane components; each user GPU pool becomes a separate VkeNodePool managed resource gated on cluster readiness, so pools can be added, resized, or removed without touching the cluster. InferenceClass gains a vultr provisioning block. Vultr sizes nodes by plan (e.g. vcg-l40s-16c-180g-48vram for 1x L40S), so the block is just plan plus accelerator.

Two things VKE ships built in shape the composition. Vultr pre-installs the NVIDIA GPU Operator on GPU clusters, so rather than composing a GPU stack, VultrCluster gates its readiness on an Observe-only Object with a CEL query over the nvidia-operator-validator DaemonSet, the cluster only reports Ready once the GPU stack is validated and nvidia.com/gpu is advertised, and the serving stack never starts before that. The Vultr CSI driver likewise installs the vultr-vfs-storage RWX StorageClass (Vultr File System) on every cluster, and node autoscaling is served by VKE itself, so no CSI driver, StorageClass, or in-cluster autoscaler is composed.

Known limitation:

  • ZCK-83ZNQ: Vultr File System does not currently work on GPU node pools, no VFS fabric is available for the GPU plans, so the vultr-vfs-storage RWX class can't be mounted on GPU nodes and the shared model-weights cache is effectively unavailable there until Vultr enables it. VFS is also not available in every region, which the docs note
  • UED-84YHJ: fabric networking is not available for GPU nodes either, so there is no high-bandwidth interconnect for multi-node serving. Serving is therefore limited to single-node GPU instances#
  • YTM-97SIL: VKE does not support VPC-only clusters (the vpc_only flag fails cluster creation with Error 500), so nodes keep public network interfaces; a VPC can be attached but not made the only network

Fixes #305

I have:

  • Read and followed Modelplane's contribution process.
  • Run nix flake check (or ./nix.sh flake check) and made sure it passes.
  • Added or updated tests covering any composition function changes.
  • Signed off every commit with git commit -s.

Tested

Validated end to end: a single-node L40S GPU pool provisions, passes the GPU readiness gate, and serves a model.

  • Create ProviderConfig + Secret
apiVersion: v1
kind: Secret
metadata:
  name: vultr-credentials
  namespace: crossplane-system
type: Opaque
stringData:
  api-key: ${VULTR_API_KEX}
---
apiVersion: vultr.crossplane.io/v1alpha1
kind: ClusterProviderConfig
metadata:
  name: default
spec:
  credentials:
    source: Secret
    secretRef:
      namespace: crossplane-system
      name: vultr-credentials
      key: api-key
  • Create Modelplane Manifests:
---
apiVersion: modelplane.ai/v1alpha1
kind: InferenceGateway
metadata:
  name: default
  namespace: crossplane-system
spec:
  backend: Traefik
  traefik:
    version: "40.2.0"
    loadBalancer: MetalLB
    metallb:
      addressPool: "172.18.255.200-172.18.255.250"
---
apiVersion: modelplane.ai/v1alpha1
kind: InferenceClass
metadata:
  name: a16-1x
  namespace: crossplane-system
spec:
  description: "Vultr vcg-a16-6c-64g-16vram, NVIDIA A16 16GB"
  provisioning:
    provider: Vultr
    vultr:
      plan: vcg-a16-6c-64g-16vram
      accelerator:
        type: nvidia-a16
        count: 1
  devices:
  - name: gpu
    claim: DRA
    driver: gpu.nvidia.com
    deviceClassName: gpu.nvidia.com
    count: 1
    attributes:
      architecture: { string: Ampere }
      cudaComputeCapability: { version: "8.6.0" }
    capacity:
      memory: { value: "16384Mi" }
---
apiVersion: modelplane.ai/v1alpha1
kind: InferenceCluster
metadata:
  name: vultr-demo
  namespace: crossplane-system
  labels:
    modelplane.ai/region: ewr
spec:
  cluster:
    source: Vultr
    vultr:
      region: ewr
  nodePools:
  - name: gpu-a16
    className: a16-1x
    nodeCount: 1
    minNodeCount: 1
    maxNodeCount: 1
---
apiVersion: v1
kind: Namespace
metadata:
  name: ml-team
---
apiVersion: modelplane.ai/v1alpha1
kind: ModelDeployment
metadata:
  name: qwen-7b
  namespace: ml-team
spec:
  replicas: 1
  template:
    spec:
      engines:
      - name: qwen-7b
        members:
        - role: Standalone
          nodeSelector:
            devices:
            - name: gpu
              count: 1
              selectors:
              - cel: |
                  device.capacity["gpu.nvidia.com"].memory.compareTo(quantity("14Gi")) >= 0
          template:
            spec:
              containers:
              - name: engine
                image: vllm/vllm-openai:v0.9.2
                args:
                - --model=Qwen/Qwen2.5-7B-Instruct-AWQ
                - --served-model-name=qwen-7b
                - --max-model-len=8192
                - --gpu-memory-utilization=0.85
                - --enforce-eager
---
apiVersion: modelplane.ai/v1alpha1
kind: ModelService
metadata:
  name: qwen-7b
  namespace: ml-team
spec:
  endpoints:
  - selector:
      matchLabels:
        modelplane.ai/deployment: qwen-7b
  • Tested Model + ModelEndpoint:
{"id":"chatcmpl-5f3c5820-b281-4872-8ed0-9137b2890359","object":"chat.completion","created":1785133519,"model":"qwen-7b","choices":[{"index":0,"message":{"role":"assistant","reasoning_content":null,"content":"Hello from Vultr! It's nice to meet you. Vultr is a cloud computing platform that offers flexible and affordable virtual server instances. How can I assist you today with regards to Vultr or cloud computing in general?","tool_calls":[]},"logprobs":null,"finish_reason":"stop","stop_reason":null}],"usage":{"prompt_tokens":35,"total_tokens":81,"completion_tokens":46,"prompt_tokens_details":null},"prompt_logprobs":null,"kv_transfer_params":null}

Signed-off-by: Christopher Haar <christopher.haar@upbound.io>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Support Vultr (VKE) for cluster provisioning

1 participant