Skip to content

Provision Vultr bare metal servers into k3s inference clusters, composing multi-vendor GPU serving stacks - #434

Open
haarchri wants to merge 1 commit into
modelplaneai:mainfrom
haarchri:feature/baremetal-amd
Open

haarchri wants to merge 1 commit into
modelplaneai:mainfrom
haarchri:feature/baremetal-amd

Conversation

@haarchri

@haarchri haarchri commented Sep 8, 2026 •

Copy link
Copy Markdown
Collaborator

Description of your changes

Design: #432

Vultr' biggest GPUs (8x MI355X/MI325X) are bare metal plans with no managedKubernetes in front, and Modelplane could neither provision metal nor install an AMD GPU stack.

A new K3sCluster XR turns machines into a cluster: it installs a k3s server on the control plane machine and joins workers as agents over SSH via provider-k3s, publishing the kubeconfig through the same status.secrets contract as the other cluster XRs. A VultrBaremetalCluster XR provisions theservers on top, one CPU-only management server plus the GPU pools, SSH key registration, and cloud-init opening the k3s ports (Vultrs Ubuntu images
firewall everything but SSH) and composes the K3sCluster from their IPs. pools are fixed size and only the Standard stack is supported :)

InferenceCluster gains a VultrBaremetal source with an activation policy covering the Vultr bare metal and k3s provider kinds.

