NMC Gateway#
Overview#
NMC Gateway is the shared ingress edge for the NVIDIA Mission Control components. It renders a single Kubernetes Gateway API Gateway that terminates external HTTPS on one load-balancer IP. It is delivered as an Argo CD Application. Refer to Installing GitOps-Managed Components for the shared deploy flow.
How it works#
NMC Gateway runs NVIDIA Mission Control’s nmc-gateway chart on the kgateway controller. The Application renders the shared
Gateway resource, its TLS Certificate, and the MetalLB address pool (an
IPAddressPool and an L2Advertisement).
TLS terminates at the gateway. By default, cert-manager issues the certificate
from the OpenBao-backed ClusterIssuer (refer to Certificates). The
certificate covers the host names of every component the gateway fronts, so one
listener serves them all over one IP.
The gateway owns the attachment point, not the routes. Each component that needs
external traffic ships its own HTTPRoute in its own Helm chart and attaches
through parentRefs. Routing changes then stay in each component’s own
repository and review process.
The MetalLB pool is reserved for the shared gateway. It is created with
autoAssign: false and a serviceAllocation scoped to the nmc-gateway
namespace, so no other Service can claim the load-balancer IP.
Configuration#
Add these settings under the nmcGateway key in values.yaml. The key
already carries the pinned version and syncWave from
Installing GitOps-Managed Components. The following fields are the ones you set. A field shown
with a value uses that value as its default when you omit it.
nmcGateway:
hostname: <wildcard-sni-host> # required, e.g. *.dgx-<cluster-name>.nvidia.com
loadBalancerIP: 10.141.255.248 # replace with an address you reserved
gatewayClassName: kgateway-ha2 # optional, GatewayClass the gateway binds to
tlsMode: cert-manager # optional, TLS source: cert-manager or existing
tlsCertManagerIssuerName: nmc-openbao-ca # optional, cert-manager issuer name
tlsCertManagerIssuerKind: ClusterIssuer # optional, issuer kind
tlsCertManagerIssuerGroup: cert-manager.io # optional, issuer API group
# tlsCertManagerDnsNames: [nmc.example.com] # optional, cert SANs; defaults to [hostname]
httpEnabled: true # optional, port 80 listener
httpsEnabled: true # optional, port 443 listener
allowedRoutesNamespacesFrom: All # optional, namespaces that may attach HTTPRoutes
metallbEnabled: true # optional, render the MetalLB address pool
# metallbAddresses: [10.141.255.240/28] # optional, pool CIDRs; defaults to <loadBalancerIP>/32
hostname– wildcard SNI listener host name for the HTTP and HTTPS listeners. No default. Set it.loadBalancerIP– the load-balancer address the gateway is published on. Default10.141.255.248. Treat the default as a placeholder and set an address that you have reserved. On BCM’s default10.141.0.0/16internal network, the head nodes, the head-node high-availability address, and the BCM gateway already occupy the top of the range. Before you choose an address, check your site address records, the node interfaces, and the MetalLB pools of every cluster on the network. Clients reach the served host names through the BCM head-node proxy or directly at this address (refer to Reach the UIs).gatewayClassName– theGatewayClassthe gateway binds to. The current release useskgateway-ha2.tlsMode– the TLS certificate source,cert-managerorexisting. Defaultcert-manager. Inexistingmode the gateway serves a certificate you bring. Refer to Bring your own certificate.tlsCertManagerIssuerName– the cert-manager issuer the certificate requests from. Defaultnmc-openbao-ca. Set it to your own issuer to use a customer-managed issuer (refer to Use a customer-managed issuer).tlsCertManagerIssuerKind– the kind of the referenced issuer. DefaultClusterIssuer.tlsCertManagerIssuerGroup– the API group of the referenced issuer. Defaultcert-manager.io. An external issuer uses its own group.tlsCertManagerDnsNames– the DNS names placed on the gateway certificate. Defaults to[hostname].httpEnabled/httpsEnabled– enable the port 80 and port 443 listeners. Defaulttrue.allowedRoutesNamespacesFrom– namespaces that may attachHTTPRouteresources. DefaultAll.metallbEnabled– render the MetalLB address pool. Defaulttrue.metallbAddresses– addresses in the reserved pool. Defaults to<loadBalancerIP>/32.
Note
tlsCertManagerDnsNames must include the host names of every component the
gateway serves. A component whose host name is absent will not have a valid
certificate served for it.
Cross-field consistency rules:
gatewayClassNamemust match the class provided by the deployed kgateway controller.
Bring your own certificate#
To serve a certificate from your own certificate authority (CA) instead of one
issued by NVIDIA Mission Control, set tlsMode: existing. Place the certificate in OpenBao.
External Secrets projects it into the nmc-gateway-tls Secret the gateway serves.
The certificate must meet these requirements:
Format. A PEM certificate chain, the leaf plus any intermediates, and its matching private key in unencrypted PEM. NVIDIA Mission Control serves them as a
kubernetes.io/tlsSecret.Host coverage. The Subject Alternative Names cover every host name the gateway serves. Those host names are the gateway
hostnameand each fronted component’s host name. For your own domain, the certificate’s SANs must match each of those host names. One wildcard such as*.dgx-<cluster-name>.nvidia.comcovers them all.Validity. The certificate is within its validity period.
Trust. A certificate from a publicly trusted CA needs nothing more. A certificate from a private CA must be trusted wherever it is validated. Add it to the
nmc-ca-bundlefor in-cluster clients (refer to Add a private CA to the trust bundle), and distribute it to external clients through your own trust distribution, as you would any private CA.
Provide the certificate in the flow that matches your cluster. Always populate
OpenBao before you publish tlsMode: existing. The configure Job fails if the
mode is live before the key exists.
At install (Day 1)#
Set
tlsMode: existing. When the certificate chains to a private CA, also settrustManager.extraCaEnabled: true(refer to Add a private CA to the trust bundle).Add
k8s_bootstrap_secrets_gateway_tls_crtandk8s_bootstrap_secrets_gateway_tls_keytosecrets.yaml(refer to the Secrets section).Seed and publish (refer to Seed and Publish the Components). The seed step loads the material into OpenBao before the gateway starts, so the certificate is in place the first time the gateway serves traffic.
On a running cluster (Day 2)#
Write the certificate to OpenBao first, then switch the mode. Run the bao
commands as the nmc-admin operator (refer to Log in as the nmc-admin operator).
When the certificate chains to a private CA, add that CA to the trust bundle first (refer to Add a private CA to the trust bundle).
Write the certificate to OpenBao:
bao kv put nmc/gateway/tls tls.crt=@/tmp/fullchain.pem tls.key=@/tmp/key.pem
Set
tlsMode: existinginvalues.yaml.Publish (refer to Seed and Publish the Components), then confirm the gateway serves your certificate (refer to Verify).
When only the leaf changes, write the new material to nmc/gateway/tls. The
gateway serves it within one External Secrets refresh, with no restart.
When the CA also changes, add the new CA to the trust bundle before you serve the new leaf, and keep the old CA until the new leaf is live, so no client loses trust:
Publish both CAs. Write the old and new CA together to
nmc/cert-manager/extra-caas one concatenated PEM file, then confirm thenmc-ca-bundleBundle carries both.Replace the leaf. Write the new certificate and key to
nmc/gateway/tls.Remove the old CA. Write only the new CA to
nmc/cert-manager/extra-ca.
A shorter path replaces the CA and then the leaf in two writes. Between those two writes the served leaf chains to the old CA while the bundle carries only the new one, so clients briefly reject it.
Use a customer-managed issuer#
Point the gateway at a cert-manager issuer you run, in place of the OpenBao one. Take this step after the cluster is up. Bring the cluster up on the default OpenBao issuer or on a certificate you provide, then switch.
You own the issuer, its controller, its custom resource definitions, its backend credentials, and its signing keys. When the issuer signs from a private CA, add that CA to the trust bundle (refer to Add a private CA to the trust bundle).
Install and operate your issuer. A built-in cert-manager issuer needs no extra controller. An external issuer needs its provider controller and custom resource definitions.
Place a namespaced
Issuerin thenmc-gatewaynamespace, alongside the gateway certificate. AClusterIssuerworks from any namespace.Confirm the issuer reports
Readyand issues a test certificate.Set
tlsMode: cert-managerwithtlsCertManagerIssuerName,tlsCertManagerIssuerKind, andtlsCertManagerIssuerGroupfor your issuer.Confirm the gateway serves a certificate your issuer minted.
Secrets#
NMC Gateway consumes no bootstrap secrets by default. On the bring-your-own-certificate
path (tlsMode: existing), seed the certificate and key for the gateway to serve. Add them
to secrets.yaml:
# Only when serving your own certificate (tlsMode: existing):
k8s_bootstrap_secrets_gateway_tls_crt: "{{ lookup('file', '/path/to/fullchain.pem') }}" # PEM chain, leaf plus intermediates
k8s_bootstrap_secrets_gateway_tls_key: "{{ lookup('file', '/path/to/key.pem') }}" # matching unencrypted PEM key
k8s_bootstrap_secrets_gateway_tls_crt– the PEM certificate chain, the leaf plus any intermediates. Give an absolute path to thefilelookup, or paste the PEM inline as a block scalar.k8s_bootstrap_secrets_gateway_tls_key– the matching private key, in unencrypted PEM.
For the install and running-cluster flows and rotation, refer to Bring your own certificate.
Verify#
Confirm NMC Gateway:
Confirm the Application is
SyncedandHealthyin Argo CD.Confirm the
Gatewayis programmed and has been assigned theloadBalancerIPfrom the reserved MetalLB pool.
When HTTPS is enabled, confirm the served certificate for the tlsMode you set:
cert-manager: confirm the gatewayCertificateisReadyand that its DNS names cover every component the gateway serves.existing: confirm thegateway-tlsExternalSecretreportsSecretSynced, thenmc-gateway-tlsSecret exists in thenmc-gatewaynamespace, and its certificate covers every served host name.
From a client that trusts the served certificate, confirm an HTTPS request to a served host name terminates TLS at the gateway and routes to the expected component:
curl -v https://<served-host>/