feat(recipes): add NVIDIA Cluster Readiness Engine (nvcre) component - #2523
feat(recipes): add NVIDIA Cluster Readiness Engine (nvcre) component#2523xdu31 wants to merge 2 commits into
Conversation
Signed-off-by: Jayson Du <jaydu@nvidia.com>
|
🌿 Preview your docs: https://nvidia-preview-feat-nvcre-component.docs.buildwithfern.com/aicr |
Recipe evidence check
No leaf overlays affected by this PR. This gate is warning-only and never blocks merge. |
ℹ️ Recent review info⚙️ Run configurationConfiguration used: Path: .coderabbit.yaml Review profile: ASSERTIVE Plan: Enterprise Run ID: 📒 Files selected for processing (5)
Included review availability: Your plan provides up to 12 included reviews per hour; 11 remain after this review. 📝 WalkthroughWalkthroughAdds the opt-in Estimated code review effort: 3 (Moderate) | ~20 minutes Merge Risk: ⚪ Minimal · up to This adds an unreferenced component registry entry, values, documentation, and health check without changing existing recipe behavior; no actionable merge-blocking risk remains beyond normal checks and review. Suggested reviewers: 🚥 Pre-merge checks | ✅ 4✅ Passed checks (4 passed)
✨ Finishing Touches🧪 Generate unit tests (beta)
Comment |
| # `metrics.serviceMonitor.enabled` (default true), so a referencing recipe | ||
| # needs prometheus-operator-crds ahead of it — as a dependencyRef, or by | ||
| # inheriting it from base.yaml — or must set the value to false. | ||
| - name: nvcre |
There was a problem hiding this comment.
MAJOR: This implements the registry decision before that decision is recorded or accepted. A registry entry is a stable AICR support commitment: the NVCRE chart and image, seven CRDs, cluster-scoped LogProfiles and RBAC, health contract, mirror and BOM coverage, dependencies, and future upgrades all become ours to qualify, but this PR has no ADR, named consumer, adoption path, ownership boundary, or acceptance gates. Because no recipe references nvcre, merging creates the same "ghost component" state identified in PR #2500. ADR-019 establishes the registry-admission precedent.
Minimum correction: keep only a proposed NVCRE ADR in this PR. Define the intended recipe or consumer, upstream/AICR ownership, non-goals, and proportional gates for the coherent chart/image/CRD/RBAC set, Kubeflow and ServiceMonitor ordering, mirror/BOM coverage, representative certification and cleanup behavior, lifecycle, and requalification. Move the registry, values, health check, catalog, and BOM implementation to a follow-up after the ADR is accepted.
| | **k8s-nim-operator** | NVIDIA NIM Operator for managing NIM (NVIDIA Inference Microservices) deployments on Kubernetes. AICR installs the operator only — it creates no `NIMService` and no credentials; see [NIM workload credentials](#nim-workload-credentials). | [K8s NIM Operator](https://github.com/NVIDIA/k8s-nim-operator) | | ||
| | **kueue** | Kubernetes-native job queuing system. Manages quotas and admits jobs for batch and AI workloads. Ships default quota CRs (ResourceFlavor `default-flavor`, ClusterQueue `cluster-queue`, LocalQueue `default` in the `default` namespace) so admission works out of the box — tune the ClusterQueue's nominal quotas to cluster capacity to enact real limits. Managed frameworks are pinned to batch/job, JobSet, and TrainJob. Upgrade note: the quota CRs are helm post-install/post-upgrade hooks with a delete-and-recreate policy — quiesce queues before upgrading the bundle (Kueue's resource-in-use finalizer on an active ClusterQueue/ResourceFlavor blocks the delete and can wedge the upgrade), and re-apply tuned quotas afterwards since upgrades reset them to the shipped defaults. Uninstalling leaves the hook-created CRs behind; delete them manually when removing Kueue. Overlays that override the component's `manifestFiles` (replacing the default quota CRs) must also override its health check — the shipped check asserts the default CR names above. | [Kueue](https://github.com/kubernetes-sigs/kueue) | | ||
| | **kubeflow-trainer** | Kubeflow Training Operator for distributed training jobs (PyTorch, etc.). Manages multi-node training job lifecycle with JobSet integration. | [Kubeflow Trainer](https://github.com/kubeflow/trainer) | | ||
| | **nvcre** | NVIDIA Cluster Readiness Engine — GPU cluster burn-in certification controller. Runs real training and NCCL communication workloads across topology-aware node groups, measures goodput and bandwidth, and bisects failing groups to isolate individual bad nodes. **Not installed by default**; opting in requires an explicit `componentRef` in an overlay or mixin. NVCRE drives its benchmarks through Kubeflow Trainer (the manager creates `TrainJob`s against a `TrainingRuntime`) and the chart does not install Trainer, so a referencing recipe must also carry `kubeflow-trainer`. The chart renders a `ServiceMonitor` by default, so `prometheus-operator-crds` must land first (or set `--set cre:metrics.serviceMonitor.enabled=false`). Chart and controller image are public on GHCR and pull anonymously. AICR's system toleration flag applies to the manager; the chart exposes no `nodeSelector` for it, so system node *selection* is not injected — use `--set cre:manager.affinity=...` or component values for hard placement. CLI aliases: `cre`, `cluster-readiness-engine`. | [Cluster Readiness Engine](https://github.com/NVIDIA/cluster-readiness-engine) | |
There was a problem hiding this comment.
MINOR: The placement guidance uses scalar-only --set for the object-valued manager.affinity field. An invocation such as --set cre:manager.affinity=system is accepted into the bundle but renders spec.template.spec.affinity: system, which Kubernetes rejects because affinity must be an object. The documented hard-placement path therefore cannot converge.
Minimum correction: replace it with a valid structured --set-json example (or a component-values example), and add a render assertion that the resulting Deployment affinity is an object.
Take Jayson's health check, fullnameOverride, hasSelfRefCRDs, and placement notes from #2523. Default ServiceMonitor off so install does not require prometheus-operator CRDs. Catalog uses --set-json for manager.affinity. Pin tests now walk overlays/mixins so nvcre stays opt-in. ADR remains #2541; this PR does not add one. Signed-off-by: Rohit Rajani <rorajani@nvidia.com>
| # disableValidation: true on the release so helm-diff skips the | ||
| # live-mapper check. Same pattern as kai-scheduler and gpu-operator. | ||
| # See https://github.com/NVIDIA/aicr/issues/914. | ||
| hasSelfRefCRDs: true |
There was a problem hiding this comment.
MAJOR — Enroll NVCRE in the audited CRD-owner set. This component ships and owns its NVCRE CRDs, but it sets only hasSelfRefCRDs; AICR emits Flux spec.upgrade.crds: CreateReplace only when ownsCRDs is true. A Flux upgrade can therefore leave installed CRDs at the old schema while the controller and CR instances move forward. Minimum correction: set ownsCRDs: true, add the pinned chart version to the ownership audit, and cover the generated Flux upgrade policy.
Take Jayson's health check, fullnameOverride, hasSelfRefCRDs, and placement notes from #2523. Default ServiceMonitor off so install does not require prometheus-operator CRDs. Catalog uses --set-json for manager.affinity. Pin tests now walk overlays/mixins so nvcre stays opt-in. ADR remains #2541; this PR does not add one. Signed-off-by: Rohit Rajani <rorajani@nvidia.com>
Take Jayson's health check, fullnameOverride, hasSelfRefCRDs, and placement notes from #2523. Default ServiceMonitor off so install does not require prometheus-operator CRDs. Catalog uses --set-json for manager.affinity. Pin tests now walk overlays/mixins so nvcre stays opt-in. ADR remains #2541; this PR does not add one. Signed-off-by: Rohit Rajani <rorajani@nvidia.com>
|
Superseded by #2524, which absorbs this PR in full. Verified file by file: The |
Take Jayson's health check, fullnameOverride, hasSelfRefCRDs, and placement notes from #2523. Default ServiceMonitor off so install does not require prometheus-operator CRDs. Catalog uses --set-json for manager.affinity. Pin tests now walk overlays/mixins so nvcre stays opt-in. ADR remains #2541; this PR does not add one. Signed-off-by: Rohit Rajani <rorajani@nvidia.com>
Take Jayson's health check, fullnameOverride, hasSelfRefCRDs, and placement notes from #2523. Default ServiceMonitor off so install does not require prometheus-operator CRDs. Catalog uses --set-json for manager.affinity. Pin tests now walk overlays/mixins so nvcre stays opt-in. ADR remains #2541; this PR does not add one. Signed-off-by: Rohit Rajani <rorajani@nvidia.com>
Take Jayson's health check, fullnameOverride, hasSelfRefCRDs, and placement notes from #2523. Default ServiceMonitor off so install does not require prometheus-operator CRDs. Catalog uses --set-json for manager.affinity. Pin tests now walk overlays/mixins so nvcre stays opt-in. ADR remains #2541; this PR does not add one. Signed-off-by: Rohit Rajani <rorajani@nvidia.com>
Summary
Adds the NVIDIA Cluster Readiness Engine (NVCRE) to the component registry as
nvcre, with default Helm values and a chainsaw health check. Registry-only — no recipe references it yet.Motivation / Context
NVCRE (formerly Excalibur) shipped its first public release, v0.1.0, and the chart and controller image are now public on GHCR. It validates GPU clusters with real workloads before production: it runs training and NCCL communication workloads across topology-aware node groups, measures goodput and bandwidth, and bisects failing groups to isolate individual bad nodes.
Registering it here is the prerequisite for recipes to pull it. The component is deliberately unreferenced in this PR so the registry entry, values, and health check can land and be reviewed independently of any recipe wiring.
Fixes: N/A
Related: N/A
Type of Change
Component(s) Affected
pkg/recipe)docs/,examples/)Implementation Notes
Naming. The entry is
nvcre, matching the chart's ownnameOverride, install namespace, and CRD group (nvcre.nvidia.com), rather than the longer chart namecluster-readiness-engine. Bothcreandcluster-readiness-enginearevalueOverrideKeys, so--set cre:...works.hasSelfRefCRDs: true. The chart shipsnvcre.nvidia.com_logprofiles.yamlincrds/and fourLogProfileCRs of that kind intemplates/(nccl-bandwidth,nccl-loopback,megatron-training,megatron-bridge). On a fresh cluster helm-diff's render pass fails withno matches for kind LogProfilebecause onlyhelm installappliescrds/before rendering. Same pattern askai-schedulerandgpu-operator(#914).nodeSchedulingcarriestolerationPathsonly. The chart's Deployment template rendersaffinityandtolerationsbut has nonodeSelectorblock, so a system node selector written into values would be silently dropped. Listingmanager.nodeSelectorwould advertise placement control that does not exist. The toleration path still narrows placement rather than widening it: the chart default is a blankettolerations: [{operator: Exists}], which tolerates every taint in the cluster including tainted GPU nodes; replacing it with the recipe's system tolerations keeps the manager on the intended node class. Only the manager is covered — NVCRE schedules its own benchmarks through Kubeflow Trainer, and those belong on GPU nodes.Consumer prerequisites, documented on the registry entry and in the catalog, for whoever wires the first recipe:
TrainJobs against aTrainingRuntime. The chart does not install Kubeflow Trainer, so a referencing recipe must also carrykubeflow-trainer.ServiceMonitorunconditionally undermetrics.serviceMonitor.enabled(defaulttrue), soprometheus-operator-crdsmust land first — as adependencyRefor inherited frombase.yaml— or the value must be set tofalse.fullnameOverride: nvcrein the component values keeps resource names atnvcre-*instead of theaicr-stack-release prefix. The health check asserts the Deployment by name, so the two are coupled; both files note it.Health check asserts what a caller actually depends on rather than inferring it from pod health: the manager Deployment is ready, the
certifications/workloadruns/bandwidthmeasurementsCRDs areEstablished(without them a create fails withno matches for kind), and the cluster-scopednccl-bandwidthLogProfileis present (without it the BandwidthMeasurement controller has no parse rules andstatus.results[]stays empty).readyReplicasisomitempty, soreadyReplicas > 0is used to fail closed rather than passing vacuously the wayunavailableReplicas == 0would.Testing
make bom-docs # +1 component, +1 image: ghcr.io/nvidia/cluster-readiness-engine/manager:v0.1.0 make qualifyRendered the chart at the pinned version against
recipes/components/nvcre/values.yamland confirmed every name the health check asserts:make qualify: all change-relevant packages pass —pkg/recipe90.0%,pkg/bundler86.4%,pkg/component78.6%,recipesok. Two packages fail on my macOS workstation for reasons unrelated to this change and independent of it:pkg/oci(TestHelmPinnedVersionExplicitVersionPull— local helm is v4.2.0 against the v4.2.4 pin) andtests/releasepolicy(timeout: command not foundanddeclare: -A: invalid optionunder bash 3.2). No Go source changed in this PR.Risk Assessment
Rollout notes: Additive and inert. No overlay or mixin references
nvcre, so no existing recipe changes shape and no bundle gains a release. The only effect on existing output is the BOM's component count and one new image row.Checklist
make testwith-race)make lint)git commit -S)