InferenceCluster Custom Resource
A Kubernetes cluster registered with Modelplane for model serving.
Concept guide: Register a Cluster →
#Metadata
#Example
Manifest
apiVersion: modelplane.ai/v1alpha1
kind: InferenceCluster
metadata:
name: west-gke
spec:
cluster:
source: GKE
gke:
region: us-central1
nodePools:
- name: h100-pool
className: h100-8x-byo
nodeCount: 2
maxNodeCount: 10
zones: [us-central1-a]
#Spec
AKS cluster configuration. Required when source is AKS.
Azure ProviderConfig or ClusterProviderConfig used to authenticate to the Azure API. Defaults to the ClusterProviderConfig named default.
AKS cluster Kubernetes version. Defaults to a version where Dynamic Resource Allocation (how GPUs bind to pods) is generally available.
Azure region for the cluster (e.g. westeurope, eastus2).
EKS cluster configuration. Required when source is EKS.
AWS ProviderConfig or ClusterProviderConfig used to authenticate to the AWS API. Defaults to the ClusterProviderConfig named default.
EKS cluster Kubernetes version. Defaults to a version where Dynamic Resource Allocation (how GPUs bind to pods) is generally available.
AWS region for the cluster (e.g. us-west-2).
Bring-your-own cluster configuration. Required when source is Existing. Modelplane manages the inference stack on the cluster but does not provision the cluster itself.
ModelCache configuration for this cluster.
Name of an existing ReadWriteMany StorageClass for ModelCache PVCs. Modelplane doesn’t provision storage on an existing cluster, so the admin must create the StorageClass (it must support ReadWriteMany dynamic provisioning).
Optional reference to a Secret containing cloud provider credentials for IAM-based authentication. The type selects which cloud identity the ProviderConfigs authenticate as, and must match the cloud the existing cluster runs on.
Cloud identity type the credential authenticates as. Must match the cloud the existing cluster runs on. Defaults to GoogleApplicationCredentials.
GKE cluster configuration. Required when source is GKE.
GCP ProviderConfig or ClusterProviderConfig used to authenticate to the GCP API. Defaults to the ClusterProviderConfig named default.
Nebius mk8s cluster configuration. Required when source is Nebius; may be empty, since every field has a default. The cluster is created in the project the referenced ProviderConfig or ClusterProviderConfig sets as its projectID; Nebius projects are bound to a region, so the project also determines where the cluster runs.
Nebius ProviderConfig or ClusterProviderConfig used to authenticate to the Nebius API. Defaults to the ClusterProviderConfig named default.
mk8s cluster Kubernetes version. Defaults to a version where Dynamic Resource Allocation (DRA) is generally available.
Cluster provisioning method.
Vultr Kubernetes Engine (VKE) cluster configuration. Required when source is Vultr.
Vultr ProviderConfig or ClusterProviderConfig used to authenticate to the Vultr API. Defaults to the ClusterProviderConfig named default.
VKE cluster Kubernetes version. VKE requires an exact version string including the build suffix; list current versions with vultr-cli kubernetes versions. Defaults to a version where Dynamic Resource Allocation (how GPUs bind to pods) is generally available.
Vultr region for the cluster (e.g. ewr, fra). GPU plans and Vultr File System availability vary by region.
Capacity Block reservation backing this node pool. EKS only. Large GPU instances (e.g. p5en.48xlarge) are rarely available on demand; AWS allocates them via Capacity Blocks for ML. Set this to back the pool with a Capacity Block you have purchased. The pool’s zones must match the reservation’s Availability Zone, and nodeCount must not exceed the reserved instance count. Omit for on-demand pools.
The ID of the Capacity Reservation backing the Capacity Block (e.g. cr-0123456789abcdef0). Purchasing a Capacity Block yields this ID.
Name of the InferenceClass describing this pool’s hardware.
High-performance node-to-node fabric for multi-node engines, so a gang’s tensor-parallel traffic isn’t capped by TCP. Omit for standard VPC networking.
InfiniBand fabric configuration. Required when type is InfiniBand and the cluster source is Nebius; not used on AKS.
Identifier of the physical InfiniBand fabric to join (e.g. fabric-2). This selects existing Nebius infrastructure, not a name for a new resource: fabrics are per-region - see https://docs.nebius.com/compute/clusters/gpu#fabrics - and multi-node GPU capacity is allocated on specific fabrics, so use the fabric your capacity lives on.
Fabric technology. None uses standard VPC networking (TCP). EFA attaches Elastic Fabric Adapter interfaces to each node for GPUDirect RDMA across nodes; EKS only, and only useful on EFA-capable instance types (e.g. p5en.48xlarge). When any pool sets EFA, Modelplane installs the EFA DRA driver on the cluster and the gang’s pods claim EFA devices alongside their GPUs. InfiniBand places the pool’s nodes on a physical InfiniBand fabric for GPUDirect RDMA across nodes; Nebius and AKS only, and only useful on InfiniBand-capable shapes (e.g. gpu-h100-sxm on Nebius, Standard_ND96isr_H100_v5 on AKS). On Nebius the pool joins the fabric named in infiniband.fabric; on AKS the pool’s VM Scale Set placement group lands its nodes on one fabric, and Modelplane installs the NVIDIA network operator on the cluster.
Maximum node count for autoscaling. Omit for fixed-size pools.
Facts about where this cluster is, projected onto everything Modelplane composes here.
Metadata to project.
Labels stamped onto every ModelReplica and ModelEndpoint composed on this cluster, so a fact about the cluster is declared once here rather than repeated on each of them. This is how a self-hosted endpoint gets its region: a ModelService selects endpoints by label, so a service scoped to a region selects only the endpoints in it. These are your labels, under your own prefix. Modelplane carries and matches them, and never interprets them, so “eu” means no more to it than “prod”.
Which serving stack the cluster installs and composes. Standard (the default) is the Modelplane-composed serving layer: a Deployment or LeaderWorkerSet, Gateway API, and the endpoint picker. Dynamo swaps in NVIDIA’s components: Grove with the KAI Scheduler gang-schedules multi-node engines, and ModelExpress distributes weights. A single-node (Standalone) engine’s workload kind is unaffected - it stays a Deployment - but if it references a ModelCache on a Dynamo cluster it still gets the ModelExpress P2P env and IPC_LOCK, so it can seed peers and load from them like a gang.
#Status
Observed ModelCache RWX storage state.
Effective ReadWriteMany StorageClass name for ModelCache PVCs on this cluster. ModelCache reads this to target the cache PVC.
External address of the inference gateway on the remote cluster. Modelplane resolves status.gateway.hostname to this itself, on each InferenceGateway’s cluster, so a platform publishes no DNS for it.
PEM certificate of the CA that signed this gateway’s serving certificate. An InferenceGateway validates against it, so it reaches the cluster it meant to rather than whatever else answers on that address. Written once cert-manager on the cluster has issued.
The internal name an InferenceGateway addresses this cluster’s gateway by, derived by Modelplane and resolved to status.gateway.address on each gateway’s cluster. Published once the gateway has an address and traffic to it is mutually authenticated. ModelDeployment composes a ModelEndpoint origin from it, and withholds the endpoint while it’s unset.
Node pool name, matching spec.nodePools[].name. Used to pin a ModelReplica to a specific pool via spec.nodePoolName.
Number of nodes in this pool. Derived from maxNodeCount (if autoscaling) or nodeCount.
Namespace where the internal XRs (cluster, backend) were created.