Networking Minerva User Guide

Kubernetes Requirements

Before you install NVIDIA Minerva on Kubernetes, confirm that your workstation and cluster meet these requirements, check capacity, and decide the values the installation needs.

Workstation

Work from one shell on a workstation that has:

  • kubectl with cluster-admin rights on the target cluster

  • helm 3.16 or later, or Helm 4

  • a way to import a docker-save archive into your registry

  • openssl, tar, and sha256sum

  • enough disk for the unpacked image set (allow 25 GB)

Cluster Requirements

Every row is a prerequisite that must be true before you start.

Requirement

What's needed

How to check

Kubernetes

Version 1.30 or later (validated on 1.30 to 1.32). Linux workers of the CPU architecture named in MANIFEST.txt (amd64 or arm64). No GPU is needed

kubectl version; kubectl get nodes -L kubernetes.io/arch

Access

Permission to create namespaces, CRDs, cluster RBAC, admission webhooks, Secrets, and workloads

Your role and binding review

cert-manager

Installed and healthy, version 1.12 or later, with a working issuer. This is a hard requirement: the operator exits without it. Its startup check detects the cert-manager API only, not the version or the issuer's health

kubectl get pods -n cert-manager; the issuer shows READY=True

Issuer scope

A ClusterIssuer, or an Issuer in minerva-app, where the installation issues the UI certificate

kubectl get clusterissuer, or kubectl -n minerva-app get issuer once the namespace exists

StorageClass

Dynamic provisioning, SSD-backed, ReadWriteOnce, and set as the cluster default

kubectl get sc shows yours marked (default)

Load balancing

A way to expose two Services: the UI (443/TCP) and telemetry (4317, 4318, 9091, and 4319/TCP plus 514/UDP, in one Service with mixed protocols). The operator installs no load balancer. The telemetry endpoint needs raw layer-4 reachability and can't go behind an HTTP ingress

Your load-balancing solution is healthy and has free addresses

Ingress

Optional. An IngressClass and a healthy ingress controller, only if you publish the UI through your own gateway (see Prepare the External Addresses)

kubectl get ingressclass

DNS

A DNS record for your UI hostname

nslookup <ui-hostname> returns the UI Service address or your gateway address

Registry

Reachable from every node, over TLS that the node container runtime trusts. A CA Secret inside the cluster doesn't configure runtime trust

Pull any image from it on a node

Node settings

fs.inotify.max_user_instances set to at least 1024 on every worker, persisted through your node-configuration mechanism; node clocks synchronized

sysctl fs.inotify.max_user_instances; timedatectl

Admission policies

Your policy engine admits this release's workloads, including init containers and nginx. A blanket restricted profile isn't automatically compatible

No denial events during the installation

Keycloak Operator manifests

The five upstream manifest files for Keycloak Operator release 26.7.5, obtained through your normal artifact process (stage them before entering a disconnected environment). The two images they need are already in the archive

Files present

The Keycloak Operator itself and the UI certificate are created during the installation and checked there (see Install on Kubernetes).

Capacity

  • The reference configuration requests about 55 GiB of memory and 12 vCPU, and has about 144 GiB and 42 vCPU of configured limits. The AI agent pod has no CPU or memory limit, the same as on Docker Swarm, so leave headroom for it beyond the declared limits. Size the cluster from the limits plus that headroom, not from the requests, against the allocatable capacity left after your other workloads.

  • On arm64 nodes that run a kernel with 64 KB memory pages (getconf PAGESIZE prints 65536), the Go, Python, and native services use 1.5 to 3.5 times the memory they use with 4 KB pages, and the Java services about 1.1 to 1.3 times. The reference limits allow for this. Expect these nodes to use a larger share of their memory than nodes with 4 KB pages.

  • Persistent volume claims total about 217 GiB. The Druid segment cache alone is 100 GiB and the object-store volume 50 GiB, so plan provisionable storage above that total. Druid serves only the data that fits in its segment cache, so set that volume (spec.druid.historical.storage.size in the infrastructure file) large enough to hold your daily ingest for the whole retention period.

  • The largest consumers, and the first to grow with fleet size, are Druid, the trans-metric instances, anomaly detection, and the gateway collectors. The reference custom resources carry per-component comments.

  • If your StorageClass provisions node-local volumes, confirm the free disk on each node, not only across the cluster.

Values to Decide Before You Start

The reference custom resources carry these values as placeholders. The table gives the exact token each one replaces.

Placeholder

Set it to

Where it appears

${MINERVA_REGISTRY_URL}

The one repository path that will hold every NVIDIA Minerva image, for example registry.example.com/minerva. Nodes must reach it over TLS their container runtime trusts

All three files

${MINERVA_PLATFORM_VERSION}

The platform release from MANIFEST.txt, for example 1.1.0

Infrastructure and application

${MINERVA_STORAGE_CLASS}

Your dynamic, SSD-backed, ReadWriteOnce StorageClass, for example gp3. It must also be the cluster default, because the identity database always uses the default class

Infrastructure and application

${MINERVA_UI_HOSTNAME}

Your UI hostname, the one address users open, for example minerva.example.com. Sign-in runs under the same address, so the identity and application files take the same value

Identity and application

${MINERVA_ALLOWED_CIDRS}

The source networks allowed in, for example 10.0.0.0/8. It appears twice in the application file: under spec.nginx.service for browsers, and under the gateway-push collector for devices. The two values may differ

Application, twice

${MINERVA_CUSTOMER_NAME}

A display name, for example Example Corp

Application

${MINERVA_CLUSTER_NAME}

A display name, for example prod-eu-1

Application

${MINERVA_OIDC_ISSUER_URL}

Only if you federate login to your identity provider: your provider's issuer URL. Otherwise, leave the block commented out

Identity, commented block

${MINERVA_OIDC_CLIENT_ID}

Only if you federate login to your identity provider: the client ID you created in your provider

Identity, commented block

Caution: one token, two values. The two ${MINERVA_ALLOWED_CIDRS} occurrences in the application file may need different values, one for browsers and one for devices. A single search-and-replace of that token gives both the same value. Edit each occurrence on its own.

You also need, outside the files:

  • the name and kind of your cert-manager issuer

  • the PEM CA chain that signs its certificates

  • the operator version from MANIFEST.txt

  • your NVIDIA Minerva license file (see Get a License). Without a license, the platform starts in the invalid license state, which gates its user-facing features.

Plan Before You Install

  • Size the cluster from the resource limits (about 144 GiB of memory and 42 vCPU) plus headroom for the AI agent pod, not from the requests, and plan at least 217 GiB of persistent storage.

  • Plan network reachability early. Depending on your network, a load-balancer address may be reachable only from some networks, for example only from the cluster's own subnet when nothing routes to it from elsewhere. Clients and devices on other networks then need routing, NAT, or an ingress path.

  • Plan a stable address for the Devices load balancer. Your devices are configured with it, and the WJH certificate must name it.

  • Use registry pull credentials that don't expire, or arrange their refresh.

Last updated: