RKE2 VR200 Setup
Bare-metal setup guide for the three Preview coordinates AICR publishes on VR200 (Vera Rubin) NVL72 hardware running RKE2:
rke2/vr200-ubuntu/trainingrke2/vr200-ubuntu/inference— platform-neutral inference base (resolves when--platformis omitted)rke2/vr200-ubuntu/inference-dynamo
service=rke2andaccelerator=vr200are Preview. They publish an early-adopter recipe path without the full production support and lifecycle qualification required for Supported status. See the published validation evidence for these Preview coordinates at validation.aicr.run; freshness against the current recipe is captured in the Evidence status note below.
Evidence status. The recipes for all three coordinates above have changed
since evidence publication (aicr evidence digest reports a mismatch
against each pointer’s predicate.recipe.digest); treat the linked evidence
as historical precedent for the recipe content at publication time, not as
validating the current recipe. Fresh hardware validation is pending VR
cluster access.
Cluster Prerequisites
-
Bare-metal RKE2. These recipes target physical VR200 NVL72 racks; there is no cloud-managed RKE2 lane in scope for v1. Node lifecycle (reimage, reboot recovery, BMC intervention) is the operator’s responsibility — plan BMC access before rollout because the Skyhook-driven kernel-cmdline changes described below reboot each GPU node.
-
Kubernetes version window. The training leaf pins
K8s.server.version >= 1.34.1because ComputeDomain / IMEX for the NVL72 MNNVL fabric uses the GA DRA API (resource.k8s.io/v1), and the RKE2 root’s CDI/NRI containerd 2.1 lands atv1.34.1+rke2r1. Both inference leaves (vr200-rke2-ubuntu-inferenceandvr200-rke2-ubuntu-inference-dynamo) additionally cap the window at< 1.36.0— the cap is authored on therke2-inferencebase, restated on the VR200 inference base, and inherited by the Dynamo child. RKE2 v1.36 changes the default packaged ingress to Traefik, whose bundledrke2-traefik-crdrelease would collide with the Gateway API CRDsrke2-inferenceinstalls itself. -
Ubuntu 26.04 with the Vera-optimized arm64 64k-page kernel. The
os-ubuntumixin is deliberately not used — it pins Ubuntu 24.04, while the VR200 NVL72 reference image ships Ubuntu 26.04 with7.0.0-*-nvidia-bos-64k. -
StorageClass. RKE2 ships no default StorageClass (unlike k3s, which bundles
local-path-provisioner). The training recipe does not need one, butinference-dynamodoes — its bundled NATS JetStream StatefulSet requests a PVC that will otherwise hang Pending. Install any dynamic provisioner and mark it default before deploying the inference bundle. -
LoadBalancer (inference chain only). RKE2 provisions no LoadBalancer controller, and the
inference-gatewayService therke2-inferencebase installs istype: LoadBalancer. Install a bare-metal LB implementation (e.g. MetalLB or kube-vip) before deploying theinferenceorinference-dynamobundle. Without one the Service sits atEXTERNAL-IP <pending>and the chain’s conformance check gates onGateway.status.conditions[?type=='Programmed'].status == 'True'— it will not go green. (Until an LB exists the gateway is still reachable via its NodePort / ClusterIP for smoke tests.) -
Mask the host
nvidia-imexservice on every GPU node. The Vera Rubin reference image installs the host-managed 615 driver stack, which enables annvidia-imexsystemd service by default. All three shipped coordinates install the DRAComputeDomaindaemon unconditionally, which starts its ownnvidia-imexand cannot allocate the session while the host service owns it (NV_ERR_IN_USE). The consequence is silent: the ComputeDomain daemon never goesReady,ComputeDomainworkloads hang onNodePrepareResources, and no validator surfaces this. Disable and mask on every GPU node before deploying the bundle (a disable-only lets systemd reactivate the service on any dependency pull-in or package upgrade, reproducingNV_ERR_IN_USE):To fully reverse (unmask alone leaves the service inactive because it was also disabled and stopped above):
Rollout Behavior
Both VR200 leaves reboot every GPU node they touch. Two rebooting Skyhook CRs ship in each leaf and are applied when the bundle deploys:
-
tuning-rke2— writes the nativevr200/rke2nvidia-tunedprofile to/etc/default/grub.d; the specific profile is intent-dependent, sotuned-adm activereports different profiles on different leaves:- Training (
vr200-rke2-ubuntu-training) appliesmultiNodeTraining, whose[bootloader]stanza adds IOMMU passthrough,init_on_alloc=0, NUMA balancing off, hugepages, and earlycon. - Inference and inference-dynamo (
vr200-rke2-ubuntu-inference*) apply VR200’sinferenceprofile, whose[bootloader]stanza differs.
In both cases the kernel cmdline is written at config time and nothing is live until the reboot.
post-interrupt-bootloader-checkthen asserts every argument in whichever profile is active reached/proc/cmdlinebefore the node is labelled tuned. - Training (
-
rdma-netns-exclusive— flipsib_core netns_mode=0on every selected GPU node. This is a host-wide, module-level kernel parameter change: it affects every RDMA user on the node, not just this recipe’s pods. The downstream benefit AICR relies on is thatdranetcan then present each pod with only its allocated HCA (/sys/class/infiniband), but any pre-existing RDMA workload on the node — MPI jobs, RDMA-backed storage, other operators — sees the same netns-mode change and must tolerate it. Coordinate with existing RDMA users before rollout, especially on shared reference clusters. Liketuning-rke2, this is a kernel-module parameter change that requires a reboot to take effect.
Each CR limits its own rollout to one node at a time via
interruptionBudget.count: 1, but that budget is per-CR and does not
compose across CRs. Under the default sequencing: node,
IsNodeReadyForSkyhook checks per-node completion of a predecessor rather
than global completion, so one node can start tuning while another is still
on the RDMA CR — concurrent reboots across the two CRs are possible on a
multi-node cluster today, and nothing guarantees the RDMA CR exists when
tuning becomes runnable. Full analysis and the candidate fixes (merge both
packages into a single Skyhook CR, or sequencing: all plus a dependency
edge) are tracked in #2572.
Practical implications:
-
Convergence cost depends on how the two CRs interleave — neither of the bounds below is a Skyhook or nodewright default. The recipe ships each CR with
interruptionBudget.count: 1(this is per-CR, not a controller default, and does not compose across CRs), and the recipe as shipped does not enforce serialization between the two CRs — that is an operator choice tracked in #2572.- Manually serialized (recommended) — the operator holds off applying the second CR (or gates it via a sequencing runbook) until the first has drained. Each GPU node then takes two independent reboots, so the rack performs roughly 2N × (reboot time).
- Fully overlapped (unattended) — apply both CRs at once and let the
Skyhook controller schedule them freely on the same node set (both
select
nvidia.com/gpu.present). Wall-clock trends toward ~N × (reboot time) in the best case, but this is exactly the “not a drive-by deploy” behavior below and the concurrent-reboot risk the section above describes.
Neither shape scales to hundreds of nodes:
count: 1sizing suits the small NVL72 clusters VR200 Preview targets and gradual rollout onto a cluster already running work. -
On bare metal with no auto-reimage, BMC access must be ready before rollout — a reboot that hangs at BIOS is on you to recover.
-
This is not a drive-by deploy. On any cluster with running workloads, apply these CRs deliberately rather than letting both roll unattended.
Coordinating on a Shared Reference Cluster
Coordination on a shared VR200 reference cluster is a results-validity
requirement, not a stability one. nvidia-tuned allows multiple Skyhook CRs
to coexist in complete state; adding this recipe’s tuning-rke2 alongside
an out-of-band tuning CR means the profile actually in effect is decided by
priority ordering. A measurement taken as-is would be ambiguous about which
configuration it describes. Deconflict before running validation or capturing
evidence.
Preview Boundary and Known Gaps
This coordinate is Preview, not Supported. Explicit gaps beyond the Preview recipes definition:
- SKU auto-detection cannot identify
vr200yet. The pre-release driver reports the genericNVIDIA Graphics Deviceplaceholder, so snapshot-backed recipe generation on VR200 hardware resolvesaccelerator: any; the coordinate must be selected explicitly with--accelerator vr200(or the equivalent query parameter). Deployment.gpu-operator.version >= v26.7.0does not gatenvidia-dra-driver-gpu’s deployed version. No per-component deployment check exists for the DRA driver. The current registry default isnvidia-dra-driver-gpu0.5.0 (bumped together withgpu-operatorv26.7.0 in #2439), which matches the constraint; but an independently upgraded / downgraded / older-bundle cluster can pass thegpu-operatorgate while still running the previous 0.4.1 default, which crash-loops on VR200’s NVML arch value.- Upstream
nodewright-packagesdefects affect settings the recipe configures but cannot enforce (containerdLimitSTACKdrop-in targets an inactive unit on stock RKE2; thevr200[bootloader]stanza requestshugepagesz=1G hugepages=2against a 64k-page kernel that has no 1 GiB pool;configure_bootloader.shduplicates TuneD’s native$tuned_paramshook). Tracked upstream at NVIDIA/nodewright-packages#134 / #135 / #136.
Related Issues
- #2326 — VR200 Preview epic (v1 milestone, Preview boundary and post-v1 qualification list).
- #2564 — the
training-kubeflowleaf forrke2/vr200and the underlyingpkg/healthleaf-scoring gap that deferred it. - #2569 —
nccl-benchmark-runtime-refcannot satisfy namespaced DRA dependencies after per-run namespace isolation. - #2572 — the two rebooting Skyhook CRs described above and their concurrency shape.