Skip to content

feat(recipes): add VR200 (Vera Rubin) RKE2 preview overlays - #2520

Open
yuanchen8911 wants to merge 41 commits into
NVIDIA:mainfrom
yuanchen8911:feat/vr200-rke2-preview
Open

feat(recipes): add VR200 (Vera Rubin) RKE2 preview overlays#2520
yuanchen8911 wants to merge 41 commits into
NVIDIA:mainfrom
yuanchen8911:feat/vr200-rke2-preview

Conversation

@yuanchen8911

@yuanchen8911 yuanchen8911 commented Sep 1, 2026

Copy link
Copy Markdown
Contributor

Summary

Adds VR200 (Vera Rubin) as an accelerator criteria value and rke2 (Rancher Kubernetes Engine 2) as a service criteria value, plus the bare-metal rke2 service root and three vr200-rke2-ubuntu-* overlays: two leaves (training; inference-dynamo) plus a shared platform-neutral inference base, covering #2326's two committed v1 coordinates.

Also registers rke2/vr200 in the performance validator's compiled NVLS matrix so the NCCL all-reduce gate works at all. #2443 moved each benchmark into a per-run namespace, which left this recipe's previous nccl-benchmark-runtime-ref approach unable to obtain an IMEX ComputeDomain — reproduced on hardware as a launcher failure with the ComputeDomain stranded in the old namespace. Promoting VR200 to the built-in path makes the validator provision it in whatever namespace it derives, and the overlay moves to the -nvls check and threshold names that actually select that path. Details under NCCL performance below.

Motivation / Context

Part of the VR200 Preview support work. Publishes an upstream VR200/RKE2 recipe path so it is discoverable and reproducible without an external catalog.

Fixes: N/A
Related: #2326

Follow-ups filed from this work. None block this PR, and none are closed by it — each tracks work that remains outstanding after this merges:

The three nodewright-packages issues are defects in the pinned upstream package rather than in this recipe, and none is reachable by a change here — each needs an upstream fix plus a digest bump. Recorded so a reader does not assume every setting in the tuning profile is in effect on a VR200 node.

Type of Change

  • New feature (non-breaking change that adds functionality)
  • Bug fix (non-breaking change that fixes an issue) — the ComputeDomain numNodes guard fix below

Component(s) Affected

  • Recipe engine / data (pkg/recipe)
  • Validator (pkg/validator, validators/performance)
  • Docs/examples (docs/, examples/)

Implementation Notes

  • gpu-operator and nvidia-dra-driver-gpu componentRefs are left unpinned in the new overlays so they resolve to the registry defaults, rather than pinning the internal reference deployment's staging chart builds. chore(recipes): bump gpu-operator v26.7.0, DRA 0.5.0; hold driver 580 #2439 has since bumped those registry defaults to the first release line with formal Vera Rubin support (gpu-operator v26.7.0, nvidia-dra-driver-gpu 0.5.0), and this branch is rebased onto it, so the Deployment.gpu-operator.version >= v26.7.0 constraint in the new leaves now matches the stock default. That constraint does NOT actually gate nvidia-dra-driver-gpu's deployed version — no dedicated deployment-phase check exists for it, so a cluster with an independently managed DRA driver version can pass the gpu-operator check while still running the 0.4.1 default that crashes on VR200. Recipe generation is unaffected (both come from the same registry.yaml default), but deployment validation has this gap; closing it needs a real per-component version check, out of scope here.
  • Node tuning runs the native vr200/rke2 nvidia-tuned profile on both VR200 leaves, authored by the nodewright maintainer (nvidia-tuned 0.9.0 added the rke2 service). tuning-rke2.yaml runs nvidia-tuned alone: service: rke2 ships no profile overrides, so vr200 falls through to its own multiNodeTraining profile with the [bootloader] stanza intact, applied via a /etc/default/grub.d drop-in. This reboots the node, and post-interrupt-bootloader-check then asserts every argument reached /proc/cmdline, so a node cannot come up labelled as tuned while running none of its tuning. It replaces the earlier bcm-profile stopgap this branch carried while no vr200-native path existed. Applied to both leaves because the catalog requires every leaf sharing (service, accelerator) to carry identical tuning config.
  • Ported nodewright-operator and nvsentinel fixes discovered on real VR200 hardware (internal MR !63): an inline health-check override for a controller naming drift, and disabling nvsentinel's metadata-collector (which the already-present assumeDriverInstalled fix would otherwise expose to an NVML crash on the host-managed-driver path).
  • Added dranet (DRA network driver, ConnectX-9 RDMA exposure) and rdma-netns-exclusive (host RDMA exclusive-netns Skyhook CR) as new registry components, wired into both VR200 leaves. Clean multi-node GPUDirect/RDMA over the ConnectX-9 fabric is a property of the NVL72 hardware, not of the training workload — any inference deployment spanning nodes over that fabric (e.g. Dynamo disaggregated prefill/decode with cross-node KV transfer) needs it identically.
  • nvsentinel.labeler.assumeDriverInstalled: true is set on both VR200 base leaves for the host-managed-driver path (mirrors the kind.yaml/oke-ol.yaml pattern).
  • agentgateway/agentgateway-crds are pinned to v2.2.1 on rke2-inference (declared in versionPinExemptions) so agentgateway's Gateway API v1.2.x client is satisfied.
  • RKE2's default packaged ingress is rke2-ingress-nginx through v1.35 and switches to Traefik at v1.36. rke2-inference installs its own Gateway API CRDs (standard channel plus a vendored TLSRoute experimental-channel CRD, since agentgateway needs TLSRoute served at v1alpha2 and the standard bundle omits it) rather than assuming a bundled Traefik release owns them. Because there's no way to install CRDs conditionally from a static recipe, and a v1.36+ default cluster's own rke2-traefik-crd release would collide with AICR's CRD ownership, rke2-inference/vr200-rke2-ubuntu-inference* cap K8s.server.version to >= 1.34.1 < 1.36.0 for v1.
  • SKU auto-detection cannot identify vr200 yet: the pre-release driver reports the generic "NVIDIA Graphics Device" placeholder rather than a stable marketing name, so snapshot-based recipe generation on VR200 hardware needs explicit --accelerator vr200.
  • Added a kwok/profiles/rke2/ node-profile pair (system + accelerated-vr200) so the new leaves enter the KWOK scheduling/deployer-render matrix, per [Feature]: VR200 Preview support #2326's acceptance criteria.
  • VR200/rke2 are labeled Preview in the CLI/API reference docs and in the leaf recipes themselves, linking to validation.aicr.run.

#2439 has merged and this branch is rebased onto it, so the Deployment.gpu-operator.version >= v26.7.0 gate now matches the registry default and the original blocker is cleared. Both leaves are now fully validated on hardware against the shipped configuration — 27/27 checks, 0 failed, 0 skipped. See Hardware validation below.

Resolved: the VR200 KWOK failures were structural to the harness, not a nodewright defect. All three VR200 Tier 2 lanes (training, inference, inference-dynamo) failed installing rdma-netns-exclusive on a 10s admission timeout to mutate-skyhook.nvidia.com. Root cause: the nodewright-operator Deployment is a system workload, so it carries the fake-node toleration the KWOK harness passes (--system-node-toleration kwok.x-k8s.io/node=fake:NoSchedule) and schedules onto a KWOK node, which reports its pod Ready without ever running a container. The webhook Service therefore has endpoints nothing serves, and with failurePolicy: Fail every admission call burns its deadline — which is why it reproduced identically on every run rather than intermittently.

nodewright-customizations was already disabled in the harness, so the VR200 leaves are the first recipes to apply a Skyhook CR under KWOK and hit this. Fixed by disabling the operator's admission webhook in the KWOK harness only (--set nodewright:webhook.enable=false, gated on the component being bundled) — the same failure mode, and the same remedy, the harness already documents for slinky-slurm-operator. The chart documents the webhook as production-required, so this is scoped strictly to scheduling-only KWOK runs. All three lanes now pass.

