Component Catalog
July 21, 2026 · View on GitHub
AICR recipes are composed of components — the individual software packages that make up a GPU-accelerated Kubernetes runtime. This page lists every component that can appear in a recipe.
Note: Components are included as appropriate in recipes. Not every component listed here will appear in a recipe.
The source of truth is recipes/registry.yaml. Each entry in the registry defines the component's Helm chart (or Kustomize source), default version, namespace, and node scheduling configuration. If a component is not listed there, it cannot appear in a recipe.
See also: Recipe Health reports the structural health of every recipe these components compose into — resolvability and chart-pin hygiene across the whole criteria matrix.
Components
| Component | Description | Source |
|---|---|---|
| gpu-operator | Manages the GPU driver and runtime lifecycle on Kubernetes nodes. Handles driver installation, container runtime configuration, device plugin, and GPU feature discovery. | NVIDIA GPU Operator |
| network-operator | Manages high-performance networking for GPU workloads. Configures RDMA, SR-IOV, and host networking for multi-node communication. | NVIDIA Network Operator |
| nfd | Node Feature Discovery — labels nodes with hardware features (PCI device IDs, kernel modules, CPU capabilities). Both gpu-operator and network-operator consume these labels. On production GPU recipes, the Topology Updater publishes per-node NodeResourceTopology CRDs describing NUMA zones and GPU/NIC affinity for downstream NUMA-aware schedulers. | Node Feature Discovery |
| gke-nccl-tcpxo | NCCL TCPxO network plugin for GKE. Provides optimized collective communication for multi-node GPU workloads on Google Kubernetes Engine. GKE-specific. | — |
| aws-efa | Device plugin for AWS Elastic Fabric Adapter. Enables low-latency networking on EKS clusters with EFA-capable instances. EKS-specific. | AWS EFA K8s Device Plugin |
| cert-manager | Automates TLS certificate management. Required by several operators for webhook and API server certificates. | cert-manager |
| gatekeeper | Admission controller for Kubernetes. Enforces policies and governance across the cluster using OPA (Open Policy Agent) ConstraintTemplates and Constraints. | Open Policy Agent Gatekeeper |
| nodewright-operator | OS-level node tuning and configuration management. Applies kernel parameters, sysctl settings, and system-level optimizations to nodes. | Nodewright |
| nodewright-customizations | Environment-specific node tuning profiles applied via Nodewright. Extends the operator with kernel params, hugepages, and other host-level configurations. | — |
| nvsentinel | GPU health monitoring and automated remediation. Detects GPU errors and can cordon or drain affected nodes. | NVSentinel |
| nvidia-dra-driver-gpu | Dynamic Resource Allocation (DRA) driver. Advertises devices via the Kubernetes resource.k8s.io API (v1 on 1.34+, v1beta1/v1beta2 on 1.32/1.33) — ComputeDomain/IMEX channels for MNNVL platforms, and optionally whole GPUs. Stock recipes disable whole-GPU DRA advertisement (resources.gpus.enabled: false) — the device plugin is the production default whole-GPU advertiser, and DRA whole-GPU allocation is an experimental recipe-level opt-in (#1327). Whole-GPU DRA and the GPU Operator device plugin (nvidia.com/gpu) are mutually exclusive per node: recipe-backed validation rejects a configuration that enables both (at policy-resolution time — skipping validation bypasses the check), because the two allocators keep independent ledgers and concurrent advertisement can double-allocate the same physical GPUs (see the guidance in recipes/components/nvidia-dra-driver-gpu/values.yaml). See AKS GPU Setup for details. CLI alias: dradriver. | NVIDIA DRA Driver |
| prometheus-operator-crds | Custom Resource Definitions for the prometheus-operator (Alertmanager, AlertmanagerConfig, PodMonitor, Probe, Prometheus, PrometheusRule, ServiceMonitor, ThanosRuler). Shipped as a separate release so the CRDs land before any chart that creates monitoring CRs; this breaks the helm-diff self-reference that otherwise blocks helmfile apply on a fresh cluster. | prometheus-operator-crds |
| kube-prometheus-stack | Cluster monitoring: Prometheus, Grafana, Alertmanager, and node exporters. Provides GPU and cluster metrics collection and dashboards. CRDs are installed by the sibling prometheus-operator-crds release (this chart runs with crds.enabled: false). | kube-prometheus-stack |
| prometheus-adapter | Exposes custom metrics from Prometheus to the Kubernetes metrics API. Enables HPA scaling based on GPU utilization and other custom metrics. | prometheus-adapter |
| aws-ebs-csi-driver | CSI driver for Amazon EBS volumes. Provides persistent storage for workloads on EKS. EKS-specific. Cluster-wide default StorageClass: AICR enables defaultStorageClass.enabled, so this component provisions a cluster-default gp3 StorageClass (ebs-csi-default-sc) on every EKS cluster that includes it — not just inference recipes; training overlays inherit it too. EKS ships no default SC of its own, so this makes dynamic provisioning (e.g. the inference-perf model cache) work zero-config. Two consequences to note: (1) if the cluster already has a default SC, Kubernetes treats multiple defaults as ambiguous — unset the other; (2) a PVC that previously failed-fast on "no default SC" will now silently bind gp3, which can mask a misconfiguration. | AWS EBS CSI Driver |
| k8s-ephemeral-storage-metrics | Exports ephemeral storage usage metrics per pod. Useful for monitoring scratch space consumption on GPU nodes. | k8s-ephemeral-storage-metrics |
| kai-scheduler | Gang scheduler with hierarchical queues and topology-aware placement; works with device-plugin (nvidia.com/gpu) and DRA GPU allocation alike. Ensures distributed training jobs land on nodes with optimal interconnect topology. | KAI Scheduler |
| grove | Pod lifecycle management for Dynamo inference platform. Installed as a standalone component. | Grove |
| dynamo-platform | NVIDIA Dynamo inference serving platform with bundled CRDs. Distributed inference with KV-cache-aware routing, Dynamo request-plane traffic, a NATS-backed Kubernetes event plane for KV-cache events, and disaggregated prefill/decode. | Dynamo |
| agentgateway-crds | Custom Resource Definitions for agentgateway (Kubernetes Gateway API implementation for AI/ML inference). | agentgateway |
| agentgateway | Kubernetes Gateway API implementation for AI/ML inference. Implements the Gateway API Inference Extension for model-aware ingress routing to InferencePool backends. | agentgateway |
| k8s-nim-operator | NVIDIA NIM Operator for managing NIM (NVIDIA Inference Microservices) deployments on Kubernetes. | 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 |
| kubeflow-trainer | Kubeflow Training Operator for distributed training jobs (PyTorch, etc.). Manages multi-node training job lifecycle with JobSet integration. | Kubeflow Trainer |
| slinky-slurm-operator-crds | Custom Resource Definitions for the SchedMD Slinky Slurm operator. Installs the slinky.slurm.net CRDs (Controller, NodeSet, LoginSet, Accounting, RestApi, Token). Installed separately to support CRD lifecycle management. | Slinky Slurm Operator |
| slinky-slurm-operator | SchedMD Slinky Slurm operator and admission webhook. Manages the lifecycle of Slurm clusters declared via Slinky CRs (Controller, NodeSet, LoginSet, Accounting, RestApi, Token). AICR's system node-selector and toleration bundle flags apply to both deployments; affinity remains available through component values or typed overrides. | Slinky Slurm Operator |
| slinky-slurm | Slinky-managed Slurm cluster instance: Controller (slurmctld) + LoginSet (sackd/sshd) + NodeSet (slurmd) + RestApi (slurmrestd). Reconciled by slinky-slurm-operator. Declared inline per slurm leaf overlay alongside slinky-slurm-operator-crds and slinky-slurm-operator (matching the dynamo-platform pattern) so each leaf can carry its own GPU/GRES tuning. IMEX-capable leaves attach a fixed NVIDIA DRA ComputeDomain as a pre-manifest before the Slurm chart; the DRA driver reconciles it asynchronously into the ResourceClaimTemplate consumed by the NodeSet. Accounting (slurmdbd) requires an external MariaDB and is disabled in defaults — see Slurm Accounting. | Slinky Slurm Cluster Chart |
| slinky-topograph | Slinky/Slurm-scoped instance of Topograph — queries cloud provider topology APIs (GCP, AWS, OCI …) to generate Slurm topology.conf, enabling topology-aware placement decisions in the Slinky-managed scheduler. Not installed by default; leaf overlays opt in by adding an explicit componentRef entry for slinky-topograph — the componentRef is what schedules the release; dependencyRefs alone does not install anything. That componentRef declares slinky-slurm as a dependencyRef to deploy after it: slinky-slurm renders and owns the slinky-slurm-config-extra ConfigMap (from its configFiles, mounted into slurmctld via the Controller CR's configFileRefs), and Topograph patches only that ConfigMap's topology.conf key on each sync, preserving the chart-owned cgroup.conf/gres.conf keys — Helm has to own the ConfigMap first. TopologyPlugin: topology/tree is set per-leaf via slinky-slurm's controller.extraConfMap. Includes the node-observer sub-chart, which watches the topograph API pod and regenerates topology on restarts or selected node/pod changes. Requires cloud provider IAM access (e.g. GCP roles/compute.viewer for Workload Identity). | Topograph |
| nfd-ocp-olm | OLM installer for Node Feature Discovery on OpenShift. Creates the OperatorGroup and Subscription resources that install NFD via the Operator Lifecycle Manager. Paired with nfd-ocp. OCP-specific. | Node Feature Discovery (Certified) |
| nfd-ocp | Node Feature Discovery CR for OpenShift. Configures NFD's operand (worker, topology updater) via a NodeFeatureDiscovery custom resource. Deployed after nfd-ocp-olm. OCP-specific. | Node Feature Discovery |
| gpu-operator-ocp-olm | OLM installer for the GPU Operator on OpenShift. Creates the OperatorGroup and Subscription resources that install the certified GPU Operator via the Operator Lifecycle Manager. Paired with gpu-operator-ocp. OCP-specific. | NVIDIA GPU Operator (Certified) |
| gpu-operator-ocp | GPU Operator ClusterPolicy CR for OpenShift. Configures the GPU Operator's runtime behavior (driver, toolkit, DCGM, device plugin, MIG manager) via a ClusterPolicy custom resource. Deployed after gpu-operator-ocp-olm. OCP-specific. | NVIDIA GPU Operator |
| network-operator-ocp-olm | OLM installer for the Network Operator on OpenShift. Creates the OperatorGroup and Subscription resources that install the certified Network Operator via the Operator Lifecycle Manager. Paired with network-operator-ocp. OCP-specific. | NVIDIA Network Operator (Certified) |
| network-operator-ocp | Network Operator NicClusterPolicy CR for OpenShift. Configures RDMA, MOFED driver, shared device plugin, and NV-IPAM via a NicClusterPolicy custom resource. Deployed after network-operator-ocp-olm. OCP-specific. | NVIDIA Network Operator |
How Components Are Selected
Not every component appears in every recipe. The recipe engine selects components based on the overlay chain for your environment:
- Base components (cert-manager, kube-prometheus-stack) appear in most recipes.
- Cloud-specific components (aws-efa, aws-ebs-csi-driver) are added when the service matches. OCP recipes replace base components (gpu-operator, nfd, network-operator) with OLM+CR pairs (e.g.,
gpu-operator-ocp-olm+gpu-operator-ocp). - Intent-specific components (agentgateway, agentgateway-crds) are added based on workload intent (e.g., inference recipes include the inference gateway).
- Platform-specific components (slinky-slurm-operator, slinky-slurm, kubeflow-trainer, dynamo-platform) are added when the recipe selects a matching
--platform. For--platform slurm, all three core Slinky pieces (slinky-slurm-operator-crds,slinky-slurm-operator,slinky-slurm) are declared inline per slurm leaf overlay — the same shapedynamo-platformuses across*-inference-dynamoleaves. IMEX-capable Slurm leaves attach a fixed ComputeDomain throughslinky-slurm.preManifestFilesso slurmd pods can consume DRA-provisioned IMEX channels. Leaves that want the operator only inline the CRDs + operator and omit theslinky-slurmcomponentRef. For an end-to-end walkthrough (recipe → bundle → install → validate →srunsmoke job on AKS, EKS, GKE, or Kind), seedemos/cuj1-slinky-slurm.md. - Topology-aware optional components (
slinky-topograph) are not installed by default. Opting in requires an explicitcomponentRefentry forslinky-topographin the leaf overlay — thecomponentRefis what installs it;dependencyRefsalone does not. ThatcomponentRefdeclaresslinky-slurmas adependencyRef, so Topograph deploys after the Slurm cluster chart, which owns the ConfigMap Topograph patches. See the wiring example in the Recipe Development Guide. - Accelerator/OS-specific tuning (nodewright-customizations, nvidia-dra-driver-gpu) varies by hardware and OS combination.
NFD Topology Updater
Production GPU leaf recipes (H100, GB200, RTX Pro 6000 on EKS / AKS / GKE / OKE / LKE) enable the NFD Topology Updater. It publishes per-node NodeResourceTopology CRDs that describe NUMA zones, GPU-to-NUMA affinity, and NIC-to-NUMA affinity. Runtime consumers (NUMA-aware schedulers, debugging via kubectl get noderesourcetopologies) can read these CRDs without further configuration.
The Topology Updater requires the kubelet podResources gRPC socket. The KubeletPodResources feature gate has been on by default since Kubernetes 1.15 (Beta) and reached GA in Kubernetes 1.28; AICR's recipe constraints on the affected leaves require K8s ≥ 1.30 or higher, so this is satisfied in practice. Recipes targeting Kubernetes < 1.15 must enable the feature gate explicitly. Kind / KWOK simulated clusters do not run a real kubelet and therefore leave the Topology Updater disabled — kind-based recipes will not see NodeResourceTopology CRDs.
See the upstream Topology Updater docs for runtime consumer examples.
GPU Operator Driver Auto-Detect
When a recipe is resolved from a snapshot (aicr recipe --snapshot snap.yaml, or the ResolveRecipeFromSnapshot SDK entry point), AICR reads the sampled GPU node's driver-loaded measurement and, when the NVIDIA kernel module is already loaded, injects components.gpu-operator.overrides.driver.enabled=false into the resolved recipe. The override lands at the top of the merge chain (base values.yaml → ValuesFile → Overrides), so the rendered Helm values a deployer installs carry driver.enabled: false regardless of what the resolved overlay's values file would default to. This prevents the GPU Operator from installing a second driver on top of one the platform has already provisioned. Explicit CLI --set flags retain higher precedence and can still supersede the injection when needed.
Injection is gated to overlays that already declare driver.enabled=false in their merged base+valuesFile — the marker for a full coordinated preinstalled-driver profile (also carrying toolkit.enabled=false and the correct hostPaths.driverInstallDir where applicable). That scopes auto-detect to overlays like GKE-COS and OKE where every dependent setting is already aligned. Bare AKS/EKS overlays lack the marker; the auto-detect skips them and logs a warning (gpu-operator driver auto-detect: pre-installed driver observed …) telling the operator to use a preinstalled-profile overlay rather than land a half-configured Operator (driver off, toolkit and gdrcopy still enabled with no operator-managed driver root). The two cases still tracked as separate work:
- AKS — nodepools created with
--gpu-driver Install(Azure provisions the driver). Today this warns; a full preinstalled AKS overlay is tracked separately. See the AKS driver-only profile for the coordinated settings such an overlay must carry. - EKS — GPU-optimized AMIs that ship an NVIDIA driver preinstalled on the AMI itself. Today this warns; a full preinstalled EKS overlay is tracked separately.
On overlays that already carry the profile (GKE-COS, OKE), the injection is semantically idempotent — the rendered driver.enabled value is unchanged; the resolved recipe records the override explicitly (visible in aicr recipe -o recipe.yaml) so the reason for the value is auditable end-to-end.
The policy is only-false: the auto-detect never forces driver.enabled=true, so recipes resolved without a snapshot (or targeting a node without a loaded driver) fall back to today's static defaults. Two operational consequences:
- Criteria-only resolves (
aicr recipe --service ... --accelerator ...) and no-cluster mode see zero behavior change — no snapshot, no override. - A stale snapshot from an older CLI that omits the
driver-loadedreading is treated as unknown, not absent, so it cannot flip a hardened overlay.
Capture the snapshot BEFORE deploying the GPU Operator. The driver-loaded reading is installer-agnostic — it reports whether the nvidia kernel module is currently loaded, not who loaded it. A snapshot taken after a prior AICR deploy has run the operator's driver container will still report driver-loaded=true, and a re-resolve from that post-deploy snapshot would flip a working overlay toward driver.enabled=false, tearing the operator-managed driver DaemonSet down and leaving new or rebooted GPU nodes driverless. AICR emits a gpu-operator driver auto-detect: driver-loaded=true AND a ClusterPolicy is already present… warning when both signals appear together in the same snapshot, but the guard is observability, not prevention: a pre-deploy snapshot is the intended workflow.
The signal is a single-node sample: the snapshotter Job runs on one nvidia.com/gpu.present=true node, so its driver-loaded reading is representative only when every GPU pool is in the same driver state. Mixed-pool clusters (some nodes with a preinstalled driver, some without) are out of scope for the auto-detect and tracked in #464; AICR emits a topology reports non-uniform GPU labels… warning when the snapshot's node-topology labels indicate divergent GPU nodes so the fail-direction (some non-preinstalled pools may come up driverless) is at least observable.
To see exactly which components appear in a given recipe, generate one:
aicr recipe --service eks --accelerator h100 --os ubuntu --intent training -o recipe.yaml
The output lists every component with its pinned version and configuration values.
Inference Gateway Network Exposure
Inference recipes include the agentgateway component, which deploys an inference-gateway Gateway. The agentgateway controller materializes that Gateway into a Service of type LoadBalancer, so on every cloud the platform provisions a load balancer for the (plaintext HTTP, unauthenticated) inference endpoint. Left unrestricted that load balancer is internet-facing, so aicr bundle scopes it to private networks by default — the opt-in path for public exposure and the validation behavior are described below.
aicr bundle is private by default: when a bundle includes agentgateway and agentgateway.allowedSourceRanges is empty or unset, the bundler injects the private RFC1918 ranges (10.0.0.0/8, 172.16.0.0/12, 192.168.0.0/16) into the generated Service's spec.loadBalancerSourceRanges. The deployed gateway is therefore reachable from inside the cluster/VPC (and from privately-routed peers) but denied to the public internet — it is never emitted open to 0.0.0.0/0 without an explicit opt-in. (Kubernetes treats an empty loadBalancerSourceRanges as allow-all, so a safe default has to be a real list, not an empty one.) A bundle note records when the default was applied.
To restrict it to specific trusted networks instead — for example to allow a corporate VPN, which egresses from a public IP and is therefore not covered by the RFC1918 default — set agentgateway.allowedSourceRanges to a list of CIDR (Classless Inter-Domain Routing) blocks. The values replace the default and are rendered into the generated Service's spec.loadBalancerSourceRanges, which the AWS, GCP, Azure, and OCI cloud load balancers all honor — so one setting locks the gateway down on every platform.
Do not use plain --set for this key. --set agentgateway:allowedSourceRanges=<cidr> writes loadBalancerSourceRanges as a bare string instead of a list; the bundler rejects that with ErrCodeInvalidRequest (a bare scalar would render a type-invalid Service). Use the list-aware --set-json / --set-file flags from the CLI:
aicr bundle -r recipe.yaml \
--set-json agentgateway:allowedSourceRanges='["216.228.127.128/30"]'
or scope the gateway through a recipe overlay or componentRef override:
componentRefs:
- name: agentgateway
type: Helm
overrides:
allowedSourceRanges:
- 216.228.127.128/30 # e.g. corporate egress
The default is the generic RFC1918 private set rather than a fixed customer CIDR: a baked-in specific range would firewall every downstream deployment to one network and lock other operators out of their own gateway. RFC1918 is universal — it trusts only privately-routed traffic — so it is a safe default that still denies the public internet. Override it whenever you need to admit a specific public client.
If public exposure is genuinely intended, opt in explicitly with an any-source CIDR — bundle generation then succeeds but logs a loud warning that the gateway is open to the entire internet:
aicr bundle -r recipe.yaml \
--set-json agentgateway:allowedSourceRanges='["0.0.0.0/0"]'
This setting filters by source IP only; it does not add TLS or authentication to the gateway listener.
Exposure guardrails
AICR enforces and surfaces inference-gateway exposure in two places:
- Bundle-time private-by-default. When a bundle includes
agentgatewayandallowedSourceRangesis empty/unset,aicr bundleinjects the RFC1918 private ranges so the deployed gateway denies the public internet, and records a bundle note. An invalid value (a bare-string--set, a non-list, an unparseable CIDR, or a non-canonical CIDR such as1.2.3.4/24that Kubernetes' strict validation would reject at apply time) is rejected withErrCodeInvalidRequest. A scoped list passes silently; an explicit any-source CIDR (0.0.0.0/0or::/0) passes with a loud warning as a deliberate opt-in. See #1373. - Conformance check. The
inference-gatewayconformance check (run duringaicr validate --phase conformanceon a live cluster) inspects the gateway'sLoadBalancerService and records its exposure as evidence — the source ranges if scoped, or an explicit "open to0.0.0.0/0" finding if not. SetAICR_REQUIRE_SCOPED_INFERENCE_GATEWAY=trueon the validator environment to escalate an open gateway to a check failure.
Adding Components
New components are added declaratively in recipes/registry.yaml — no Go code required. See the Contributing Guide and Components docs for details.
Upgrade Notes
Migration steps when upgrading from a prior AICR-generated bundle to a newer one that changes how a component delivers its Kubernetes resources.
A generated recipe is a point-in-time artifact of the AICR binary that produced it: the embedded registry, overlays, manifest paths, and chart pins are part of that binary's surface. When upgrading AICR, regenerate the recipe from scratch with the new binary (aicr recipe ...) before re-bundling. aicr bundle --recipe <old-file> against a newer binary may fail if the saved recipe references manifest paths the new release has moved or removed (see Bundle Generation Fails for the specific error).
gpu-operator: dcgm-exporter ConfigMap moved into the main release
Earlier bundles shipped the dcgm-exporter ConfigMap as a post-manifest in a separate Helm release named gpu-operator-post. The in-cluster ConfigMap therefore carries ownership annotations pointing at that release:
meta.helm.sh/release-name: gpu-operator-post
meta.helm.sh/release-namespace: gpu-operator
Newer bundles render the ConfigMap directly from the main gpu-operator chart's dcgmExporter.config.data values. On upgrade, Helm 3 refuses to claim the existing ConfigMap because its annotations point at a different release:
Error: ConfigMap "dcgm-exporter" in namespace "gpu-operator" exists and cannot be
imported into the current release: invalid ownership metadata; annotation
validation error: key "meta.helm.sh/release-name" must equal "gpu-operator":
current value is "gpu-operator-post"
Fresh installs are not affected. To migrate an existing cluster, remove the stale gpu-operator-post release before applying the new bundle.
Raw Helm (per-component bundle / deploy.sh):
helm uninstall gpu-operator-post --namespace gpu-operator
helm uninstall removes the ConfigMap it owns; the next gpu-operator upgrade re-creates it from values.
Helmfile — the new bundle no longer references gpu-operator-post, so helmfile apply will not prune it on its own. Run the helm uninstall above first, then helmfile apply.
Argo CD — delete the stale Application (it will not self-prune unless an ApplicationSet was managing it), then sync the updated gpu-operator application:
argocd app delete gpu-operator-post --cascade
Flux — delete the stale HelmRelease so Flux uninstalls the release and removes the ConfigMap, then reconcile the updated gpu-operator HelmRelease. The example below assumes the Flux control plane runs in flux-system; substitute the namespace where your Flux installation lives:
kubectl delete helmrelease gpu-operator-post --namespace flux-system
After migration, confirm the ConfigMap is owned by the gpu-operator release:
kubectl get configmap dcgm-exporter -n gpu-operator \
-o jsonpath='{.metadata.annotations.meta\.helm\.sh/release-name}'
# Expected: gpu-operator