LLM Function Enablement
Enable the LLM addon before creating or invoking functions with
functionType: "LLM" through the LLM invocation route. The addon deploys the
LLM API Gateway and LLM request router, creates the external LLM invocation
route, and configures worker pods to use the pylon sidecar for model-aware
routing.
For LLM function payload shape and invocation examples, see Function Creation and LLM Gateway. For request-router deployment, trusted headers, and rollout validation, see LLM Request Router Load Balancing.
When to Enable
Enable the LLM addon when NVCF should route OpenAI-compatible requests by
function and model through llm.invocation.<domain>. The gateway extracts the
function ID from the OpenAI model field, applies LLM-specific validation and
rate limits, and sends the request through the LLM request router.
Standard HTTP, gRPC, and LLS functions do not require this addon, even when a
container exposes paths such as /v1/chat/completions, /v1/responses, or
/v1/embeddings.
When enabled, the stack creates:
llm-api-gatewayin thenvcfnamespace.llm-request-routerin thenvcfnamespace.- The
llm.invocation.<domain>HTTPRoute when Gateway API ingress is enabled. - LLM worker pods with a
pylonsidecar that forwards requests to the function container on the configuredinferencePort.
Production TLS Configuration
Production deployments must secure the QUIC transport between each LLM worker
and the request router. The request router presents a certificate issued by
cert-manager, or one you issue yourself and supply in a pre-created Secret.
Each compute plane receives the public root CA certificate and uses the
combined system and private trust bundle in the llm-worker sidecar.
The request-router address configured for the compute plane must use a DNS name
listed in the certificate SANs. For a single-cluster deployment, use
llm-request-router.nvcf.svc.cluster.local:50071. Use an address reachable from
each compute cluster when the control and compute planes use separate networks.
Managed OpenBao issuer
The default managed configuration installs ClusterIssuer/nvcf-openbao-pki
through the helm-nvcf-pki chart. It uses the stack’s OpenBao service as the
signing backend.
Add the following values to the Helmfile environment:
The stable service name covers a single request-router replica. The wildcard SAN covers the pod-specific headless service names advertised when the request-router StatefulSet has multiple replicas.
To use a custom managed ClusterIssuer, set both the issuer identity and the
management override:
Issuer management supports only issuerKind: ClusterIssuer. OpenBao must be
enabled when the stack manages the issuer.
External issuer
Set clusterIssuer.enabled: false when the issuer is managed outside this
stack. For an external ClusterIssuer, use:
For a namespaced issuer, create the Issuer in the nvcf namespace and use:
The external issuer must allow the requested DNS names and issue a server
certificate from the root CA distributed to the compute planes. You can set
openbao.enabled: false when no other stack component requires OpenBao.
addons.llm.pki.allowedDomains constrains the managed OpenBao signing role
only. The stack ignores it for an external issuer. Apply the equivalent
constraint in the external issuer’s own configuration.
When addons.llm.enabled is true, the stack defaults
global.workerEndpoints.llmRequestRouterAddress to
llm-request-router.nvcf.svc.cluster.local:50071. Colocated workers require no
additional configuration. For a split control-plane and compute-plane
deployment, override this value with a host and port that worker pods can
reach.
The stack maps the configured or default address to
api.remoteConfig.configData.nvcf.llm-request-router.worker-address. The NVCF
API then includes the address in LLM worker configuration. Do not configure
the worker address under api.env. When the LLM addon is disabled, the stack
does not pass a staged endpoint to the API chart.
The request router uses power-of-two when no load-balancer configuration is
set, and accepts any supported routingMethod from a function. When a
load-balancer configuration is set, a function can only select an algorithm
that the configuration enables.
Pre-created request-router Secret
Set mode: existingSecret when you already issue the request-router server
certificate yourself and want the stack to mount it without managing issuance:
The stack renders no Certificate, installs no ClusterIssuer, and adds no
cert-manager or OpenBao dependency for the request router. You can set
certManager.enabled: false and openbao.enabled: false when no other stack
component needs them.
Create the Secret in the nvcf namespace before installing the stack. It must
carry the tls.crt and tls.key entries, as a kubernetes.io/tls Secret
does:
clusterIssuer.enabled, dnsNames, and allowedDomains only steer
stack-managed issuance. Rendering fails if any of them is set in this mode, so
a configuration that expects the stack to issue a certificate cannot be
mistaken for one that expects you to.
The certificate must carry a SAN covering the router’s advertised hostname and
the address workers connect to. At the default single-replica configuration
that is llm-request-router.nvcf.svc.cluster.local. At higher replica counts
the router advertises per-pod headless names, so use a leftmost wildcard such
as *.llm-request-router-headless.nvcf.svc.cluster.local. Include any external
name set in global.workerEndpoints.llmRequestRouterAddress. The stack cannot
read your Secret at render time, so it validates neither the SANs nor the
expiry. A certificate that does not cover the advertised hostname fails at
worker connection time, not at install time.
You own issuance, renewal, rotation, and recovery in this mode:
- Renewal and rotation: update the Secret, then restart the router with
kubectl rollout restart statefulset/llm-request-router --namespace nvcf. The router reads the certificate at startup. - Expiry: track it yourself. Nothing in the stack renews the certificate or alerts on an approaching expiry.
- Recovery: if the Secret is deleted or malformed, the router pods fail to start. Restore the Secret and roll the StatefulSet.
Compute-plane trust works exactly as described in
Compute-plane trust. Author the transportTls block
in the control-plane profile by hand with the public root CA that signed your
certificate, as you would for an external issuer. The profile exporter sources
a bundle only from the managed OpenBao hierarchy, so it leaves the block empty
here. The bundle must contain CERTIFICATE blocks only. Profile validation
rejects a private key, so the request-router private key never reaches the
compute plane.
External cert-manager
Set certManager.enabled: false when cert-manager is installed and managed
outside this stack:
Install the cert-manager CRDs and controller before applying the NVCF stack.
When the stack manages the OpenBao issuer, the external installation must also
provide ServiceAccount/cert-manager in the cert-manager namespace because
the managed issuer uses Kubernetes authentication with that identity.
Compute-plane trust
The control-plane profile carries the public transport CA:
For the managed OpenBao issuer, export a refreshed profile after the managed PKI hierarchy is available:
The exporter cannot infer the worker-facing request-router endpoint. Add the
reachable host:port before validating or registering the profile:
Use the endpoint that compute-plane workers can resolve and reach. Its hostname must match a SAN on the request-router certificate.
Registration renders this field as agent.llm.requestRouterAddress in the
compute-plane values. That is operator configuration, not a runtime fallback
for workers. At this release the worker sidecar takes its --stargate-address
from the LLM_REQUEST_ROUTER_ADDRESS variable in its launch environment, with
STARGATE_ADDRESS accepted as a legacy alias. The NVCF API injects
LLM_REQUEST_ROUTER_ADDRESS on the normal launch path, derived from
global.workerEndpoints.llmRequestRouterAddress. If neither variable reaches
the workload, translation rejects the launch instead of falling back to the
registered address.
Add that hostname to addons.llm.pki.dnsNames. The list accepts any number of
additional names; the stack only requires that one entry covers the router’s
advertised hostname. For the managed issuer, also extend allowedDomains with
the parent domain, because the OpenBao signing role allows subdomains and
wildcards but not bare domains. To issue for llm-router.example.com, use:
allowedDomains: llm-router.example.com does not work for that name. The role
sets allow_bare_domains=false, so the entry must be the parent domain.
The managed export reads the public root CA certificate from
services/all/pki/root in the stack’s OpenBao service and calculates the
canonical NVCF trust-bundle fingerprint. It does not discover the CA for an
external issuer. For an external issuer, add the issuer owner’s public CA
bundle and canonical NVCF fingerprint to transportTls in the existing
profile.
Calculate the canonical fingerprint for a public CA bundle with:
The procedure hashes each certificate’s DER bytes, removes duplicates, sorts
the certificate hashes, and hashes the versioned canonical text. Use the
result for trustBundleFingerprint.
Validate the profile after updating it:
Compute-plane registration converts transportTls into this exact generated
NVCA fragment:
Use only public CA certificates in trustBundlePem. Do not add a private key,
leaf certificate, or OpenBao token.
When replacing a local plaintext configuration, also set this in the compute-plane Helmfile environment:
The compute-plane Helmfile merges the environment fragment over the generated registration fragment, so the TLS trust configuration is retained and an old plaintext override is disabled.
If you mirror images to a registry that does not use the stack’s default
global.image.registry and global.image.repository, override the pylon
sidecar image passed to generated LLM workers:
The LLM API Gateway and request router images are resolved from the same stack artifact registry settings as the other control-plane services.
Apply and Verify
Apply the updated control-plane environment:
For the managed issuer, wait for the ClusterIssuer:
For an external issuer, wait for the configured resource instead:
Verify the request-router Certificate, its issuer reference, and the SANs.
The commands read only the public certificate:
Regenerate and apply the registration values for each compute cluster:
Existing LLM function pods keep their current sidecar arguments. Recreate or redeploy those functions after refreshing the compute plane.
After deploying an LLM function, verify the workload trust bundle. Compare
only .data.fingerprint with transportTls.trustBundleFingerprint in the
profile. openssl x509 -fingerprint does not calculate the canonical NVCF
bundle fingerprint.
Verify the worker sidecar:
The worker args must contain
--stargate-address=llm-request-router.nvcf.svc.cluster.local:50071, or the
configured routable DNS name, and must not contain --quic-insecure. The
address hostname must match a certificate SAN. The environment must contain:
Also verify the control-plane components:
Certificate Renewal
cert-manager renews the request-router certificate and updates
Secret/stargate-quic-tls. With mode: existingSecret there is no renewal
loop and you update the Secret yourself. Either way, the request router loads
its certificate when the pod starts. Restart the StatefulSet after renewal so
every replica uses the updated certificate:
Run the certificate and worker checks again after the restart. Do not assume that the request router hot reloads certificate changes.
Upgrade and Rollback
Use this order for an upgrade from plaintext transport:
-
Make the
helm-nvcf-pkichart available from the configured chart source. -
Remove the old plaintext setting or set
workload.stargateQUICInsecure: false. -
Apply the dependency Helmfile stage to install cert-manager, OpenBao, and the managed issuer, or prepare the external cert-manager and issuer:
-
Schedule a maintenance window and undeploy the existing LLM functions. The router does not support a mixed plaintext and TLS transition.
-
Apply the remaining control-plane stack. The managed router hook prepares the OpenBao signing path before cert-manager reconciles the request-router
Certificate. -
Wait for the issuer and
Certificate/stargate-quic-tlsto become ready. -
Export or update the control-plane profile, register each compute plane again, and install the refreshed registration values.
-
Recreate the LLM functions and verify the certificate SAN, trust-bundle fingerprint, worker address, and worker arguments.
Use this order for a safe rollback:
-
Create and verify the replacement
ClusterIssueror namespacedIssuer. -
Add both the current and replacement public roots to the compute-plane profile, calculate the canonical bundle fingerprint, register each compute plane again, and recreate the LLM workers with the combined trust bundle.
-
Set
addons.llm.pki.issuerKindandissuerNameto the replacement, setclusterIssuer.enabled: false, and apply the control-plane stack. -
Wait for
Certificate/stargate-quic-tlsto become ready, restart the request-router StatefulSet, and verify the replacement TLS data path. -
Remove the old root from the compute-plane profile, register each compute plane again, and recreate the workers.
-
Confirm that no
Certificatereferences the old issuer: -
Remove the old managed release after it is no longer part of the Helmfile state. Run
helm statusfirst and confirm the release is the superseded one, that the previous step listed noCertificatestill referencing its issuer, and that the replacement data path is verified. Uninstalling is not reversible from the cluster; only proceed once all three hold.After confirming, remove the release:
-
Delete the retained old
ClusterIssueronly after all references are gone:
If no replacement issuer is available, undeploy the LLM functions and disable the LLM addon before removing the issuer. Keep LLM traffic stopped until a secure issuer and trust path are available.
The managed ClusterIssuer is retained when its Helm release is removed. Do
not delete it before its certificates and consumers have moved to the
replacement trust path. Do not use stargateQUICInsecure as a production
rollback path.
Local Plaintext Transport
Use plaintext transport only in local or isolated test clusters. Set both plaintext controls:
addons.llm.gateway.auth.grpcInsecure: true configures the LLM API Gateway to
talk to the NVCF API over plaintext gRPC.
workload.stargateQUICInsecure: true configures generated LLM workers to pass
the plaintext QUIC setting to the pylon sidecar.
Use these settings only for local or isolated test clusters. Do not enable plaintext worker transport in production.
Troubleshooting
404 no_eligible_candidates from llm.invocation.<domain> means the request
reached the LLM Gateway, but the requested function or model was unknown or was
not registered on the selected request router. Similar 503 candidate errors
mean the router knows the target but has no active eligible backend. Check:
- The LLM function is deployed and its pod is
Running. - The request
modelvalue uses<function-id>/<model-name>. - The function’s
models[].namematches the model suffix in the request. models[].llmConfig.urisincludes the invoked path.- When
addons.llm.requestRouter.loadBalancer.configis set, it includes the algorithm selected by the function’smodels[].llmConfig.routingMethod. - The
llm-workersidecar connected tollm-request-router. - The effective LLM request-router worker address is reachable from the worker cluster.
- Local clusters using plaintext transport include both
grpcInsecureandstargateQUICInsecure.
For transport TLS failures, check:
- Unknown issuer: inspect the
CertificateReady condition and verifyissuerRef.kind,issuerRef.name, and the issuer namespace. A namespacedIssuermust be innvcf. - SAN mismatch: compare the hostname in
--stargate-addresswith the SANs inSecret/stargate-quic-tls. Do not replace the hostname with an IP address. - Expired or not-yet-valid certificate: inspect the certificate dates and the cluster clock. Renew the certificate and restart the request-router StatefulSet.
- Missing trust bundle: verify
ConfigMap/nvcf-transport-trust-bundle, compare its fingerprint with the compute-plane profile, and confirmSTARGATE_TLS_CERT_PATHin thellm-workercontainer.
Useful logs:
In healthy routing, the request router logs show a reverse tunnel connection from the worker and at least one routing candidate for the requested function.