The serving stack implements the multi-accelerator design (#432): the VultrBaremetal component list carries both the AMD GPU operator (DRA mode) and the NVIDIA operator + DRA driver, vendor-tagged and filtered by the accelerators the InferenceClasses name. Unsupported class/cloud pairings fail early with UnsupportedDevices conditions.

Validated end to end on Vultr with a vbm-256c-3072gb-8-mi325x-gpu plan (8x MI325X): servers provisioned, k3s v1.34.11 installed over SSH, the worker joined with pool labels and vendor taint, the serving stack installed, the AMD
DRA driver published ResourceSlices (8 devices, 262128Mi each), and a vLLM engine (rocm/vllm, CDNA build) served a chat completion through the gateway with the GPU bound via a DRA claim. That run is recorded as the Qwen2.5-0.5B recipe, the first AMD entry in the catalog - with the exact manifests from the run.

Deliberately not surfaced as a quickstart: bare metal GPU plans bill thousands of dollars per month, are region-gated, and are often out of stock (MI355X currently has no deployable locations at all), so the flow ships as examples/vultr-baremetal plus the recipe rather than a getting-started path.

The management server is a single k3s server and the data plane rides public IPs...

curl -v "http://207.148.15.31/v1/chat/completions" \
  -H "Content-Type: application/json" \
  -d "{\"model\":\"ml-team/qwen\",\"messages\":[{\"role\":\"user\",\"content\":\"Say Hello from VULTR Baremetal K3S with AMD GPU ServingStack \"}],\"max_tokens\":100}"
{"id":"chatcmpl-4cbd10fe-697f-4712-b24b-4edf39dfa069","object":"chat.completion","created":1790793716,"model":"ml-team/qwen-demo","choices":[{"index":0,"message":{"role":"assistant","content":"Hello! It looks like you're looking to set up a machine learning model using a bare metal K3s instance on the VULTR server. Here’s how you can do it:\n\n1. **Install VULTR**: First, ensure that your VULTR account is active and connected.\n\n2. **Create an Instance**: Use the AWS Management Console or the AWS CLI to create a new EC2 instance. Choose the appropriate AMI for your needs (e.g., Ubuntu Server 2","refusal":null,"annotations":null,"audio":null,"function_call":null,"tool_calls":[],"reasoning":null},"logprobs":null,"finish_reason":"length","stop_reason":null,"token_ids":null,"routed_experts":null}],"service_tier":null,"system_fingerprint":"vllm-0.23.1.dev1+g9ddef7117.d20260901-ebed204f","usage":{"prompt_tokens":46,"total_tokens":146,"completion_tokens":100,"prompt_tokens_details":null},"prompt_logprobs":null,"prompt_token_ids":null,"prompt_text":null,"kv_transfer_params":null}

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:

apiVersion: modelplane.ai/v1alpha1
kind: InferenceClass
metadata:
  name: vultr-mi325x-8x
spec:
  description: "Vultr vbm-256c-3072gb-8-mi325x-gpu, 8x AMD Instinct MI325X 256GB"
  provisioning:
    provider: VultrBaremetal
    vultrBaremetal:
      plan: vbm-256c-3072gb-8-mi325x-gpu
      accelerator:
        type: amd-mi325x
        count: 8
  devices:
  - name: gpu
    claim: DRA
    driver: gpu.amd.com
    deviceClassName: gpu.amd.com
    count: 8
    attributes:
      productName: { string: AMD_Instinct_MI325_OAM }
    capacity:
      # The MI325X's usable HBM3e as the AMD DRA driver's ResourceSlices
      # report it, not its nominal 256GB.
      memory: { value: "262128Mi" }
apiVersion: modelplane.ai/v1alpha1
kind: InferenceCluster
metadata:
  name: vultr-baremetal-ord
  labels:
    modelplane.ai/region: ord
spec:
  cluster:
    source: VultrBaremetal
    vultrBaremetal:
      region: ord
      ssh:
        secretRef:
          name: vultr-baremetal-ssh
  nodePools:
    - name: gpu-mi325x
      className: vultr-mi325x-8x
      nodeCount: 1
apiVersion: modelplane.ai/v1alpha1
kind: InferenceGateway
metadata:
  name: public
spec:
  clusterName: vultr-baremetal-ord
apiVersion: modelplane.ai/v1alpha1
kind: ModelDeployment
metadata:
  name: qwen-demo
  namespace: ml-team
spec:
  replicas: 1
  template:
    spec:
      engines:
      - name: qwen
        members:
        - role: Standalone
          nodeSelector:
            devices:
            - name: gpu
              count: 1
              selectors:
              - cel: |
                  device.capacity["gpu.amd.com"].memory.compareTo(quantity("200Gi")) >= 0
          template:
            spec:
              containers:
              - name: engine
                image: rocm/vllm:rocm7.14.1_cdna_ubuntu24.04_py3.14_pytorch_2.11_vllm_0.23.0
                command: ["vllm", "serve", "Qwen/Qwen2.5-0.5B-Instruct"]
                args:
                - --served-model-name=$(MODELPLANE_SERVED_MODEL_NAME)
apiVersion: modelplane.ai/v1alpha1
kind: ModelService
metadata:
  name: qwen
  namespace: ml-team
spec:
  endpoints:
  - name: qwen-demo
    selector:
      matchLabels:
        modelplane.ai/deployment: qwen-demo
apiVersion: v1
kind: Secret
metadata:
  name: vultr-credentials
  namespace: crossplane-system
type: Opaque
stringData:
  api-key: |
    {
      "api_key": "$API-KEY"
    }
---
apiVersion: v1
kind: Secret
metadata:
  name: vultr-baremetal-ssh
  namespace: modelplane-system
type: Opaque
stringData:
  ssh-privatekey: |
    -----BEGIN OPENSSH PRIVATE KEY-----
    xxxxx
    -----END OPENSSH PRIVATE KEY-----
  ssh-publickey: "ssh-ed25519 xxxxxxxxxx
crossplane resource trace inferencecluster.modelplane.ai/vultr-baremetal-ord 
NAME                                                                                             SYNCED   READY   STATUS
InferenceCluster/vultr-baremetal-ord                                                             True     True    Available
├─ ManagedResourceActivationPolicy/vultr-baremetal-ord-98f5d082e5a4                              -        -       
├─ ServingStack/vultr-baremetal-ord-serving-stack-3604d (modelplane-system)                      True     True    Available
│  ├─ ProviderConfig/vultr-baremetal-ord-serving-stack-3604d-cluster-7ac80 (modelplane-system)   -        -       
│  ├─ Release/vultr-baremetal-ord-3c6762842bdc (modelplane-system)                               True     True    Available
│  ├─ Release/vultr-baremetal-ord-821903150775 (modelplane-system)                               True     True    Available
│  ├─ Release/vultr-baremetal-ord-a892d9117b25 (modelplane-system)                               True     True    Available
│  ├─ Release/vultr-baremetal-ord-ac134857be20 (modelplane-system)                               True     True    Available
│  ├─ Release/vultr-baremetal-ord-bc127917fad2 (modelplane-system)                               True     True    Available
│  ├─ Release/vultr-baremetal-ord-cb180be2f2e9 (modelplane-system)                               True     True    Available
│  ├─ Release/vultr-baremetal-ord-cda3a0dfbbc7 (modelplane-system)                               True     True    Available
│  ├─ Release/vultr-baremetal-ord-d4abc901dd9b (modelplane-system)                               True     True    Available
│  ├─ Release/vultr-baremetal-ord-da14c62b2d01 (modelplane-system)                               True     True    Available
│  ├─ Object/vultr-baremetal-ord-0301ae461fb6 (modelplane-system)                                True     True    Available
│  ├─ Object/vultr-baremetal-ord-0fb86ab79e97 (modelplane-system)                                True     True    Available
│  ├─ Object/vultr-baremetal-ord-25d98d4fefb0 (modelplane-system)                                True     True    Available
│  ├─ Object/vultr-baremetal-ord-3c28b60f9269 (modelplane-system)                                True     True    Available
│  ├─ Object/vultr-baremetal-ord-4798d1a3f3c1 (modelplane-system)                                True     True    Available
│  ├─ Object/vultr-baremetal-ord-641e4a693f53 (modelplane-system)                                True     True    Available
│  ├─ Object/vultr-baremetal-ord-76e802791b82 (modelplane-system)                                True     True    Available
│  ├─ Object/vultr-baremetal-ord-7a6489303e2b (modelplane-system)                                True     True    Available
│  ├─ Object/vultr-baremetal-ord-8586e3059c3a (modelplane-system)                                True     True    Available
│  ├─ Object/vultr-baremetal-ord-9a1dc112be0b (modelplane-system)                                True     True    Available
│  ├─ Object/vultr-baremetal-ord-b4beb3225bdf (modelplane-system)                                True     True    Available
│  ├─ Object/vultr-baremetal-ord-df8ccc7f25b4 (modelplane-system)                                True     True    Available
│  ├─ ProviderConfig/vultr-baremetal-ord-serving-stack-3604d-cluster-7ac80 (modelplane-system)   -        -       
│  ├─ Usage/vultr-baremetal-ord-0553f71a1b91 (modelplane-system)                                 -        True    Available
│  ├─ Usage/vultr-baremetal-ord-08f4b6692454 (modelplane-system)                                 -        True    Available
│  ├─ Usage/vultr-baremetal-ord-18259c96072d (modelplane-system)                                 -        True    Available
│  ├─ Usage/vultr-baremetal-ord-1b63af3f990d (modelplane-system)                                 -        True    Available
│  ├─ Usage/vultr-baremetal-ord-303ab45bdd70 (modelplane-system)                                 -        True    Available
│  ├─ Usage/vultr-baremetal-ord-35f0e43e044d (modelplane-system)                                 -        True    Available
│  ├─ Usage/vultr-baremetal-ord-3b07734cf272 (modelplane-system)                                 -        True    Available
│  ├─ Usage/vultr-baremetal-ord-3b88f7eaef6e (modelplane-system)                                 -        True    Available
│  ├─ Usage/vultr-baremetal-ord-5c032a5bf099 (modelplane-system)                                 -        True    Available
│  ├─ Usage/vultr-baremetal-ord-83ccb8556963 (modelplane-system)                                 -        True    Available
│  ├─ Usage/vultr-baremetal-ord-84a8229655d4 (modelplane-system)                                 -        True    Available
│  ├─ Usage/vultr-baremetal-ord-8713b10fa533 (modelplane-system)                                 -        True    Available
│  ├─ Usage/vultr-baremetal-ord-8a03c83642f4 (modelplane-system)                                 -        True    Available
│  ├─ Usage/vultr-baremetal-ord-96ac51ba2439 (modelplane-system)                                 -        True    Available
│  ├─ Usage/vultr-baremetal-ord-96c0718b70e4 (modelplane-system)                                 -        True    Available
│  ├─ Usage/vultr-baremetal-ord-a77d7b4935c1 (modelplane-system)                                 -        True    Available
│  ├─ Usage/vultr-baremetal-ord-a79e92655ef6 (modelplane-system)                                 -        True    Available
│  ├─ Usage/vultr-baremetal-ord-ac2f578a3580 (modelplane-system)                                 -        True    Available
│  ├─ Usage/vultr-baremetal-ord-ad08288957bb (modelplane-system)                                 -        True    Available
│  ├─ Usage/vultr-baremetal-ord-b2805c569900 (modelplane-system)                                 -        True    Available
│  ├─ Usage/vultr-baremetal-ord-bb83f3ac3d3f (modelplane-system)                                 -        True    Available
│  ├─ Usage/vultr-baremetal-ord-cdc2d630e78d (modelplane-system)                                 -        True    Available
│  ├─ Usage/vultr-baremetal-ord-d51706a516ab (modelplane-system)                                 -        True    Available
│  ├─ Usage/vultr-baremetal-ord-da3a3f1966ad (modelplane-system)                                 -        True    Available
│  ├─ Usage/vultr-baremetal-ord-e0f7617ad17d (modelplane-system)                                 -        True    Available
│  ├─ Usage/vultr-baremetal-ord-f08f1b650d00 (modelplane-system)                                 -        True    Available
│  ├─ Usage/vultr-baremetal-ord-f140e934617a (modelplane-system)                                 -        True    Available
│  ├─ Usage/vultr-baremetal-ord-f148644110e7 (modelplane-system)                                 -        True    Available
│  ├─ Usage/vultr-baremetal-ord-f3e7644d6b35 (modelplane-system)                                 -        True    Available
│  └─ Usage/vultr-baremetal-ord-f4aa889ce324 (modelplane-system)                                 -        True    Available
├─ VultrBaremetalCluster/vultr-baremetal-ord (modelplane-system)                                 True     True    Available
│  ├─ BareMetalServer/vultr-baremetal-ord-953725a9a5c3 (modelplane-system)                       True     True    Available
│  ├─ BareMetalServer/vultr-baremetal-ord-faeb4f8a887b (modelplane-system)                       True     True    Available
│  ├─ SSHKey/vultr-baremetal-ord-7da2e045a596 (modelplane-system)                                True     True    Available
│  └─ K3sCluster/vultr-baremetal-ord-04557430c1c7 (modelplane-system)                            True     True    Available
│     ├─ Cluster/vultr-baremetal-ord-04557430c1c7-cluster-2ef24 (modelplane-system)              True     True    Available
│     ├─ Node/vultr-baremetal-ord-ff03290b54ef (modelplane-system)                               True     True    Available
│     └─ ProviderConfig/vultr-baremetal-ord-04557430c1c7-ssh-25bd3 (modelplane-system)           -        -       
├─ ClusterProviderConfig/vultr-baremetal-ord-cluster-kubeconfig-8631e                            -        -       
└─ Usage/vultr-baremetal-ord-3e48807f29ad (modelplane-system)                                    -        True    Available
KUBECONFIG=VULTR.txt kubectl get pods -A                                                                    
NAMESPACE                 NAME                                                              READY   STATUS    RESTARTS      AGE
cert-manager              mp-cert-manager-85f77f9bcd-jx8v4                                  1/1     Running   0             24m
cert-manager              mp-cert-manager-cainjector-fb4495f54-n7l55                        1/1     Running   0             24m
cert-manager              mp-cert-manager-webhook-d74ff9c5f-zdkx8                           1/1     Running   0             24m
envoy-ai-gateway-system   ai-gateway-controller-54576b4fbc-9dqrx                            1/1     Running   4 (23m ago)   24m
envoy-gateway-system      envoy-gateway-7589b7685b-z8lwv                                    1/1     Running   0             22m
envoy-gateway-system      envoy-modelplane-system-cluster-gateway-b26a0919-f9cc6df69fx4b7   2/2     Running   0             18m
envoy-gateway-system      envoy-modelplane-system-inference-gateway-5dbfd6c0-79cf4955cnqz   3/3     Running   0             4m6s
envoy-gateway-system      envoy-modelplane-system-inference-gateway-5dbfd6c0-79cf495kddmx   3/3     Running   0             3m55s
kube-amd-gpu              default-dra-driver-wsxv2                                          1/1     Running   0             9m56s
kube-amd-gpu              default-metrics-exporter-42kht                                    1/1     Running   0             9m56s
kube-amd-gpu              default-node-labeller-bs7cx                                       1/1     Running   0             12m
kube-amd-gpu              mp-gpu-operator-charts-controller-manager-58c4f8969f-lztzb        1/1     Running   0             22m
kube-amd-gpu              mp-gpu-operator-charts-kmm-controller-889d84758-4m5wd             1/1     Running   0             22m
kube-amd-gpu              mp-gpu-operator-charts-kmm-webhook-server-78b4c5944f-pmkk5        1/1     Running   0             22m
kube-system               coredns-fddcf74bb-gzm77                                           1/1     Running   0             24m
kube-system               local-path-provisioner-67d6887d65-hf5mg                           1/1     Running   0             24m
kube-system               metrics-server-74c8c4d68b-l4l7n                                   1/1     Running   0             24m
kube-system               svclb-envoy-modelplane-system-cluster-gateway-b26a0919-903cdvdw   1/1     Running   0             18m
kube-system               svclb-envoy-modelplane-system-cluster-gateway-b26a0919-903g56sk   1/1     Running   0             12m
kube-system               svclb-envoy-modelplane-system-inference-gateway-5dbfd6-89c5fgp9   1/1     Running   0             12m
kube-system               svclb-envoy-modelplane-system-inference-gateway-5dbfd6-89cvmpn5   1/1     Running   0             18m
lws-system                mp-lws-controller-manager-7647567d44-jzjd7                        1/1     Running   0             24m
modelplane-system         trust-manager-6c87d5f84d-jnkpv                                    1/1     Running   0             22m
monitoring                mp-kube-prometheus-stack-kube-state-metrics-fcffd8864-n9nrp       1/1     Running   0             23m
monitoring                mp-kube-prometheus-stack-prometheus-node-exporter-2kt59           1/1     Running   0             23m
monitoring                mp-kube-prometheus-stack-prometheus-node-exporter-gnpx8           1/1     Running   0             23m
monitoring                prometheus-operator-864dd4647c-ktpdv                              1/1     Running   0             23m
monitoring                prometheus-prometheus-prometheus-0                                2/2     Running   0             23m
mp-ml-team-51733          qwen-demo-8f4f6-epp-6fb7699648-mjxfw                              1/1     Running   0             18m
mp-ml-team-51733          qwen-demo-8f4f6-qwen-1d9a7-544587cb94-cv6t7                       1/1     Running   0             18m
node-feature-discovery    mp-node-feature-discovery-gc-cc57bc7fd-2mllh                      1/1     Running   0             24m
node-feature-discovery    mp-node-feature-discovery-master-7ddc5f4849-k56km                 1/1     Running   0             24m
node-feature-discovery    mp-node-feature-discovery-worker-qv6rl                            1/1     Running   0             24m
node-feature-discovery    mp-node-feature-discovery-worker-xcfnh                            1/1     Running   0  

@haarchri
haarchri force-pushed the feature/baremetal-amd branch from 06e3317 to 03d64b9 Compare September 9, 2026 13:28
@haarchri
haarchri force-pushed the feature/baremetal-amd branch from 86b5fc5 to 0061a2a Compare September 30, 2026 18:48
@haarchri haarchri changed the title Compose multiple accelerator vendors in the serving stack: Provision Vultr bare metal servers into k3s inference clusters Provision Vultr bare metal servers into k3s inference clusters, composing multi-vendor GPU serving stacks Sep 30, 2026
…ence clusters, composing multi-vendor GPU serving stacks

Signed-off-by: Christopher Haar <christopher.haar@upbound.io>
@haarchri
haarchri force-pushed the feature/baremetal-amd branch from 43a8047 to c19401e Compare September 30, 2026 19:10
@haarchri
haarchri marked this pull request as ready for review September 30, 2026 19:12

This branch was successfully deployed

1 active (outdated) deployment
Preview – modelplane-docs — 86b5fc59 Deployed Sep 9, 2026 by vercel[bot]
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.

1 participant