Use this page to diagnose a failed or unhealthy Kubernetes installation and to collect logs for NVIDIA Support.
Where to Start
Begin with the failing resource's conditions and the recent warnings. Search all namespaces: the warnings that matter are often not in the namespace you're looking at.
kubectl get events -A --field-selector type=Warning --sort-by=.lastTimestamp | tail -30
kubectl -n minerva-infra describe minervainfra minerva-infra | tail -40
kubectl -n minerva-system logs deploy/minerva-operator-controller-manager --tail=100
Expected warnings. A successful installation leaves about 20 Warning events behind, from startup probes on Kafka, MySQL, Neo4j, the object store, Druid, Keycloak, and several application services. They're historical. What matters is whether the object is Ready now, not whether it ever logged a warning.
Common Problems
|
Symptom |
Cause and fix |
|---|---|
|
|
Wrong cluster. Re-export |
|
|
The pull secret is missing or wrong in that namespace (see Create the Namespaces and Pull Secrets), the credential expired, or the node runtime doesn't trust the registry TLS |
|
|
The image is missing from your registry (see Import the Images into Your Registry), or a required setting was removed from the custom resource: |
|
The operator pod exits at startup, mentioning cert-manager |
The cert-manager API isn't served. cert-manager is a hard prerequisite. Also confirm that its controller and your issuer are healthy |
|
Helm rejects the CRDs on annotation size |
Apply the CRDs first with |
|
|
A cluster APIService is unavailable ( |
|
|
One of the four Keycloak CRDs is missing. Apply the overlay again (see Install the Keycloak Operator) |
|
|
The ClusterRoleBinding subject still names the upstream namespace: the third patch in |
|
Identity reports |
Normal for about 60 seconds after apply. If it persists, check the Keycloak Operator (see Install the Keycloak Operator) |
|
Identity reports |
The |
|
TLS errors inside application pods |
|
|
|
With cert-manager, most likely the certificate isn't issued yet. Wait for the Certificate to become |
|
The application reports |
The ordering gate. Diagnose the identity tier. Don't disable the gate |
|
Sign-in sends the browser to an internal or wrong address |
A gateway in front of the UI rewrote the |
|
Identity is |
Check the redirect URIs and web origins of |
|
|
From the operator chart's own bootstrap issuer. The certificates are issued and the operator is |
|
The license state is |
No usable license was found. Check that the ConfigMap is |
|
Druid coordinator or router stuck on a wrong image while the broker restarts waiting for them |
A rollout deadlock: the Druid operator waits for the broker, and the broker needs the coordinator. Correct the setting in the custom resource first, then set the correct image directly on the affected StatefulSets and let them roll |
|
nginx OOMKilled (exit code 137) with clean logs on nodes with many CPU cores |
nginx sizes its workers from the node's CPU count. Raise the nginx memory limits in the application file |
|
PVC |
The StorageClass can't provision. Check that your class is the cluster default and, on node-local storage, the free disk on each node |
|
LoadBalancer address |
No address pool, or a pool whose name doesn't match the annotation in the application file (see Prepare the External Addresses) |
|
Address assigned but unreachable |
The network path or |
|
A telemetry source sends data, but nothing appears in the UI |
The collector accepts well-formed OTLP with |
|
Trends and dashboards show nothing for the last few minutes of a steady metric stream. Those minutes fill in later with their original timestamps, or stay empty |
Druid ingestion for that table is behind its metric stream. By default, each table is ingested by one task, which is limited to one CPU core, and the platform raises no event when it falls behind. Data older than the Kafka retention window (24 hours or 1 GiB per partition in the reference configuration) isn't recovered, so act early. Raise that table's ingestion task count as described under "Druid ingestion" in the install guide ( |
Reaching the UI and the Collectors
Depending on your network, a load-balancer address may be reachable only from some networks. For example, a layer-2 address on the cluster's subnet is reachable only from that subnet unless your network routes to it from elsewhere. Clients on other networks then need a site-specific path: routing, NAT, or an ingress route. This is network work outside the platform, and it's easy to mistake for a broken installation.
-
Confirm the platform side first with the front-door check in Validate the Installation, which bypasses the address entirely.
HTTP 200there means the front door is serving. If clients still can't reach the address, look at the network path. As a control, test an address you already reach successfully from the same place. If that one is unreachable too, you're testing from the wrong place rather than looking at a fault. -
Check the allowed source ranges. Both Services silently drop traffic from outside their ranges, and the symptom looks exactly like a routing failure:
kubectl -n minerva-app get svc minerva-app-nginx minerva-app-otel-data-lb \ -o custom-columns=NAME:.metadata.name,IP:.status.loadBalancer.ingress[0].ip,HOSTNAME:.status.loadBalancer.ingress[0].hostname,ALLOWED:.spec.loadBalancerSourceRanges -
Mind NAT: the address your clients present after NAT, not their own address, must fall inside the range.
Collect Logs for NVIDIA Support
kubectl logs reaches back only a short time on a busy pod. NVIDIA Minerva services also forward their logs to the platform's log collector, which keeps a longer history, and NVIDIA Support usually needs that archive. To collect it:
kubectl -n minerva-infra exec deploy/minerva-fluentd -- \
tar cz -C /fluentd/log --exclude='*/buffer.*' . > minerva-logs.tgz
Some infrastructure components, such as Kafka, MySQL, Neo4j, and nginx, write only to their container output, which this archive doesn't hold. Send the archive together with:
-
the output of the Where to Start commands above
-
kubectl logsfor the affected pods -
kubectl logs --previousfor a pod that has just crashed
Last updated: