CSP End-to-End Example Installation (Helmfile)
CSP End-to-End Example Installation (Helmfile)
This page provides a complete end-to-end example for installing NVCF on pre-provisioned managed Kubernetes clusters using the split Helmfile bundles. It covers both topologies:
- Single-cluster: the control plane and the NVCA operator run on the same cluster.
- Multi-cluster: the control plane runs on one cluster, and the NVCA operator is registered and installed on a separate GPU (compute) cluster.
The commands are written to work on any cloud provider (CSP). Amazon EKS is used
as the worked example. The only provider-specific pieces are the load balancer
annotations on the Gateway, the storageClass name, and the kubectl context
names. Substitute the equivalents for GKE, AKS, or on-prem.
For a deeper reference on each release and on values, see Helmfile Installation. For pulling and mirroring the bundles and images, see Image Mirroring.
This guide assumes you have already downloaded and extracted the control-plane Helmfile bundle and have a source checkout for the compute plane:
nvcf-self-managed-stackfor the control plane.deploy/stacks/nvcf-compute-planein the source repository for the compute plane (NVCA operator).
Control-plane commands run from inside the nvcf-self-managed-stack directory.
Compute-plane commands run from the repository root with make -C.
Installation order
The order matters. Each step produces an input that the next step needs. The
load balancer address, in particular, must exist before you configure the
environment file, because it becomes global.domain and the NVCA Host headers.
Single-cluster and multi-cluster share steps 1 through 4. Step 5 requires a compute-plane environment file for both topologies. Only the cluster target and control-plane endpoint values differ. See Single-cluster vs multi-cluster.
Prerequisites
Tools
Install on the machine you run these commands from:
kubectlhelm(3.x)helmfilenvcf-cli
Clusters
The clusters must be provisioned before you start. This guide does not create them. Each cluster needs:
- A default-capable
StorageClasswith dynamic provisioning. On EKS this isgp3, backed by the EBS CSI driver. Substitute your provider’s class name. - The compute (GPU) cluster needs a GPU operator (real or the fake GPU operator for non-GPU validation). See Fake GPU Operator.
- The compute cluster needs the
SMB CSI driver
(
smb.csi.k8s.io). NVCA uses it for shared model cache storage that function worker pods mount. Install and verify the driver before registering the GPU cluster. See the Self-Managed Clusters prerequisites for the installation command.
Both clusters must be reachable through kubectl contexts:
Environment variables
Set these once. In single-cluster, COMPUTE_CONTEXT equals
CONTROL_PLANE_CONTEXT.
Log in to the chart and image registry
The bundles pull OCI charts through Helm, so host-side registry auth must exist
before any helmfile sync:
Step 1: Install the Gateway and capture the load balancer address
Install the Gateway on the control-plane cluster by following the
Gateway quickstart. It installs the
Gateway API CRDs, the Envoy Gateway controller, the GatewayClass, and the
nvcf-gateway Gateway, and exports GATEWAY_ADDR. Run it against
${CONTROL_PLANE_CONTEXT}.
This guide’s NVCA path also routes NATS. Make sure the nvcf-gateway Gateway
includes a nats listener on port 4222 (in addition to the http and tcp
listeners from the quickstart), and enable routes.nats.enabled in the
environment file in Step 2.
After the quickstart, confirm the address is set:
The gRPC listener is on this same Gateway at port 10081, so the gRPC address is
${GATEWAY_ADDR}:10081 (used in the nvcf-cli config below).
Why the NVCA Host headers matter: the NVCA agent dials the bare load balancer
URL (which resolves through DNS) and sends a per-service hostname as the HTTP
Host header (sis.<addr>, reval.<addr>, nats.<addr>) so the Gateway
HTTPRoutes match. These are set as global.nvcaOperator.selfManaged.*Override
in the compute-plane environment file in Step 5. This requires
helm-nvca-operator 1.12.0 or later.
Step 2: Configure the control-plane environment and secrets files
This step produces two files in the nvcf-self-managed-stack bundle: the
environment values file environments/<env>.yaml (copied from base.yaml) and
the secrets file secrets/<env>-secrets.yaml (copied from
secrets.yaml.template). Both are required before the install.
From the nvcf-self-managed-stack directory, copy the base template. The file
name (<env>) must match HELMFILE_ENV.
Edit environments/${HELMFILE_ENV}.yaml. Every field is explained inline below.
Lines marked CHANGE must be updated for your cluster; replace the ${...}
values with the literals you exported earlier.
Create the registry pull secret
The control-plane charts reference an image pull secret named nvcr-pull-secret
in each namespace. Create it in every control-plane namespace:
Create the bundle secrets file
The control-plane bundle reads a secrets file for the OpenBao migration and API account bootstrap. Create it from the template and set the base64 dockerconfig credential:
Do not commit the populated secrets file or the environment file. They contain cluster-specific and credential material.
Step 3: Install the control plane
Run from the nvcf-self-managed-stack bundle directory:
Verify the releases are deployed:
Expected releases include nats, cert-manager, openbao-server, cassandra,
api-keys, sis, api, nvct-api, invocation-service, grpc-proxy,
ess-api, notary-service, admin-issuer-proxy, reval,
nats-auth-callout-service, and ingress.
Confirm global.domain propagated into the API HTTPRoute hostname:
Step 4: Author the nvcf-cli config
Create nvcf-cli.yaml pointing at the load balancer address. The static fields
are the same across self-hosted installs; only the URL and Host fields are
derived from GATEWAY_ADDR.
Step 5: Register the GPU cluster and install the NVCA operator
This is where single-cluster and multi-cluster diverge. Pick the matching section. Run both from the source repository root.
Create the compute-plane environment file for either topology. The compute-plane
Makefile reads
deploy/stacks/nvcf-compute-plane/environments/${HELMFILE_ENV}.yaml, and the
selfManaged values tell the NVCA agent how to reach the control plane. The
sections below use different cluster targets and endpoint values.
Set these keys in
deploy/stacks/nvcf-compute-plane/environments/${HELMFILE_ENV}.yaml:
Then follow the matching subsection below.
Single-cluster
The GPU cluster is the same cluster as the control plane, so registration uses
the current context. Create the pull secret in nvca-operator; the operator
propagates it to the managed namespaces after installation:
Register, then install:
Multi-cluster
The NVCA operator installs on a separate compute cluster. Two extra concerns:
- Registration must discover the OIDC issuer and JWKS from the compute cluster,
not the control-plane cluster. Switch the context to the compute cluster and
pass a compute-scoped kubeconfig to
register-cluster. - The compute-plane environment file must carry the control-plane service URLs and Host headers so the agent on the compute cluster can reach the control plane through the Gateway.
Register with the compute cluster context active. The registration step probes
the current context for its JWKS. If the control-plane context is active, the
control-plane JWKS is recorded for the compute cluster, and the compute agent
then fails authentication at runtime with Signed JWT rejected: no matching key(s) found.
You already created the compute-plane environment file with the selfManaged
values above. Create the pull secret in nvca-operator on the compute cluster;
the operator propagates it to the managed namespaces after installation. Also
create a compute-scoped kubeconfig:
Register with the compute context active, then install onto the compute cluster:
make register-cluster runs nvcf-cli init (mints the admin token) and then
cluster register, and writes
registration/${CLUSTER_NAME}-register-values.yaml. make install consumes
that file. If you skip register-cluster, make install fails with a
“Registration values not found” error.
Step 6: Verify the agent is healthy
Confirm the NVCA operator is deployed and the backend reports the agent healthy. Use the compute context (equal to the control-plane context in single-cluster):
Confirm that the operator propagated the pull secret to nvca-system:
The agent reaching healthy confirms registration and the Host-header wiring
are correct.
Single-cluster vs multi-cluster
Known limitations
Cross-cluster function execution is not supported by the current NVCA operator
chart. Registration and agent health work across clusters and regions, but the
agent injects the control plane’s in-cluster service names into worker pods
(for example api.nvcf.svc.cluster.local), which do not resolve from a separate
compute cluster. Functions deployed to a remote compute cluster cannot fetch
artifacts and will error. The selfManaged.*Override values configure the
agent’s own connections, not the worker pod environment. Use single-cluster for
end-to-end function execution until worker FQDNs can be externalized.
Troubleshooting
- Gateway never becomes
Programmed: check the load balancer annotations match your provider and that the controller pod inenvoy-gateway-systemis running. make installreports “Registration values not found”: runmake register-clusterfirst, in the same directory, with the sameCLUSTER_NAME.- Compute agent fails with
no matching key(s) found: you registered with the wrong context active. Switch to the compute context and re-runmake register-cluster.
See Troubleshooting for more.