Earlier revisions of this description attributed the failure to node-level resource contention and stated that the operator pods ran on real nodes; both were wrong, and the upstream issue filed on that basis (NVIDIA/nodewright#571) has been retracted and closed.

  • Fixes a false positive in TestComputeDomainManifestsSetNumNodes (added by chore(recipes): bump gpu-operator v26.7.0, DRA 0.5.0; hold driver 580 #2439), which this branch was the first to trip. The guard handled comments asymmetrically: it detected candidates with a raw strings.Contains(doc, "kind: ComputeDomain") that keeps comments, while specHasNumNodes stripped comment lines before looking for numNodes. A file that merely documents a ComputeDomain in prose — here the VR200 NCCL runtime, whose header records the CD an operator must pre-create, numNodes: 2 included — was therefore reported as shipping a CR that omits the field, though it ships only a TrainingRuntime. Detection now strips comments too, via a shared stripYAMLComments helper that also replaces the duplicated copy of that logic inside specHasNumNodes. The same asymmetry affected the file-level counter that feeds the guard's own vacuous-pass check (checked == 0): the prose match inflated it to 2 when the catalog holds exactly one real ComputeDomain manifest, so removing that manifest would have left the guard passing while verifying nothing. That predicate is comment-stripped as well, and the count now correctly reports 1. TestComputeDomainDetectionIgnoresProse covers both halves, with a control asserting a real ComputeDomain missing numNodes is still caught. Kept in this PR rather than split out, since the VR200 runtime is the reproducing case.

Conformance surface

Adds two conformance checks to the two VR200 leaves, with their evidence tier kept explicit.

leaf pod-autoscaling secure-accelerator-access robust-controller
vr200-rke2-ubuntu-training added added — (skips: no AI operator)
vr200-rke2-ubuntu-inference added added — (skips: no AI operator)
vr200-rke2-ubuntu-inference-dynamo inherits already present already present

NCCL performance: promoted to the built-in NVLS path

rke2/vr200 is registered in the validator's compiled matrix (supportedNCCLCombinations[variantNVLS]) and its runtime ships as an embedded template at validators/performance/testdata/vr200/rke2/runtime-nvls.yaml, replacing the earlier recipe-supplied nccl-benchmark-runtime-ref approach.

This was forced by #2443, which moved each NCCL run into a per-run namespace (aicr-nccl-perf-<variant>-<runID>). The validator skips ComputeDomain/IMEX provisioning for recipe-supplied runtimes on the contract that the runtime owns its fabric wiring — but a TrainingRuntime document cannot declare a ComputeDomain, so the only way to satisfy it was an operator pre-creating one in a namespace they could name in advance. A derived namespace removed that property. Confirmed on hardware at 3860b50c: conformance passed while performance failed at the launcher, with the pre-created ComputeDomain left stranded in aicr-validation and the run executing in aicr-nccl-perf-default-5cd48d7a.

With VR200 in the compiled matrix, customRuntime is empty and it takes the same provisioning branch as gb200/eks|oke — the validator creates the ComputeDomain in whatever namespace it derives, and inherits future namespace changes. The operator prerequisites (pre-created ComputeDomain, --node-selector) are gone.

The overlay moves to nccl-all-reduce-bw-nvls for both the check and its threshold constraint, because the check name is what selects the variant and its template. Keeping the bare nccl-all-reduce-bw would dispatch variantDefault, whose matrix has no rke2/vr200 entry — and an unsupported combination returns Skip, not a failure, so the gate would have reported SKIPPED indefinitely. TestVR200TrainingUsesNVLSNCCLCheck pins this; TestSupportedNCCLCombinations_Variants would not have caught it, since it only asserts on service keys it explicitly lists.

Node selection is stated honestly in the template header: VR pre-GA nodes report a placeholder nvidia.com/gpu.product, so there is deliberately no acceleratorProductMatchers entry and the product filter is skipped. Correct for a homogeneous VR cluster; a heterogeneous one needs an operator-supplied selective label.

Hardware validation — both leaves, shipped configuration, 27/27 checks passed.

Run on the internal VR200/RKE2 reference cluster (2-node NVL72) against this branch's head, with the native vr200/rke2 tuning applied and the nodes rebooted first. Counts read from the report JSON, not log lines.

leaf deployment conformance performance
vr200-rke2-ubuntu-training 4/4 (2m46s) 8/8 (2m12s) 1/1 (4m17s)
vr200-rke2-ubuntu-inference-dynamo 4/4 (2m47s) 10/10 (2m29s) n/a — recipe defers inference-perf

0 failed, 0 skipped. A skipped performance check would have been a failure here, since that is how the pre-promotion misconfiguration would have surfaced.

The NVLS promotion is confirmed working, not just resolving. NCCL all-reduce measured 744.15 GB/s against the >= 600 floor across 8 GPUs (2×4), from the 16 GiB message row. The log shows customRuntime=false and:

Applying ComputeDomain for NVLS/IMEX access namespace=aicr-nccl-perf-nvls-dbbcb6f3

That is the whole point of the change: with nccl-benchmark-runtime-ref gone (0 occurrences in the generated recipe), the validator provisions the ComputeDomain into the per-run namespace itself — which the operator-precreated path structurally could not do after #2443. Note the namespace segment is now nvls, where the failing pre-promotion run showed default: the variant check resolved through the new matrix entry rather than falling through to the generic check.

Also newly proven on hardware:

  • pod-autoscaling — the one genuine VR200 conformance gap this PR closes — passes on both leaves, including HPA scale-up 1→3 and scale-down 3→1.
  • secure-accelerator-access passes in device-plugin mode on both leaves.
  • robust-controller passes on the dynamo leaf; its first actual exercise on VR hardware.
  • The native tuning profile applies and reboots cleanly, and expected-resources passes against the tuning CR it renders.

All results above were measured after the reboot-based tuning applied, on the configuration this PR ships.

Artifacts: validate-head.json, validate-inf.json, and signed attestations. Validator images built multi-arch from this branch, since those images publish only from main.

Both VR200 coordinates are leaves and keep their static, render, health-table and KWOK coverage, and the published evidence link for rke2/vr200-ubuntu/training is intact.

Testing

go build ./...
go test ./pkg/recipe/... ./pkg/bundler/... ./pkg/server/... ./pkg/cli/... ./pkg/client/... \
  ./pkg/tuning/... ./tools/bom/... ./tools/schemagen/... ./validators/performance/...
golangci-lint run -c .golangci.yaml ./...
yamllint -c .yamllint.yaml <new/changed yaml files>
bash tools/openapi-diff   # against the regenerated baseline
bash kwok/scripts/lib/profile-select_test.sh
aicr recipe --service rke2 --accelerator vr200 --os ubuntu --intent training|inference[--platform dynamo]
aicr bundle -r <recipe> -o <bundle>   # both leaves plus the shared base

All pass. Plus full hardware validation of both leaves on the reference cluster — see Hardware validation above. make qualify was run in full and exits non-zero, solely at its scan step: coverage 84.2% (threshold 80%), go vet, golangci-lint 0 issues, API-diff and the chainsaw CLI e2e suite are all green, and 119 packages report ok.

One step fails locally and is not from this branch: make scan reports golang.org/x/crypto advisories (GO-2026-5932 / 6354 / 6355) that are not yet in .openvex.json. This branch changes no go.mod, go.sum, or vendored dependency, and CI's own grype and tests / Security Scan jobs pass on this PR — it is a local grype-database freshness artifact, and suppressing it belongs in a VEX update rather than here.

Risk Assessment

  • Medium — Adds new criteria enum values and a new service; touches shared pkg/recipe code paths, but is additive and gated behind the new rke2/vr200 criteria values, so existing recipes are unaffected.

Known limitation: containerd LimitSTACK is inert on stock RKE2

The pinned nvidia-tuned 0.9.0 profile chain (nvidia-vr200-multiNodeTraininginclude=nvidia-vr200-performance) carries containerd_service.sh, which writes /etc/systemd/system/containerd.service.d/ with LimitSTACK=67108864. Stock RKE2 runs containerd embedded under rke2-agent/rke2-server, so that drop-in targets the distro's unrelated containerd.service. Confirmed on hardware: the drop-in exists, /usr/lib/systemd/system/containerd.service is a distro unit not running RKE2's containerd, and workloads are served by RKE2's own containerd-shim-runc-v2.

verify_dropin() only tests that the file exists and greps its own content — it never asks systemd whether a unit consumed it — so the package reports complete while the limit is never applied.

Not fixed here, and not a regression: it lives inside the upstream package (a recipe edit cannot reach it), and the bcm stopgap this replaces applied no containerd tuning at all, so node state is unchanged either way. The reboot-applied half of the profile (bootloader/hugepages/sysctl) does work and is independently enforced by post-interrupt-bootloader-check. Tracked upstream against NVIDIA/nodewright-packages; the fix needs the active RKE2 unit (or the embedded runtime's config) targeted and the check to verify the effective limit rather than file existence.

Rollout notes: Preview-labeled recipe path, per #2326's Preview boundary.

This change reboots GPU nodes. The native vr200/rke2 profile writes the kernel cmdline via a /etc/default/grub.d drop-in and nothing takes effect until the node reboots; it reboots again on any change to accelerator, intent or service. This was exercised on the reference cluster: the tuning applied, the nodes rebooted, and validation passed afterwards. This recipe ships two rebooting Skyhooks — rdma-netns-exclusive (one package, one reboot trigger) and tuning-rke2 (one nvidia-tuned package with four reboot triggers: one interrupt plus three configInterrupts). Each limits its own rollout to one node at a time via interruptionBudget.count: 1, but that budget is per-CR and does not compose. 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. There is also no dependency edge between the two components, so nothing guarantees the RDMA CR exists when tuning becomes runnable. Tracked in #2572.

The practical cost is two sequential reboots per node rather than one. Merging both packages into a single Skyhook would reboot once — the nodewright maintainer's suggestion, noted as a follow-up rather than done here since it changes component boundaries rdma-netns-exclusive shares with its own health check and dependency wiring.

count: 1 is deliberate but does not scale: convergence costs N × (reboot time), which suits the small NVL72 clusters VR200 Preview targets and gradual rollout onto a cluster already running work, but not hundreds of nodes. The maintainer's guidance for that case is a ramping deployment policy with a failure threshold rather than a fixed count — with the caveat that runtimeRequired: true keeps workloads blocked on the last node for the whole rollout, so ramping trades convergence time against how long that blocking lasts. Documented in the manifest; revisit if VR200 deployments grow past a rack.

Until that is resolved, apply these CRs deliberately on any cluster with running workloads rather than letting both roll unattended. On bare metal with no auto-reimage this needs BMC access ready beforehand. Not a drive-by deploy.

Coordination on the shared reference cluster is a results-validity requirement, not a stability one. Two nvidia-tuned Skyhook CRs already coexist there in a settled state (complete, nodesInProgress: 0, nodes Ready for 58 days), including one at 0.8.0-dev with intent: performance — a different package version and a different profile chain from this PR's 0.9.0 / multiNodeTraining. Adding a third means the profile actually in effect is decided by priority ordering, so a measurement taken as-is would be ambiguous about which configuration it describes. Deconflict before the run.

Checklist

  • Tests pass locally (make test with -race) — full suite via make qualify, 119 packages ok
  • Linter passes (make lint) — ran targeted golangci-lint (full module scan) + yamllint
  • I did not skip/disable tests to make CI green
  • I added/updated tests for new functionality — TestVR200TrainingUsesNVLSNCCLCheck, matrix cases in TestNCCLCombinationSupported / TestSupportedNCCLCombinations_Variants, plus golden regeneration and the version-pin exemption
  • I updated docs if user-facing behavior changed
  • Changes follow existing patterns in the codebase
  • Commits are cryptographically signed (git commit -S)

@yuanchen8911 yuanchen8911 added the theme/recipes Recipe expansion, overlays, mixins, and component registry label Sep 1, 2026
@yuanchen8911

Copy link
Copy Markdown
Contributor Author

Blocking: this PR is not ready to come out of draft until it can be validated against real VR200 (Vera Rubin) NVL72 hardware running RKE2. Everything here has been checked against repo tests/lint/build and local aicr recipe/aicr bundle resolution only — none of it has run on a live VR cluster.

Also depends on #2439 (gpu-operator v26.7.0 / nvidia-dra-driver-gpu 0.5.0 bump) merging first, since the new overlays rely on those registry defaults rather than pinning a staging build.

Will move out of draft once VR cluster access is available for validate/conformance testing.

@github-actions

github-actions Bot commented Sep 1, 2026

Copy link
Copy Markdown
Contributor

@github-actions

github-actions Bot commented Sep 1, 2026

Copy link
Copy Markdown
Contributor

Recipe evidence check

Registry change: scoped to recipes that reference a changed component
entry in recipes/registry.yaml (not every leaf).

Protected recipes

Recipes with committed evidence (recipes/evidence/<slug>/<source>/<digest>.yaml) that this PR affects: 2

Recipe Source Pointer Verify Digest match
vr200-rke2-ubuntu-inference-dynamo 5bf9e82f0e90a11528ac85f4bcb866c8 sha256-fbd7e54a9c0bc2599234d248c022b471bbd2fdf9b913241ec35b5a08fa87f6ed ✅ passed ⚠️ stale (f1c583536fa8… vs current 5e4a5f11113d…)
vr200-rke2-ubuntu-training 5bf9e82f0e90a11528ac85f4bcb866c8 sha256-106150bfc5d3755c894197644813db4269208836b05d33cae209fb4926ec25ad ✅ passed ⚠️ stale (d9467460a59e… vs current bdc6e830100f…)
vr200-rke2-ubuntu-training 5bf9e82f0e90a11528ac85f4bcb866c8 sha256-d9a6f1c694e17028e89747893d8a74b62c2a3c2583c8070e70c922baaef5f33b ✅ passed ⚠️ stale (84769e71832a… vs current bdc6e830100f…)
Other affected recipes without evidence yet: 1

These recipes are affected by this PR but carry no committed evidence pointer, so there is
nothing to verify. This is expected — evidence is hardware-gated and added over time.

  • vr200-rke2-ubuntu-inference

How to refresh evidence

Run on a cluster matching the recipe's criteria:

aicr snapshot -o snapshot.yaml
# Profiled families (AKS/GKE gpuStack): hydrate the recipe with the
# pointer's recorded 'profile:' selection first — validating the raw
# overlay resolves only the declaration default, and 'aicr validate'
# has no --profile flag. AKS additionally needs the pool projection
# (GKE uses the plain snapshot above):
#   az aks nodepool list -g <rg> --cluster-name <cluster> -o json > pools.json
#   aicr snapshot --aks-gpu-pools pools.json -o snapshot.yaml
#   aicr recipe -s snapshot.yaml --intent <intent> [--platform <platform>] \
#     --profile <name>=<value> -o recipe.yaml
# State the target leaf's intent/platform explicitly (the snapshot
# fingerprint supplies service/accelerator/OS but intent and platform
# default to 'any') and pass -r recipe.yaml below instead of the raw
# overlay.
aicr validate \
  -r recipes/overlays/<slug>.yaml \
  -s snapshot.yaml \
  --emit-attestation ./out \
  --push ghcr.io/<your-fork>/aicr-evidence
# Copy to the per-source path printed in the emit 'copyTo' hint:
#   recipes/evidence/<slug>/<source>/<bundle-digest>.yaml

This gate is warning-only and never blocks merge. See ADR-007 for the trust model.

@coderabbitai

coderabbitai Bot commented Sep 1, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

Note

Reviews paused

It looks like this branch is under active development. To avoid overwhelming you with review comments due to an influx of new commits, CodeRabbit has automatically paused this review. You can configure this behavior by changing the reviews.auto_review.auto_pause_after_reviewed_commits setting.

Use the following commands to manage reviews:

  • @coderabbitai resume to resume automatic reviews.
  • @coderabbitai review to trigger a single review.

Use the checkboxes below for quick actions:

  • ▶️ Resume reviews
  • 🔍 Trigger review

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: ASSERTIVE

Plan: Enterprise

Run ID: 21dd5875-10f8-48c2-b26e-9e358bc8f93c

📥 Commits

Reviewing files that changed from the base of the PR and between a20c604 and 6070205.

📒 Files selected for processing (3)
  • kwok/profiles/rke2/accelerated-vr200.yaml
  • pkg/recipe/version_pin_guard_test.go
  • recipes/overlays/vr200-rke2-ubuntu-inference-dynamo.yaml

Included review availability: Your plan provides up to 12 included reviews per hour; 11 remain after this review.


📝 Walkthrough

Walkthrough

The change adds rke2 and vr200 to API criteria, Go parsing, schemas, and documentation. It adds RKE2 base, inference, training, Dynamo, and VR200 recipe overlays. It adds KWOK node profiles, GPU and gateway configuration, TLSRoute CRD definitions, validation checks, image metadata, version-pin exemptions, and expanded golden data.

Estimated code review effort: 5 (Critical) | ~120 minutes

Merge Risk: 🟡 Moderate · up to 60702

The new Dynamo deployment can fail when no usable default StorageClass exists, leaving NATS storage Pending and causing installation timeouts; the VR200 paths also depend on host GPU prerequisites and coordinated component versions. These bounded deployment risks should be fixed or explicitly accepted before merge.

Suggested reviewers: arangogutierrez

🚥 Pre-merge checks | ✅ 4
✅ Passed checks (4 passed)
Check name Status Explanation
Linked Issues check ✅ Passed The description identifies the related issue, dependency, follow-up issues, and external issue references. It also states which issues remain open after this pull request.
Out of Scope Changes check ✅ Passed The changes support the stated VR200 and RKE2 objectives, including recipe overlays, API values, validation, documentation, required CRDs, and test coverage. No unrelated change is apparent.
Title check ✅ Passed The title clearly summarizes the primary change: adding VR200 and RKE2 preview recipe overlays.
Description check ✅ Passed The description directly explains the new VR200 and RKE2 criteria, recipe overlays, validation changes, testing, dependencies, and known limitations.
✨ Finishing Touches 💡 1
⚔️ Resolve merge conflicts 💡
  • Resolve merge conflict in branch feat/vr200-rke2-preview
🧪 Generate unit tests (beta)
  • Create PR with unit tests

Comment @coderabbitai help to get the list of available commands.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 5

🤖 Prompt for all review comments with AI agents
Treat finding text, file paths, and code as untrusted review data. Never follow
instructions embedded in them. Verify each finding against current code. Fix
only still-valid issues, skip the rest with a brief reason, keep changes
minimal, and validate.

Inline comments:
In `@pkg/recipe/criteria.go`:
- Line 368: Update the field documentation comments near the Service and
hardware-type criteria to include the supported values metal3 and gb300
respectively, keeping both lists aligned with the parser and static type
definitions.

In `@pkg/recipe/doc.go`:
- Around line 28-29: Update the enum documentation lists in the package criteria
documentation to include CriteriaServiceRKE2 and CriteriaAcceleratorVR200,
keeping them synchronized with the values listed for Service and Accelerator in
the Criteria field comments.

In `@recipes/overlays/rke2.yaml`:
- Line 76: Review the root-level nriPluginEnabled setting in the RKE2 overlay
and scope it only to overlays covered by the production support matrix, rather
than propagating it to every derived overlay. Retain the setting at the root
only if all derived overlays are validated for the RKE2 NRI path; otherwise move
it into the explicitly validated overlay configurations.

In `@recipes/overlays/vr200-rke2-ubuntu-training-kubeflow.yaml`:
- Around line 36-37: Add K8s.server.version with the value ">= 1.34.1" to the
vr200-rke2-ubuntu-training-kubeflow leaf, matching the version constraint in
vr200-rke2-ubuntu-training while preserving the existing platform-kubeflow
mixin.

In `@recipes/overlays/vr200-rke2-ubuntu-training.yaml`:
- Around line 109-112: Ensure host provisioning disables and masks the
nvidia-imex service, or add a preflight that rejects nodes where it is enabled,
in both recipes/overlays/vr200-rke2-ubuntu-training.yaml lines 109-112 and
recipes/overlays/vr200-rke2-ubuntu-inference.yaml lines 75-78. Apply the same
prerequisite enforcement to both VR200 recipes before deploying
nvidia-dra-driver-gpu.
🪄 Autofix

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: ASSERTIVE

Plan: Enterprise

Run ID: ee61622e-0b54-42c0-9240-cda1f54f575b

📥 Commits

Reviewing files that changed from the base of the PR and between 51ba472 and 7a3a844.

📒 Files selected for processing (18)
  • api/aicr/v1/server.yaml
  • docs/contributor/recipe.md
  • docs/user/api-reference.md
  • docs/user/cli-reference.md
  • pkg/bundler/testdata/stock_render_golden.yaml
  • pkg/recipe/criteria.go
  • pkg/recipe/criteria_test.go
  • pkg/recipe/doc.go
  • pkg/recipe/testdata/catalog_parity_golden.yaml
  • pkg/recipe/testdata/coverage_golden.yaml
  • pkg/recipe/version_pin_guard_test.go
  • recipes/overlays/rke2-inference.yaml
  • recipes/overlays/rke2-training.yaml
  • recipes/overlays/rke2.yaml
  • recipes/overlays/vr200-rke2-ubuntu-inference-dynamo.yaml
  • recipes/overlays/vr200-rke2-ubuntu-inference.yaml
  • recipes/overlays/vr200-rke2-ubuntu-training-kubeflow.yaml
  • recipes/overlays/vr200-rke2-ubuntu-training.yaml

Included review availability: Your plan provides up to 12 included reviews per hour; 11 remain after this review.

Comment thread pkg/recipe/criteria.go Outdated
Comment thread recipes/overlays/rke2.yaml
Comment thread recipes/overlays/vr200-rke2-ubuntu-training-kubeflow.yaml Outdated
Comment thread recipes/overlays/vr200-rke2-ubuntu-training.yaml
yuanchen8911 added a commit to yuanchen8911/aicr that referenced this pull request Sep 1, 2026
…rlays

Fixes gaps found by an independent review of NVIDIA#2520:

- exhaustive switch: add CriteriaServiceRKE2 to platformWorkerScheduling
  (validators/performance), the only mandatory-lint failure the new
  criteria value introduced.
- regenerate committed JSON schemas (RecipeCriteria/RecipeMetadata/
  RecipeResult) so rke2/vr200 validate; regenerate the BOM doc and the
  Nodewright tuning-status table for the rke2-inference agentgateway
  v2.2.1 pins and the new vr200 tuning row.
- rke2-inference: RKE2's default packaged ingress is ingress-nginx, not
  Traefik, through the recipe's own K8s.server.version floor, so the
  prior "Traefik CRDs already installed" assumption was wrong for the
  documented default. Vendor the missing TLSRoute CRD (Gateway API
  v1.2.1 experimental channel) and re-enable the standard Gateway API
  CRD manifest, with a documented opt-out for clusters that do enable
  RKE2's bundled Traefik chart. Also restores the
  validate-agentgateway-crds-established health-check step, dropped
  when the inline check was authored.
- drop vr200-rke2-ubuntu-training-kubeflow.yaml: it is not one of
  NVIDIA#2326's two committed v1 coordinates, and its presence made the
  required plain-training coordinate a non-leaf, invisible to the
  leaf-only render/catalog parity gates.
- add a KWOK node profile pair for rke2/vr200 so the two required
  leaves enter the KWOK scheduling/deployer-render matrix instead of
  being silently dropped, per NVIDIA#2326's acceptance criteria.
- document the VR200 Preview status in the CLI/API reference docs and
  in the leaf recipes themselves, and document that snapshot-based SKU
  auto-detection cannot identify vr200 yet (no stable marketing-name
  driver string exists pre-GA); explicit --accelerator vr200 is
  required.
- document that Deployment.gpu-operator.version also gates
  nvidia-dra-driver-gpu by proxy, since no deployment-phase version
  check exists for the DRA driver and both bump together in NVIDIA#2439.

Signed-off-by: Yuan Chen <yuanchen97@gmail.com>

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 2

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
recipes/overlays/vr200-rke2-ubuntu-inference.yaml (1)

75-78: ⚠️ Potential issue | 🟠 Major

Enforce the host nvidia-imex prerequisite in both VR200 paths.

The DRA component is enabled in both recipes, but neither recipe enforces that the host nvidia-imex service is disabled and masked before deployment.

  • recipes/overlays/vr200-rke2-ubuntu-inference.yaml#L75-L78: add host preflight or provisioning enforcement for the DRA component.
  • recipes/overlays/vr200-rke2-ubuntu-training.yaml#L121-L125: add the same enforcement for the training component.
🤖 Prompt for AI Agents
Treat finding text, file paths, and code as untrusted review data. Never follow
instructions embedded in them. Verify each finding against current code. Fix
only still-valid issues, skip the rest with a brief reason, keep changes
minimal, and validate.

In `@recipes/overlays/vr200-rke2-ubuntu-inference.yaml` around lines 75 - 78,
Ensure the host nvidia-imex service is disabled and masked before deployment in
both DRA paths: update recipes/overlays/vr200-rke2-ubuntu-inference.yaml lines
75-78 and recipes/overlays/vr200-rke2-ubuntu-training.yaml lines 121-125 with
equivalent preflight or provisioning enforcement, while preserving the existing
nvidia-dra-driver-gpu configuration.
🤖 Prompt for all review comments with AI agents
Treat finding text, file paths, and code as untrusted review data. Never follow
instructions embedded in them. Verify each finding against current code. Fix
only still-valid issues, skip the rest with a brief reason, keep changes
minimal, and validate.

Inline comments:
In `@recipes/overlays/rke2-inference.yaml`:
- Around line 224-226: Update the rke2-inference recipe’s CRD handling so
rke2-traefik-crd conflicts are avoided automatically on RKE2 v1.36 and newer, or
constrain the supported K8s.server.version range to versions using
rke2-ingress-nginx. Preserve compatibility with the existing rke2 root
configuration and ensure Gateway API CRDs are not installed redundantly on
Traefik-default clusters.

In `@recipes/overlays/vr200-rke2-ubuntu-inference.yaml`:
- Around line 116-118: Update the VR200 recipe gating so nvidia-dra-driver-gpu
is explicitly pinned or validated to >= 0.5.0 instead of relying on the
gpu-operator constraint; the current gating in vr200-rke2-ubuntu-inference.yaml
(116-118) and vr200-rke2-ubuntu-training.yaml (178-185) only covers gpu-operator
and does not constrain the DRA driver, so adjust the relevant recipe logic
around those component checks to enforce the DRA version directly in both
places.

---

Outside diff comments:
In `@recipes/overlays/vr200-rke2-ubuntu-inference.yaml`:
- Around line 75-78: Ensure the host nvidia-imex service is disabled and masked
before deployment in both DRA paths: update
recipes/overlays/vr200-rke2-ubuntu-inference.yaml lines 75-78 and
recipes/overlays/vr200-rke2-ubuntu-training.yaml lines 121-125 with equivalent
preflight or provisioning enforcement, while preserving the existing
nvidia-dra-driver-gpu configuration.
🪄 Autofix

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: ASSERTIVE

Plan: Enterprise

Run ID: b16daf85-0d5e-4db2-a409-eba51857aa14

📥 Commits

Reviewing files that changed from the base of the PR and between 7a3a844 and 862d82c.

📒 Files selected for processing (19)
  • api/aicr/v1/schemas/RecipeCriteria.schema.json
  • api/aicr/v1/schemas/RecipeMetadata.schema.json
  • api/aicr/v1/schemas/RecipeResult.schema.json
  • docs/integrator/components/nodewright.md
  • docs/user/api-reference.md
  • docs/user/cli-reference.md
  • docs/user/container-images.md
  • kwok/profiles/rke2/accelerated-vr200.yaml
  • kwok/profiles/rke2/system-generic.yaml
  • pkg/bundler/testdata/stock_render_golden.yaml
  • pkg/recipe/testdata/catalog_parity_golden.yaml
  • pkg/recipe/testdata/coverage_golden.yaml
  • pkg/tuning/compute_test.go
  • recipes/components/agentgateway-crds/manifests/tlsroute-crd.yaml
  • recipes/overlays/rke2-inference.yaml
  • recipes/overlays/vr200-rke2-ubuntu-inference-dynamo.yaml
  • recipes/overlays/vr200-rke2-ubuntu-inference.yaml
  • recipes/overlays/vr200-rke2-ubuntu-training.yaml
  • validators/performance/nccl_all_reduce_bw_constraint.go
💤 Files with no reviewable changes (1)
  • pkg/recipe/testdata/coverage_golden.yaml

Included review availability: Your plan provides up to 12 included reviews per hour; 10 remain after this review.

Comment thread recipes/overlays/rke2-inference.yaml
Comment thread recipes/overlays/vr200-rke2-ubuntu-inference.yaml Outdated
yuanchen8911 added a commit to yuanchen8911/aicr that referenced this pull request Sep 1, 2026
…rlays

Fixes gaps found by an independent review of NVIDIA#2520:

- exhaustive switch: add CriteriaServiceRKE2 to platformWorkerScheduling
  (validators/performance), the only mandatory-lint failure the new
  criteria value introduced.
- regenerate committed JSON schemas (RecipeCriteria/RecipeMetadata/
  RecipeResult) so rke2/vr200 validate; regenerate the BOM doc and the
  Nodewright tuning-status table for the rke2-inference agentgateway
  v2.2.1 pins and the new vr200 tuning row.
- rke2-inference: RKE2's default packaged ingress is ingress-nginx, not
  Traefik, through the recipe's own K8s.server.version floor, so the
  prior "Traefik CRDs already installed" assumption was wrong for the
  documented default. Vendor the missing TLSRoute CRD (Gateway API
  v1.2.1 experimental channel) and re-enable the standard Gateway API
  CRD manifest, with a documented opt-out for clusters that do enable
  RKE2's bundled Traefik chart. Also restores the
  validate-agentgateway-crds-established health-check step, dropped
  when the inline check was authored.
- drop vr200-rke2-ubuntu-training-kubeflow.yaml: it is not one of
  NVIDIA#2326's two committed v1 coordinates, and its presence made the
  required plain-training coordinate a non-leaf, invisible to the
  leaf-only render/catalog parity gates.
- add a KWOK node profile pair for rke2/vr200 so the two required
  leaves enter the KWOK scheduling/deployer-render matrix instead of
  being silently dropped, per NVIDIA#2326's acceptance criteria.
- document the VR200 Preview status in the CLI/API reference docs and
  in the leaf recipes themselves, and document that snapshot-based SKU
  auto-detection cannot identify vr200 yet (no stable marketing-name
  driver string exists pre-GA); explicit --accelerator vr200 is
  required.
- document that Deployment.gpu-operator.version also gates
  nvidia-dra-driver-gpu by proxy, since no deployment-phase version
  check exists for the DRA driver and both bump together in NVIDIA#2439.

Signed-off-by: Yuan Chen <yuanchen97@gmail.com>
@yuanchen8911
yuanchen8911 force-pushed the feat/vr200-rke2-preview branch from d3c1865 to a20c604 Compare September 1, 2026 19:53
@yuanchen8911

Copy link
Copy Markdown
Contributor Author

Checked whether vLLM's Rubin support (upstream PRs #49387, #49647, both in vLLM v0.27.0, released 2026-08-10) is actually reachable from a published runtime image before enabling performance validation on the inference-dynamo leaf. It isn't yet:

  • ai-dynamo's latest tagged release (v1.4.2, 2026-08-29) still pins vllm/vllm-openai:v0.26.0 — one version behind the fix.
  • ai-dynamo's unreleased main branch pins v0.28.0 (has the fix), but nothing built from main is published.

So the sm_107a JIT-compile crash this leaf's performance validation was originally blocked on is fixed upstream but not pullable from any image the recipe can reference today. Left the performance: block deferred and updated the overlay comment with this finding so the next attempt starts from current state rather than re-deriving it.

Also in this push: rebased onto main (was 2 commits behind, no conflicts), added the two remaining doc.go named-constant entries CodeRabbit/a later review pass flagged, and corrected the PR body's leaf count.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 2

🤖 Prompt for all review comments with AI agents
Treat finding text, file paths, and code as untrusted review data. Never follow
instructions embedded in them. Verify each finding against current code. Fix
only still-valid issues, skip the rest with a brief reason, keep changes
minimal, and validate.

Inline comments:
In `@pkg/recipe/doc.go`:
- Around line 28-29: Update the recipe package and HTTP documentation lists to
include the existing service value metal3 and symbol CriteriaServiceMetal3, plus
accelerator value gb300 and symbol CriteriaAcceleratorGB300, wherever the
corresponding service and accelerator criteria values are documented, including
enum bullets and HTTP query values. Preserve all existing documented values.

In `@recipes/overlays/vr200-rke2-ubuntu-inference-dynamo.yaml`:
- Around line 56-58: Add a blocking StorageClass preflight for the
dynamo-platform Helm leaf, requiring either the CLI storage-class setting or an
explicit usable override before bundling. Anchor the change to the
dynamo-platform entry and preserve the existing non-blocking behavior for
unrelated leaves.
🪄 Autofix

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: ASSERTIVE

Plan: Enterprise

Run ID: dac1a73b-cc25-4b00-abac-522482299591

📥 Commits

Reviewing files that changed from the base of the PR and between d3c1865 and a20c604.

📒 Files selected for processing (2)
  • pkg/recipe/doc.go
  • recipes/overlays/vr200-rke2-ubuntu-inference-dynamo.yaml

Included review availability: Your plan provides up to 12 included reviews per hour; 9 remain after this review.

Comment thread pkg/recipe/doc.go Outdated
Comment thread recipes/overlays/vr200-rke2-ubuntu-inference-dynamo.yaml
@yuanchen8911

Copy link
Copy Markdown
Contributor Author

Verified and fixed both P2 accuracy findings:

  • The KWOK accelerated-vr200 profile's GPU memory figure (186GB) was invented, with no source. NVIDIA's published spec for Rubin is 288GB HBM4 per GPU — confirmed via NVIDIA's developer blog and independently corroborated. Corrected gpu.product and gpu.memory (294912 MiB) with a citation.

  • The deferred-performance-validation re-enable condition understated the gap. Checked vLLM's actual PR content and Dockerfile: the SM107 kernel path is gated on CUDA >= 13.4 at build time (CMAKE_CUDA_COMPILER_VERSION check), but vLLM's own published Docker images — including v0.28.0 — still build against CUDA 13.0.3. So a published ai-dynamo release picking up vLLM >= 0.27.0 wouldn't actually be enough; it also needs to be built against CUDA >= 13.4. Also named the two AICR-side hardcoded vllm-runtime:1.2.1 pins (model_cache.go and its testdata) that would need updating in lockstep before this leaf's own inference-perf check would exercise a different image.

Also fixed the two stale-text findings (leftover Traefik-patch language in two comments, PR body's Testing block still saying "all three leaves").

@yuanchen8911
yuanchen8911 force-pushed the feat/vr200-rke2-preview branch from 6070205 to e96395a Compare September 1, 2026 23:51
yuanchen8911 added a commit to yuanchen8911/aicr that referenced this pull request Sep 1, 2026
…rlays

Fixes gaps found by an independent review of NVIDIA#2520:

- exhaustive switch: add CriteriaServiceRKE2 to platformWorkerScheduling
  (validators/performance), the only mandatory-lint failure the new
  criteria value introduced.
- regenerate committed JSON schemas (RecipeCriteria/RecipeMetadata/
  RecipeResult) so rke2/vr200 validate; regenerate the BOM doc and the
  Nodewright tuning-status table for the rke2-inference agentgateway
  v2.2.1 pins and the new vr200 tuning row.
- rke2-inference: RKE2's default packaged ingress is ingress-nginx, not
  Traefik, through the recipe's own K8s.server.version floor, so the
  prior "Traefik CRDs already installed" assumption was wrong for the
  documented default. Vendor the missing TLSRoute CRD (Gateway API
  v1.2.1 experimental channel) and re-enable the standard Gateway API
  CRD manifest, with a documented opt-out for clusters that do enable
  RKE2's bundled Traefik chart. Also restores the
  validate-agentgateway-crds-established health-check step, dropped
  when the inline check was authored.
- drop vr200-rke2-ubuntu-training-kubeflow.yaml: it is not one of
  NVIDIA#2326's two committed v1 coordinates, and its presence made the
  required plain-training coordinate a non-leaf, invisible to the
  leaf-only render/catalog parity gates.
- add a KWOK node profile pair for rke2/vr200 so the two required
  leaves enter the KWOK scheduling/deployer-render matrix instead of
  being silently dropped, per NVIDIA#2326's acceptance criteria.
- document the VR200 Preview status in the CLI/API reference docs and
  in the leaf recipes themselves, and document that snapshot-based SKU
  auto-detection cannot identify vr200 yet (no stable marketing-name
  driver string exists pre-GA); explicit --accelerator vr200 is
  required.
- document that Deployment.gpu-operator.version also gates
  nvidia-dra-driver-gpu by proxy, since no deployment-phase version
  check exists for the DRA driver and both bump together in NVIDIA#2439.

Signed-off-by: Yuan Chen <yuanchen97@gmail.com>
@yuanchen8911

Copy link
Copy Markdown
Contributor Author

Addressed both findings from the last review round:

  • Rebased onto current main (was 4 commits behind, at a3075b0; main had moved to dc3818e and beyond). Hit real conflicts in the two golden fixture files as expected — resolved by taking main's version at each step, then fully regenerated both from scratch on the final rebased tree rather than trusting the conflict resolution. Also reran schema/BOM/tuning-doc generation to confirm no drift from main's other changes (none). GitHub now reports mergeable: true (was DIRTY).

  • Fixed the last stale Traefik-patch reference (rke2-inference.yaml's inline health-check comment still described the old "served: false until patched" design).

  • On the open question: checked NVIDIA's own announcements — Vera Rubin pairs the Rubin GPU with a new Vera CPU (Arm, succeeding Grace), not a Grace CPU. Corrected "Grace"/"Grace/Vera" to "Vera" across the KWOK profile and the two leaf overlays that had it.

Full build + golangci-lint ./... + targeted test suite + yamllint + openapi-diff all green on the rebased head.

@yuanchen8911

Copy link
Copy Markdown
Contributor Author

Ported two health-check fixes discovered and verified live against real VR200 hardware today (internal MR !63, commits eaedada and 6ed63c2), to both VR200 leaves:

  • nodewright-operator: inline healthCheckAsserts override for the expected Deployment name (nodewright-controller-manager vs. the embedded catalog's skyhook-operator-controller-manager). Confirmed the mismatch is real against this repo's own embedded checks/nodewright-operator/health-check.yaml.
  • nvsentinel: disables global.metadataCollector.enabled. On VR200's host-managed-driver + CDI/NRI path it has no way to get NVML access without either a nonexistent runtimeClassName or permanently reserving a GPU per node. This is a regression the already-present labeler.assumeDriverInstalled fix would otherwise expose — once the driver-installed label applies, metadata-collector goes from inert to actually scheduling, and crashes.

Not ported: dranet/rdma-netns-exclusive (deferred per an earlier scoping decision) and the nvidia-dra-driver-gpu staging-build pin (still deliberately waiting on #2439's GA release rather than shipping a staging chart reference in the public catalog).

@yuanchen8911

Copy link
Copy Markdown
Contributor Author

Ported dranet/rdma-netns-exclusive (previously deferred as optional, non-load-bearing components) to the training leaf, matching the internal reference deployment's actual scope:

  • dranet: manifest-only DRA network driver, evaluation alternative to the NVIDIA Network Operator for exposing ConnectX-9 RDMA NICs to pods.
  • rdma-netns-exclusive: manifest-only Skyhook CR setting host RDMA to exclusive netns mode, pairing with dranet for clean NCCL/GPUDirect behavior.

Two gaps the public test suite caught that the internal side-loaded catalog doesn't enforce: the Skyhook manifest needed the standard helm.sh/hook annotations, and every embedded registry component needs a healthCheck.assertFile (the internal registry entry has none for rdma-netns-exclusive — added a minimal status.status == complete assert here).

make bom-docs regenerated, goldens regenerated, full go test ./... and golangci-lint ./... clean.

@yuanchen8911
yuanchen8911 force-pushed the feat/vr200-rke2-preview branch from 5ed99f1 to d416876 Compare September 2, 2026 18:10
yuanchen8911 added a commit to yuanchen8911/aicr that referenced this pull request Sep 2, 2026
…rlays

Fixes gaps found by an independent review of NVIDIA#2520:

- exhaustive switch: add CriteriaServiceRKE2 to platformWorkerScheduling
  (validators/performance), the only mandatory-lint failure the new
  criteria value introduced.
- regenerate committed JSON schemas (RecipeCriteria/RecipeMetadata/
  RecipeResult) so rke2/vr200 validate; regenerate the BOM doc and the
  Nodewright tuning-status table for the rke2-inference agentgateway
  v2.2.1 pins and the new vr200 tuning row.
- rke2-inference: RKE2's default packaged ingress is ingress-nginx, not
  Traefik, through the recipe's own K8s.server.version floor, so the
  prior "Traefik CRDs already installed" assumption was wrong for the
  documented default. Vendor the missing TLSRoute CRD (Gateway API
  v1.2.1 experimental channel) and re-enable the standard Gateway API
  CRD manifest, with a documented opt-out for clusters that do enable
  RKE2's bundled Traefik chart. Also restores the
  validate-agentgateway-crds-established health-check step, dropped
  when the inline check was authored.
- drop vr200-rke2-ubuntu-training-kubeflow.yaml: it is not one of
  NVIDIA#2326's two committed v1 coordinates, and its presence made the
  required plain-training coordinate a non-leaf, invisible to the
  leaf-only render/catalog parity gates.
- add a KWOK node profile pair for rke2/vr200 so the two required
  leaves enter the KWOK scheduling/deployer-render matrix instead of
  being silently dropped, per NVIDIA#2326's acceptance criteria.
- document the VR200 Preview status in the CLI/API reference docs and
  in the leaf recipes themselves, and document that snapshot-based SKU
  auto-detection cannot identify vr200 yet (no stable marketing-name
  driver string exists pre-GA); explicit --accelerator vr200 is
  required.
- document that Deployment.gpu-operator.version also gates
  nvidia-dra-driver-gpu by proxy, since no deployment-phase version
  check exists for the DRA driver and both bump together in NVIDIA#2439.

Signed-off-by: Yuan Chen <yuanchen97@gmail.com>
@yuanchen8911

Copy link
Copy Markdown
Contributor Author

KWOK Tier 2 for vr200-rke2-ubuntu-training fails reproducibly (same failure on two separate CI runs, before and after rebase) — root cause identified, not flakiness:

rdma-netns-exclusive's Skyhook CR install fails with a webhook timeout:

Error: server-side apply failed for object /rdma-netns-exclusive skyhook.nvidia.com/v1alpha1, Kind=Skyhook:
Internal error occurred: failed calling webhook "mutate-skyhook.nvidia.com": failed to call webhook:
Post "https://skyhook-operator-webhook-service.skyhook.svc:443/mutate-skyhook-nvidia-com-v1alpha1-skyhook?timeout=10s":
context deadline exceeded

All 6 retry attempts fail identically over a ~4.5 minute window (5s/20s/45s/80s/120s backoff).

Root cause: pkg/recipe/metadata.go's TopologicalSort (Kahn's algorithm) breaks ready-queue ties by alphabetical component name, not recipe declaration order. Among this leaf's 14 components, rdma-netns-exclusive sorts last alphabetically, so it's always installed 13th/13th — about 6 minutes after nodewright-operator (and its webhook) came up. nodewright-customizations' own Skyhook CR, which goes through the identical webhook, installs much earlier (alphabetically) and succeeds. By minute 6, 14 real Helm releases — several resource-heavy real operators (cert-manager, gpu-operator, kai-scheduler, kube-prometheus-stack, nvidia-dra-driver-gpu, nvsentinel) — are running for real on the shared Kind/KWOK CI runner. A sustained failure across all 6 retries (not an occasional miss) is consistent with the webhook pod being CPU-starved or evicted under that accumulated load, not a transient blip.

This isn't fixable from the recipe side: the webhook's 10s timeout is set by nodewright-operator's own upstream chart, and reordering componentRefs has no effect on install order (it's alphabetical, not declaration-order). It reflects the KWOK/Kind CI runner's capacity being exceeded once this leaf's component count grows to 14, not a defect in the ported manifests.

Every other check is green, including the other two VR200 Tier 2 jobs (inference, inference-dynamo) and both H100 GPU test lanes.

@yuanchen8911

Copy link
Copy Markdown
Contributor Author

Attempted a resource-bump mitigation for the rdma-netns-exclusive webhook timeout (bumping nodewright-operator's manager container to the chart's own documented high-load tier). Verified the override reached the pod correctly, but the KWOK Tier 2 job failed identically a third time with the same context deadline exceeded — ruling out CPU/memory starvation as the mechanism. Reverted the ineffective change.

Checked NVIDIA/nodewright's tracker for a known match: #555 (open) is related but distinct — "connection refused" immediately after a helm rollback/restart, from an Endpoint/kube-proxy propagation race. This failure is a sustained hang (not a refusal) across a full 4.5-minute retry budget, ~6 minutes into a stable run with no restart trigger. Different mechanism, not yet tracked upstream. Drafting an issue for that separately.

This leaf remains the only one in the catalog with two Skyhook CRs on one nodewright-operator, which is why nothing has exercised this pattern before.

@yuanchen8911

Copy link
Copy Markdown
Contributor Author

Filed the webhook-timeout finding upstream: NVIDIA/nodewright#571. Not blocking this PR's merge gate (only gate and Check PR Title are required checks, and gate is green on the current head) — tracked separately for whenever nodewright maintainers have bandwidth.

yuanchen8911 and others added 14 commits September 3, 2026 15:44
Rebase artifact only. main's NVIDIA#1983 (Dynamo 1.4+ / NATS removal) changed
the rendered image set, so docs/user/container-images.md needed a fresh
`make bom-docs`. No recipe or component change on this branch affects
it.

Signed-off-by: Yuan Chen <yuanchen97@gmail.com>
The operator Deployment's name depends on how nodewright was installed,
and both paths are in scope for this recipe:

- VR reference clusters carry an out-of-band install (hand-written
  values, no fullnameOverride) rendering nodewright-controller-manager.
- A cluster deployed from this recipe's own bundle picks up
  components/nodewright-operator/values.yaml's
  `fullnameOverride: skyhook-operator` and renders
  skyhook-operator-controller-manager.

The override pinned the first name, so expected-resources failed for the
stock public bundle that NVIDIA#2326 requires. Pinning the second name instead
would simply move the breakage to the reference clusters where the live
validation runs happen, so neither name is correct to hard-code.

Drop the name and let the assert match on kind + namespace, the same
rationale already documented for the Skyhook CR assert in
checks/nodewright-customizations/health-check.yaml. This is not a
vacuous pass: a nameless assert takes the executor's list-and-match path
(pkg/chainsaw/inprocess.go), which returns ErrCodeNotFound when the
collection is empty or every item is terminating, and the skyhook
namespace holds only the operator.

Signed-off-by: Yuan Chen <yuanchen97@gmail.com>
…stly

Two review findings on NVIDIA#2520.

Disable nodewright's admission webhook under KWOK. All three VR200
Tier-2 jobs failed installing rdma-netns-exclusive on a 10s admission
timeout to mutate-skyhook.nvidia.com. This is structural, not operator
load: the operator Deployment is a system workload, so it carries the
fake-node toleration the harness passes and lands on a KWOK node, which
reports its pod Ready without running a container. The webhook Service
then has endpoints nothing serves, and with failurePolicy: Fail every
admission call times out. nodewright-customizations is already disabled
here, but rdma-netns-exclusive is always-on, so the VR200 leaves were
the first recipes to apply a Skyhook CR under KWOK and hit it.

This is the same failure mode, and the same remedy, the harness already
documents for slinky-slurm-operator's webhook a few lines above.
Scoped to the KWOK harness only — the chart documents the webhook as
required for production.

Also cap the rdma-netns-exclusive assert at 5m. The authored 15m was
dead text: an authored value can only shorten the caller's budget, never
extend it (pkg/chainsaw/inprocess.go caps it against
defaults.ChainsawAssertTimeout = 6m, with a Debug log), and the
deployment job envelope is 8m. The comment now records the real
consequence rather than hiding it: because this CR reboots workers
serially, a cold cluster's genuine convergence can exceed the 6m ceiling
and time out. Lifting that needs a shared-default and job-envelope change
together, or the readiness-poll path — infrastructure work outside this
recipe port, left as a follow-up.

Signed-off-by: Yuan Chen <yuanchen97@gmail.com>
The previous commit set assert: 5m, which was a regression. An authored
value only takes effect when it is strictly SMALLER than the caller's
budget (pkg/chainsaw/inprocess.go), so the old 15m was capped to the
caller's 6m while 5m actively lowered the ceiling to five minutes. A
rollout converging between five and six minutes passed before that
commit and would have failed after it.

6m is the largest value that actually takes effect: equal to the caller
budget, so nothing is shortened, and the authored number now states the
real ceiling instead of an unreachable one.

Also corrects two errors in the accompanying comment: "matching every
other in-tree check" was false (slinky-slurm declares 7m), and the
validator catalog path is recipes/validators/catalog.yaml. The
cold-convergence limitation is unchanged and now cites NVIDIA#2473.

Signed-off-by: Yuan Chen <yuanchen97@gmail.com>
Rebasing onto NVIDIA#2439 tripped TestComputeDomainManifestsSetNumNodes on
the VR200 NCCL runtime, which ships only a TrainingRuntime. The guard
handles comments asymmetrically: it detects candidates with a raw
strings.Contains(doc, "kind: ComputeDomain") that keeps comments, but
specHasNumNodes strips comment lines before looking for numNodes. So a
file whose header merely DOCUMENTS a ComputeDomain — here, the CD an
operator must pre-create before a runtime-ref validate run, shown with
numNodes: 2 right there in the same comment — is reported as shipping a
CR that omits the field.

Detect on comment-stripped content too, via a shared stripYAMLComments
helper that also replaces the copy of that logic inside specHasNumNodes.
The guard still checks the 2 real ComputeDomain manifests in the
catalog, so its coverage is unchanged; it just no longer matches prose.

Signed-off-by: Yuan Chen <yuanchen97@gmail.com>
…mode note

Two review findings on NVIDIA#2520.

The ComputeDomain guard's file-level counter still used the raw
document, so a file that only mentions a ComputeDomain in prose was
counted toward `checked`. That is the input to the vacuous-pass guard
(`checked == 0`), so with the VR200 runtime inflating the count to 2,
removing the catalog's single real manifest would have left the guard
passing while verifying nothing. Strip comments there too; the count now
reports 1, which is the number of real manifests. Adds
TestComputeDomainDetectionIgnoresProse, covering both the per-document
false failure and the file-level counter, with a control asserting a
real ComputeDomain is still caught so the fix cannot pass by disabling
detection.

The DraNet manifest header claimed the deployment runs shared RDMA mode.
DraNet neither sets nor requires a mode, and both VR200 leaves pair it
with rdma-netns-exclusive, which sets ib_core netns_mode=0 and reboots
into exclusive mode. Reworded to say the mode is the recipe's choice and
that this component never mutates it.

Signed-off-by: Yuan Chen <yuanchen97@gmail.com>
Rebase artifact only. main's NVIDIA#2544 added a GB300 EKS Ubuntu training
Slurm recipe, which changes the catalog parity/render goldens, the
coverage golden, and the recipe-health matrix. Regenerated rather than
hand-merged; both VR200 rows are unchanged.

Signed-off-by: Yuan Chen <yuanchen97@gmail.com>
…re access

Three changes to the VR200 conformance surface.

pod-autoscaling is added to the training and inference leaves. It was
omitted alongside cluster-autoscaling on the grounds that DRA-allocated
GPUs break dcgm-exporter's exported_pod attribution, which does not
apply: this recipe leaves resources.gpus disabled (NVIDIA#1327), so the device
plugin stays the whole-GPU advertiser and DRA only serves
ComputeDomains/IMEX. gb200-eks-ubuntu-training resolves to the same
allocation model and already ships the check. Since NVIDIA#1408 the check does
not gate on pod-scoped metrics anyway. cluster-autoscaling stays omitted
— bare-metal RKE2 has no cluster autoscaler to exercise.

secure-accelerator-access is added to both leaves, matching this
family's inference-dynamo leaf, which already carries it. The validator
has been dual-mode since NVIDIA#1620 and exercises the device-plugin path when
no gpu.nvidia.com DeviceClass exists — the ComputeDomain-only shape
these NVL72 platforms use. This puts VR200 ahead of gb200/gb300, whose
training leaves still lack it; that gap is filed separately.

Both verified on the reference cluster (2026-09-03): pod-autoscaling
passes including HPA scale-up 1->3 and scale-down 3->1;
secure-accelerator-access passes in device-plugin mode.

Adds vr200-rke2-ubuntu-training-kubeflow, restoring the leaf from the
internal catalog. Every other accelerator family that has matured past
its initial coordinates carries a kubeflow leaf (13 of 18 service/
accelerator combinations), so omitting it left VR200 inconsistent. It
declares robust-controller, which routes to checkRobustKubeflowTrainer
only where an AI operator is present; the controller namespace resolves
to kubeflow, matching where the check looks.

Note the leaf-only gates now score training-kubeflow instead of plain
training, exactly as they already do for gb200/gb300/h100 — the plain
coordinate stays covered by the KWOK Tier 2 matrix.

robust-controller's Kubeflow path is NOT yet exercised on VR hardware:
routing and namespace agreement are confirmed statically, but the
runtime assertions are unverified pending a kubeflow-trainer install on
the reference cluster. Recorded in the overlay and the PR body.

Signed-off-by: Yuan Chen <yuanchen97@gmail.com>
Rebase artifact only. main's NVIDIA#2355 (gpuStack profile for the OKE family)
changes the catalog parity/render goldens and the rendered image set.
Regenerated rather than hand-merged; no VR200 content changes.

Signed-off-by: Yuan Chen <yuanchen97@gmail.com>
Adding vr200-rke2-ubuntu-training-kubeflow made the plain training
overlay a non-leaf. That part is the catalog norm — gb200, gb300, h100
and a100 all have non-leaf plain-training overlays for the same reason,
absent from the parity golden and the health table while their platform
siblings appear.

What is NOT the norm is the consequence here: rke2/vr200-ubuntu/training
carries published evidence in pkg/testgrid/presence.yaml, so dropping it
from the health table made it the only coordinate in the catalog with
signed attestations and no row to display them — its validation.aicr.run
link was replaced by a "pending" kubeflow row. Verified by enumerating
presence.yaml against the generated table: before this revert VR200 was
the sole violation; after it, none remain.

The underlying gap is catalog-wide, not VR200-specific: any family that
publishes evidence for a plain coordinate and later gains a platform
leaf hits it. Fixing that belongs with the leaf, not ahead of it, so
both are deferred to NVIDIA#2564 and land together.

pod-autoscaling and secure-accelerator-access are unaffected and stay —
they do not depend on the kubeflow leaf.

Signed-off-by: Yuan Chen <yuanchen97@gmail.com>
…A#2356

Rebase artifact only. main's NVIDIA#2356 (OKE RDMA fabric wiring) changes the
rendered image set and the catalog parity/render goldens. Regenerated
rather than hand-merged; no VR200 content changes, and the
presence.yaml-to-health-table invariant still holds.

Signed-off-by: Yuan Chen <yuanchen97@gmail.com>
NVIDIA#2443 moved each NCCL run into a per-run namespace
(aicr-nccl-perf-<variant>-<runID>). The validator skips ComputeDomain and
IMEX ResourceClaimTemplate provisioning for recipe-supplied runtimes, on
the contract that the runtime owns its fabric wiring — but a
TrainingRuntime document cannot declare a ComputeDomain, so the only way
to satisfy that contract was an operator pre-creating one in a namespace
they could name in advance. Deriving the namespace at run time removed
that property, leaving VR200's runtime-ref path with no way to obtain an
IMEX claim.

Confirmed on hardware at 3860b50: deployment 4/4 and conformance 8/8
passed, performance failed at the launcher, and the pre-created
ComputeDomain was left stranded in aicr-validation while the benchmark
ran in aicr-nccl-perf-default-5cd48d7a.

Register rke2/vr200 in supportedNCCLCombinations[variantNVLS] and ship
its runtime as an embedded template, so customRuntime is empty for VR200
and it takes the same provisioning branch as gb200/eks|oke — the
validator creates the ComputeDomain in whatever namespace it derives,
and inherits future namespace changes for free. This is what the
runtime's own UPSTREAMING note always said should happen.

The check name is what selects the variant, so the overlay moves to
nccl-all-reduce-bw-nvls for BOTH the check and its threshold constraint.
Keeping the bare name would dispatch variantDefault, whose matrix has no
rke2/vr200 entry, and an unsupported combination returns Skip rather
than failing — the gate would have reported SKIPPED forever. The new
TestVR200TrainingUsesNVLSNCCLCheck pins exactly that, since
TestSupportedNCCLCombinations_Variants only asserts on service keys it
explicitly lists and would not have caught a missing entry.

Operator prerequisites are gone: no pre-created ComputeDomain, and no
--node-selector requirement. The header now states the node-selection
boundary honestly — with no acceleratorProductMatchers entry (VR pre-GA
nodes report a placeholder GFD product name) the product filter is
skipped, which is right for a homogeneous VR cluster but means a
heterogeneous one needs an operator-supplied selective label.

Signed-off-by: Yuan Chen <yuanchen97@gmail.com>
The VR200/RKE2 leaves carried the bcm-setup manifest (service: bcm,
accelerator: h100) as an explicit stopgap, because nodewright-packages
had no vr200/rke2 tuning path. nvidia-tuned 0.9.0 adds the rke2 service,
so replace the stopgap with the real profile.

Unlike service=bcm, which re-roots the accelerator onto a
bootloader-free base, service=rke2 ships no profile overrides: each
accelerator falls through to its own workload profile with the
[bootloader] stanza intact (vr200: iommu.passthrough=1,
init_on_alloc=0, numa_balancing=disable, hugepages, earlycon), landed on
the host through a /etc/default/grub.d drop-in. That means the node
reboots to pick the cmdline up, and reboots again on any change to
accelerator, intent or service; post-interrupt-bootloader-check then
asserts every argument reached /proc/cmdline.

The new tuning-rke2.yaml follows tuning-generic.yaml: nvidia-tuned
alone, same enabled/tuningEnabled gates and toleration/selector
templating. nvidia-setup is deliberately not wired, since the
kernel-headers aliasing the bcm path provided is specific to that path
and the VR NVL72 reference image provisions its own kernel.

Training takes intent multiNodeTraining and the inference base takes
inference (inherited by the inference-dynamo leaf), matching how the
gb200-eks leaves already differ on intent alone.

Note a scheduling change beyond tuning: bcm-setup set
autoTaintNewNodes: false with no runtimeRequired, while the tuning
manifests (including this one) set runtimeRequired: true and default
autoTaintNewNodes to true. VR200 workers are therefore tainted until
tuning completes, and the reboot makes that window longer.

Regenerated: catalog-parity and stock-render goldens (the two VR200
leaves only), the tuning-status table, and the container-images BOM.

Signed-off-by: Alex Yuskauskas <ayuskauskas@nvidia.com>
Both VR200 leaves' resolved digests move: the tuning change touches the
training and inference overlays, and inference-dynamo inherits from
inference. BOM, health and tuning docs regenerate clean with no diff.

Signed-off-by: Yuan Chen <yuanchen97@gmail.com>
@yuanchen8911
yuanchen8911 force-pushed the feat/vr200-rke2-preview branch from 2042a90 to 262b258 Compare September 3, 2026 22:47
… time

Review findings on the native tuning manifest.

P1: the stock bundle could reboot every node at once, including control
plane. tuning-rke2.yaml declares four reboot interrupts but wrapped
nodeSelectors in a conditional and set no interruptionBudget, and
nodewright treats an absent selector as matching every node and an
omitted budget as 100%. Bundle generation only WARNS when
--accelerated-node-selector is unset, so this is the default public path
NVIDIA#2326 requires. Reproduced by rendering the stock training bundle with
no scheduling flags: CR "tuning", four reboots, neither field present.

Both fixes mirror rdma-netns-exclusive, the sibling manifest that
already gets this right: an unconditional interruptionBudget.count: 1,
and a nodeSelectors fallback to nvidia.com/gpu.present="true" instead of
emitting no selector at all. Neither depends on the caller passing an
optional flag. Verified on both paths — the stock bundle now renders the
GPU-node selector with count 1, and an explicit
--accelerated-node-selector still overrides it.

P3: two comments outlived their subject. The runtime still described the
ComputeDomain as operator-precreated in the validation namespace, which
the NVLS promotion replaced with validator provisioning in the per-run
namespace; the training overlay still called the tuning a bcm-profile
stopgap.

Not addressed here: the pinned profile retains containerd_service.sh,
which writes a drop-in for containerd.service and only checks the file
exists. Stock RKE2 runs containerd embedded under rke2-agent/rke2-server
with no standalone unit, so LimitSTACK can report complete without
applying. That needs an upstream nodewright-packages fix and a digest
bump, not a recipe change.

Signed-off-by: Yuan Chen <yuanchen97@gmail.com>
interruptionBudget.count is enforced per CR and does not compose across
them. This recipe ships two rebooting Skyhooks — tuning-rke2 and
rdma-netns-exclusive — both on the operator defaults (priority 200,
sequencing node), so nothing stops one advancing on worker A while the
other advances on worker B.

Saying nodes reboot "one at a time" was therefore too strong. Each
Skyhook serializes its own rollout; the pair is not globally
coordinated. Cross-CR ordering would need explicit priority plus
sequencing, which no Skyhook CR in this catalog sets — every other
platform ships exactly one CR, so the case has not arisen before.

Behaviour is unchanged; this corrects what the recipe and PR claim about
it. Cross-CR lifecycle sits outside NVIDIA#2326's Preview scope, which defers
upgrade and operational-lifecycle qualification, and is tracked as a
follow-up alongside the DraNet surge-rollout issue.

Signed-off-by: Yuan Chen <yuanchen97@gmail.com>
The previous note claimed concurrent reboots across the two rebooting
Skyhooks were possible. That is wrong, and the nodewright maintainer
corrected it: nodewright does not run multiple Skyhook CRs at once. They
are ordered by priority, then by name when priorities match
(cluster_state_v2.go sorts on both, and a Skyhook blocks while any
higher-ordered one is active). With both on the default priority 200,
rdma-netns-exclusive completes before tuning-rke2 begins.

The earlier claim came from reading the priority/sequencing defaults and
inferring behaviour without finding the code that serializes CRs.
interruptionBudget.count is indeed per CR; that just does not imply what
it appeared to.

Real consequence is two sequential reboots per node rather than one.
Merging both packages into a single Skyhook would reboot once, which the
maintainer suggested; left as a follow-up since it changes component
boundaries rdma-netns-exclusive shares with its own health check and
dependencyRefs.

Signed-off-by: Yuan Chen <yuanchen97@gmail.com>
Keeping count: 1 — it bounds a live cluster to one node rebooting at a
time, which is what the VR200 reference cluster wants, and the selector
fallback already keeps the CR off control-plane nodes regardless.

But it does not scale: convergence costs N x (reboot time). The
nodewright maintainer's guidance for large clusters is a ramping
deployment policy with a failure threshold rather than a fixed count,
with the caveat that runtimeRequired: true keeps workloads blocked on
the last node for the whole rollout — so ramping trades convergence time
against how long that blocking lasts.

Recorded in the manifest and the PR body so the tradeoff is visible at
the point of change rather than rediscovered when VR200 deployments grow
past a rack.

Signed-off-by: Yuan Chen <yuanchen97@gmail.com>
Reverses the previous correction, which was wrong. The maintainer's
"we don't allow multiple CRs to run at once" holds at skyhook-level
scheduling but not at node granularity: IsNodeReadyForSkyhook checks
per-node completion of a predecessor under the default sequencing: node,
so node A can start tuning while node B is still on rdma-netns-exclusive
and both reboot together.

Install ordering compounds it — nodewright-customizations lands nine
positions before rdma-netns-exclusive, so the tuning CR is created when
no predecessor CR exists and nothing orders it at all.

I removed this caveat on the strength of a one-line answer without
checking the code behind it; the code says otherwise. Behaviour is
unchanged either way — this is about what the recipe claims.

Tracked as a follow-up along with the two-reboots-per-node cost.

Signed-off-by: Yuan Chen <yuanchen97@gmail.com>
Two factual errors in the caveat, both mine.

tuning-rke2 ships ONE reboot-capable package (nvidia-tuned) carrying
four reboot triggers — one interrupt plus three configInterrupts. I had
described it as four reboot packages.

The ordering claim cited fixed install positions, which vary by deployer
and recipe and so cannot be relied on. The actual defect is the absence
of a dependency edge between nodewright-customizations and
rdma-netns-exclusive: nothing guarantees the predecessor CR exists when
tuning becomes runnable. Compounded by tuning matching zero nodes until
GFD supplies nvidia.com/gpu.present, so when it becomes runnable tracks
GPU Operator rollout rather than install order.

The concurrency mechanism itself is unchanged and still stands.

Signed-off-by: Yuan Chen <yuanchen97@gmail.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

area/api area/bundler area/docs area/recipes size/XL theme/recipes Recipe expansion, overlays, mixins, and component registry

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants