Troubleshoot
This page lists the failures you are most likely to meet when you install NVIDIA Kubernetes Engine (NVKE) and run workload clusters, in the order of the installation path. Each entry gives the symptom, the cause and the fix. Start with Collect diagnostics.
Collect diagnostics
Bootstrap diagnostics
When nvkectl bootstrap site fails, it writes diagnostics from the seed cluster to cluster-diagnostics/, or to the directory --diagnostics-dir names: one directory per namespace with object state and every pod’s log (the management plane’s under nke-controller/), plus all-resources.txt, pods-described.txt and helm-releases.txt.
If the run failed after it requested the cluster, nvkectl keeps the seed cluster, and its NVKE API answers on the bootstrap host without authentication. List the management cluster’s nodes and the step each one is on:
To use kubectl against the seed cluster, write its kubeconfig:
Management-plane logs
Show the warnings and errors from the last hour:
Observe NVKE and its clusters describes how to raise the log level.
Cluster and node state
-
Read the conditions of a cluster that is not
Provisioned. Themessageof each condition usually names the cause.<WORKLOAD_CLUSTER>is the workload cluster’s name. -
List the cluster’s nodes with the step each one is on.
<MANAGEMENT_ADDRESS>is the management cluster’s API virtual IP address (VIP), or the node IP of a single-node management cluster. If API authentication is on, add-H "Authorization: Bearer <TOKEN>"to eachcurlcommand that calls/api/, where<TOKEN>is a JSON Web Token (JWT) from your identity provider, as described in Secure the NVKE API. While a step fails and retries, its message ends with the number of failed attempts and-- last error:followed by the error.
Cluster API objects
NVKE creates each workload cluster’s Cluster API objects in the nvke-system namespace of the management cluster, named after the cluster. The last command shows the logs of CAPNICo, the Cluster API infrastructure provider for NVIDIA Infra Controller (NICo).
Node logs
On a node, as root:
Versions
Record these before you report a problem.
Building artifacts
nvkr does not build
-
Symptom:
make buildin the NVIDIA Kubernetes Recipes (NVKR) repository printsGo go<VERSION> does not match pinned go1.27.2. -
Fix: NVKR builds only with the exact Go version in its
.go-versionfile. Install Go 1.27.2, or let Go fetch it:
The bootstrap fails at clusterctl init
- Symptom: The bootstrap fails with
controllerdeploy: clusterctl init:andclusterctl dev must be on PATH, andnvkectl versionprintsdev. - Cause:
nvkectlwas built withgo build. Only the Makefile stamps the version and the Cluster API version into the binary. - Fix: Build with
make -C nvke/cli build. If the message names a real version,clusterctlis missing fromPATHor the host cannot reachgithub.com.
Preparing nodes
The SPIRE agent configuration is missing
- Symptom:
/etc/spire-agent/agent.confdoes not exist, andjournalctl -u nvke-spire-configureshowsnvke-spire-configure: missing /etc/nke/spire.env,nvke-spire-configure: missing /etc/nke/trust-bundle.pem, or a line ending inis required. - Cause: The node’s user data did not write the file or value named, so the SPIRE agent never starts.
- Fix: Correct the user data and boot the node again, as described in Prepare nodes.
Bootstrap
Bootstrap the management cluster gives the retry steps that the entries below refer to.
A seed cluster from an earlier run is still running
- Symptom:
bootstrap cluster "nvkectl-bootstrap" from an earlier run is still running. - Cause: An earlier run kept its seed cluster, which can hold the only copy of that cluster’s etcd encryption key.
- Fix: Save every
etcd-encryption-key-*Secret the message lists, then delete the seed cluster as in the retry steps. Keep theKIND_EXPERIMENTAL_PROVIDER=nerdctlprefix, orkinddeletes nothing and the next run stops on the same message.
An etcd encryption key file already exists
- Symptom:
<CLUSTER_NAME>-etcd-encryption-key.json already exists and holds the etcd encryption key of an earlier bootstrap of this cluster name. - Cause: The bootstrap never overwrites a key file.
- Fix: If you reset that cluster’s nodes, move the file to secure storage or delete it. Otherwise pass
--encryption-key-outwith a new path.
A node already serves the Kubernetes API
- Symptom:
port 6443, the Kubernetes API port, is accepting connections on: <NODE_NAME> (<NODE_IP>). - Cause: An earlier attempt left a control plane on the node, or the site spec names a node of a running cluster.
- Fix: Reset kubeadm on the node as in the retry steps, or correct the site spec.
An NVKE image is missing or cannot be pulled
- Symptom:
image <IMAGE> is not in the local image store, or anerdctl pullerror that ends withif this is an authentication failure, log in to the image's registry. - Cause: The
--nvke-controller-imageor--provisioned-provider-imagereference has no registry host and was never built on this host, or the registry refused the pull. - Fix: Build the images with
make -C nvke/cli images, or pass full image references. For a refused pull, runnerdctl login <REGISTRY_HOST>first.
A required tool is missing
- Symptom:
nerdctl is required to bootstrap a site but was not found on PATH, or, after the seed cluster starts, an error that nameshelm,kubectlorclusterctland ends inexecutable file not found in $PATH. - Cause: The bootstrap checks only for
nerdctlbefore it starts. - Fix: Install rootful
nerdctlwith containerd,kind,helm,kubectlandclusterctl. Docker is not supported.
The bootstrap times out waiting for the cluster
- Symptom: After
--timeout, 30 minutes by default, the bootstrap fails withdid not report provisioned withinoronly <N> of <M> control plane nodes of cluster <ID> finished provisioning within, and keeps the seed cluster. - Cause: A node’s SPIRE agent cannot attest, so
nvke-agentnever starts, or the bootstrap host cannot reachnvke-agent. - Fix:
-
List the nodes and their step with the
curlcommand in Bootstrap diagnostics.Waiting for node preflight to succeedis followed by the last error fromnvke-agent. -
On each node that is not ready, check that the SPIRE agent attested.
Until it attests,
nvke-agentlogstimed out waiting for SPIFFE workload API socket. If nothing prints, check that the node’s TPM thumbprint inhosts.csvmatchesget_tpm_pubhashon the node, thattrust_domainin/etc/spire-agent/agent.confequalsspire.trustDomainin the site spec, that/etc/nke/trust-bundle.pemholds the certificate you passed asNVKECTL_SPIRE_CA_CERT_FILE, and that the node reaches the bootstrap host on port 30081. -
From the bootstrap host, check that each node accepts connections on port 15005.
-
Fix the cause, then follow the retry steps. For a larger cluster, also raise
--timeout.
-
cloud-init failed on a node
- Symptom: A node’s step message contains
cloud-init error status. - Cause: The bootstrap requires cloud-init
status: doneon every node. - Fix: Find the failing module with
cloud-init status --long, correct the user data, boot the node again, and follow the retry steps.
The etcd encryption key was not saved
- Symptom:
its encryption key was not saved to <PATH>. - Cause: The cluster is built and encrypted, but writing the key file failed. The seed cluster holds the key.
- Fix: Run the save command the message prints before you delete the seed cluster or run the bootstrap again.
The control-plane taint was not removed
-
Symptom:
making the control-plane nodes schedulable:, followed by the command to finish by hand. -
Cause: Removing the control-plane
NoScheduletaint failed. Until it is removed, nothing schedules on the management cluster, andclusterctl initin the next phase times out on cert-manager. -
Fix:
Management-plane install
The install stops at the component that failed. Fix the cause and run the same command again, as described in Run NVKE end to end on one machine.
The stack config is not ready
- Symptom: The install stops with
stack config <FILE>:followed by one line per problem, such asnico.endpoint: still a REPLACE_* placeholder; fill it inorenvironment: NVKECTL_NICO_TOKEN is not set. - Cause: A value in the stack config is still a
REPLACE_*placeholder, a required key is empty, the file carries a key it must not, or one of theNVKECTL_*variables is not exported in the shell you run from. - Fix: Edit the key or export the variable as described in Run NVKE end to end on one machine, then run the check again until the stack config passes.
The install refuses the release
- Symptom: The install stops before it changes the cluster with
<ITEM>: <ROLE> <ARTIFACT> is not in the release, for example forcontroller-profilesorcapnico-controller. - Cause: The release description does not carry an artifact that the deploy path names, for the management nodes’ CPU architecture.
- Fix: Use a release that carries the artifact, or install without
--releaseand name the images in the stack config’simages, as described in Run NVKE end to end on one machine.
A volume claim stays Pending
- Symptom:
kubectl get pvc -Ashows a claim inPending, and the component that owns it times out. - Cause: The management cluster has no default StorageClass. The bootstrap installs none.
- Fix: Install a storage provisioner, mark its StorageClass as the default, and run the install again.
An image cannot be pulled
- Symptom: A component times out, and its pod is in
ImagePullBackOff. - Cause: The nodes cannot reach or authenticate to the registry that the release or the stack config’s
imagesnames. - Fix: Read the registry’s error with
kubectl describe pod, make the registry reachable from the nodes, and run the install again.
spire-server restarts with checksums did not match
- Symptom: The
spire-serverpod restarts, and its log containschecksums did not match. - Cause: The install rendered SPIRE’s TPM attestor checksum for another CPU architecture than the node that runs
spire-server. The install reads the architecture from the management nodes, so this happens when the nodes do not all report one, or when--archwas passed todeploy/nvke-deploy.shwith the wrong value.deploy/check-site.shfails on nodes that report two architectures or lack thekubernetes.io/archlabel. - Fix: Give every management node the same architecture and the label, run the check, then run the install again without
--arch.
Infrastructure provider
nvkectl get providers does not show CONFIGURED
- Symptom: The
nicorow ofnvkectl get providersshowsNOT-INSTALLED,NOT-CONFIGURED,DEGRADEDorUNKNOWN. TheDETAILcolumn says why. - Fix: Configure an infrastructure provider: NICo gives the action for each state.
nvkectl get providers shows CREDENTIALS other than HEALTHY
- Symptom: The
nicorow readsCONFIGURED, butCREDENTIALSis notHEALTHY. TheDETAILcolumn says why. - Cause:
UNSUPPORTEDis expected with the CAPNICo release the install deploys, which does not serveNicoIdentity. With a release that does,NO-IDENTITYmeans noNicoIdentitynamesnico-credentials, andFAILINGorUNKNOWNcarries the reason from CAPNICo’s last check. - Fix: Infrastructure providers explains each value. For
FAILING, correct the credentials as described in Configure an infrastructure provider: NICo.
Machines are not delivered
- Symptom: A node’s
pendingmessage staysWaiting for infrastructure allocation, or its step staysWaiting for CAPI machine to be ready.clusterctl describe cluster <WORKLOAD_CLUSTER> -n nvke-systemmay show a machine with the reasonInstanceTypeUnavailable. - Cause: The NICo instance type has no allocation for your organization, or no free machine.
- Fix: Add an allocation in NICo, or use an instance type with free capacity. The control plane can list fallback types in
instanceTypePreference, as in Create a workload cluster.
CAPNICo logs NICo API errors
- Symptom: Nodes stay on
Waiting for CAPI machine to be ready, and the CAPNICo logs show failed calls to the NICo API. - Cause: The endpoint, organization ID, token or API name in the
nico-credentialsSecret is wrong.CONFIGUREDdoes not test them. - Fix: Correct the credentials as described in Configure an infrastructure provider: NICo.
API access and authentication
Secure the NVKE API describes each of these cases.
Creating clusters
nvkectl create cluster returns an error
- Symptom:
nvkectl create clusterprintscreating cluster:with a400and a message such ascontrolPlaneConfig.nico.release is required for a nico cluster control plane. - Cause: The cluster spec is invalid. Nothing was created.
- Fix: Correct the field the message names. Create a workload cluster lists the common causes.
The cluster stays in Provisioning
-
Symptom:
nvkectl get clustersshowsProvisioninglong after you created the cluster. -
Cause: A control-plane node has not finished provisioning.
-
Fix: List the cluster’s nodes with the command in Cluster and node state, and act on the step the stuck node is on:
Nodes do not progress because of the release
- Symptom: Nodes do not progress, and the management-plane log contains
resolving release "<NAME>". - Cause: The control plane must name an existing cluster release and each node pool an existing node pool release.
- Fix: Check the names with
nvkectl get clusterreleasesandnvkectl get nodepoolreleases. Apply the missing releases as in Run NVKE end to end on one machine, or delete the cluster and create it again with names that exist.
The cluster shows ProvisioningFailed
- Symptom:
STATUSisProvisioningFailed. - Cause: Provisioning stopped. The
provisioningcondition’s message, afterWorkflow failed:, gives the cause. - Fix: Fix the cause, then delete the cluster and create it again.
A cluster patch fails
- Symptom:
nvkectl patch clusterfails with409andcluster update rejected: <OPERATION> in progress since <TIME>, orSTATUSbecomesUpdateFailed. - Cause: Only one operation runs on a cluster at a time.
UpdateFailedmeans the last day-2 operation failed; its condition message gives the cause. - Fix: For
409, wait forProvisioned. Then, or forUpdateFailed, send the same patch again, as in Create a workload cluster.
The cluster stays in Deleting
- Symptom: The cluster stays
Deleting, and itsdeletingcondition message starts withWorkflow failed:. - Cause: Teardown failed.
- Fix: Report the problem with the cluster’s YAML, the management-plane log and the Cluster API objects. Do not delete the cluster’s objects in
nvke-systemby hand.
Node pools and nodes
A node was replaced after two hours
- Symptom: A provisioning worker node is replaced, and
nvke_controller_node_provisioning_giveups_totalincreases. - Cause: The node provisioned for longer than the timeout, 2 hours by default.
- Fix: Fix what the replacement node’s step message waits on. To keep a stuck node for diagnosis, set
provisioningMonitorDisabledon the pool, as described in Manage node pools.
Workload cluster access
nvkectl get kubeconfig fails
- Symptom:
admin kubeconfig secret nvke-system/<WORKLOAD_CLUSTER>-admin-kubeconfig not found, ornot allowed to read secret nvke-system/<WORKLOAD_CLUSTER>-admin-kubeconfig. - Cause: For
not found, the name is wrong or the cluster is not provisioned yet. Fornot allowed, the kubeconfig set withnvkectl config set-sitelacksgeton Secrets innvke-system. - Fix: Check the name with
nvkectl get clustersand wait forProvisioned, or use a kubeconfig with that permission. - Note: A management plane installed before the management namespace became configurable publishes into
nke-system, notnvke-system.nvkectl get kubeconfigtries both, so the message naming only one means it found the Secret in neither. Pass--namespaceif the site pins a name of its own.
kubectl times out against the workload cluster
- Symptom:
kubectl --kubeconfig <WORKLOAD_CLUSTER>.kubeconfig get nodestimes out. - Cause: Your machine cannot reach the API address in the kubeconfig on port 6443.
- Fix: See How clients reach the Kubernetes API.
Get help
Report bugs and documentation gaps in GitHub Issues, after searching the existing issues. Review every file and log before you attach it, and remove addresses, host names, tokens, passwords and other values specific to your site. Include:
- The output of the commands in Versions.
- The command you ran and its full error.
- The diagnostics from Collect diagnostics that relate to the failure.
- What you changed from the steps in this documentation.