Modelplane Modelplane docs
Version

AKSCluster Custom Resource

An AKSCluster provisions an Azure Kubernetes Service cluster with a dedicated resource group, virtual network, and node pools for GPU inference and system workloads. It outputs a Secret containing the cluster kubeconfig that consumers use to target the cluster. The kubeconfig embeds a client certificate, so consumers need no separate cloud identity.

#Metadata

API version
infrastructure.modelplane.ai/v1alpha1
Kind
AKSCluster
Scope
Namespaced
Short names
aks

#Example

Manifest
apiVersion: infrastructure.modelplane.ai/v1alpha1
kind: AKSCluster
metadata:
  name: inference-westeurope
  namespace: platform
spec:
  location: westeurope
  kubernetesVersion: "1.34"
  nodePools:
    - name: system
      role: System
      vmSize: Standard_D8s_v5
      nodeCount: 2
    - name: gpuh100
      role: GPU
      vmSize: Standard_ND96isr_H100_v5
      diskSizeGb: 200
      # GPU pools need at least one node: the AKS cluster autoscaler cannot
      # scale a pool whose GPUs bind through DRA up from zero.
      nodeCount: 1
      minNodeCount: 1
      maxNodeCount: 8
      # The pool's VM Scale Set placement group lands its nodes on one
      # physical InfiniBand fabric. Requires the AKSInfinibandSupport
      # feature flag registered on the subscription.
      fabric: InfiniBand
      gpu:
        acceleratorType: nvidia-h100

#Spec

AKSClusterSpec defines the desired state of AKSCluster.

# kubernetesVersion optional string 1–16 chars default: 1.34

AKS cluster Kubernetes version. Must be a version AKS currently supports. Defaults to a version where Dynamic Resource Allocation (how GPUs bind to pods) is generally available.

# location required string 1–32 chars

Azure region for the cluster (e.g. westeurope, eastus2).

# networking optional object

Virtual network configuration. Azure subnets span all Availability Zones in a region, so one subnet serves every node pool. Override when peering multiple clusters to avoid CIDR collisions. CIDRs must not overlap the cluster’s service CIDR (10.96.0.0/16) or the overlay pod CIDR (10.244.0.0/16).

# subnetCidr optional string ≤ 18 chars default: 10.0.0.0/20

CIDR of the node subnet, carved from vnetCidr.

# vnetCidr optional string ≤ 18 chars default: 10.0.0.0/16

Address space for the virtual network.

# nodePools required object[] 1–8 items
# diskSizeGb optional integer 10–65536 default: 100

OS disk size in GB.

# fabric optional enum: None | InfiniBand default: None

High-performance node-to-node fabric for multi-node engines. None uses standard VNet networking (TCP). InfiniBand relies on the pool’s VM Scale Set placement group landing all nodes on one physical InfiniBand fabric. It requires the AKSInfinibandSupport feature flag on the subscription and an InfiniBand-capable VM size (e.g. Standard_ND96isr_H100_v5), and needs the NVIDIA network operator on the cluster to expose RDMA devices to pods, which Modelplane installs when any pool sets InfiniBand.

# gpu optional object

GPU configuration. Required when role is GPU.

# acceleratorType required string 1–63 chars

GPU accelerator type (e.g. nvidia-a100, nvidia-h100). Used to label GPU nodes; the actual GPU and count are determined by the VM size.

# maxNodeCount optional integer ≤ 1000 default: 8

Maximum number of nodes for autoscaling.

# minNodeCount optional integer ≤ 1000

Minimum number of nodes for autoscaling. Set it to 1 or higher for GPU pools: the AKS cluster autoscaler currently cannot scale a pool whose GPUs bind through DRA up from zero nodes, so a pod scheduled to an empty pool waits forever.

# name required string 1–12 chars

Unique name for this node pool, used as the AKS agent pool name. AKS restricts Linux pool names to at most 12 lowercase alphanumeric characters starting with a letter.

pattern: ^[a-z][a-z0-9]{0,11}$

# nodeCount optional integer ≤ 1000 default: 1

Initial number of nodes.

# role required enum: System | GPU

Determines what workloads this pool runs. System pools host controllers, gateways, and infrastructure. GPU pools host inference workloads and get the NVIDIA driver installed by AKS.

# vmSize required string 1–63 chars

Azure VM size (e.g. Standard_D4s_v5, Standard_NC24ads_A100_v4, Standard_ND96isr_H100_v5).

# zones optional string[] 1–3 items 1–8 chars

#Status

# cache optional object

Observed ModelCache RWX storage state.

# storageClassName optional string ≤ 253 chars

Name of the Modelplane-managed ReadWriteMany StorageClass composed on this cluster for ModelCache PVCs. ModelCache reads this to target the cache PVC.

# secrets optional object[]
# key required string ≤ 253 chars

Key within the Secret that holds the credential data.

# name required string ≤ 253 chars

Name of the Secret.

# type required enum: Kubeconfig

The type of credential this secret contains. Kubeconfig contains a kubeconfig file with the cluster endpoint, CA certificate, and a client certificate for a cluster-admin local account.