Skip to main content
Kubernetes Error Troubleshooting Guide (2026): Every Common Pod Error

Kubernetes Error Troubleshooting Guide (2026): Every Common Pod Error

KU
• 7 min read•Updated •27 views

CrashLoopBackOff, ImagePullBackOff, OOMKilled, Pending, NodeNotReady, CreateContainerConfigError, and failing probes, each with what it means, the command that diagnoses it, and the usual fix.

Key takeaways

  • To troubleshoot a Kubernetes error, run kubectl describe pod and read the Events section, then kubectl logs --previous for crashed containers.
  • Most errors fall into four groups: the image or config is wrong, the pod cannot be scheduled, the container is killed for memory, or the node itself is unhealthy.
  • Each has a short, specific fix.

To troubleshoot any Kubernetes pod error, run kubectl describe pod <name> and read the Events at the bottom, then kubectl logs <name> --previous if the container crashed. The status name tells you which group you are in: image or config (ImagePullBackOff, CreateContainerConfigError), scheduling (Pending), runtime (CrashLoopBackOff, OOMKilled, probes), or node (NotReady).

The status column in kubectl get pods is a symptom, not a diagnosis. CrashLoopBackOff only says "this keeps exiting". The cause is almost always in one of three places: pod events, the previous container's logs, or the node's conditions. This guide maps each common error to the place its answer lives, with behavior checked against the Kubernetes 1.37 documentation as of October 2026.

The four commands that answer most incidents

Before matching an error to a section below, collect the evidence:

bash.bash
$ kubectl get pods -o wide                        # status, restarts, node
$ kubectl describe pod <pod>                      # Events: scheduling, pulls, probes, kills
$ kubectl logs <pod> --previous                   # output of the container that just died
$ kubectl get events --sort-by=.lastTimestamp -A  # cluster-wide timeline

describe covers scheduling, image pulls, probe failures, and OOM kills. --previous covers application crashes, because the current container may have only just restarted and have nothing useful to say. The longer kit, including kubectl debug with ephemeral containers, is in kubectl commands for debugging any pod.

Kubernetes errors at a glance

ErrorWhat it meansWhere to lookUsual cause
CrashLoopBackOffContainer keeps exiting; kubelet waits longer between restartskubectl logs --previous, exit code in describeApp error, bad config, failing liveness probe
ImagePullBackOff / ErrImagePullNode cannot pull the imageEvents in describeWrong tag, private registry without imagePullSecrets
OOMKilled (exit 137)Container exceeded its memory limitLast State in describeLimit too low or a memory leak
PendingNo node satisfies the pod's requirementsFailedScheduling eventInsufficient CPU or memory, taints, affinity, unbound PVC
NodeNotReadyNode stopped reporting healthy statuskubectl describe node conditionsKubelet down, disk or memory pressure, network
CreateContainerConfigErrorPod spec references config that does not existEvents in describeMissing ConfigMap, Secret, or key
Probe failuresLiveness or readiness checks failUnhealthy eventsProbe too strict or app slower to start than expected

CrashLoopBackOff: the container keeps exiting

CrashLoopBackOff means the container started, exited, and the kubelet is now waiting before restarting it. Per the Kubernetes docs, the delay grows exponentially (10s, 20s, 40s, and so on) up to a cap of 300 seconds, and resets after the container runs for 10 minutes without problems. Check the exit code in describe and the logs with --previous. Exit code 1 is usually the application; 137 means it was killed (often for memory); a liveness probe failure shows up as Unhealthy events just before each restart. The full walkthrough is in How to fix CrashLoopBackOff.

ImagePullBackOff and CreateContainerConfigError: the pod spec is wrong

ImagePullBackOff means the kubelet could not pull the image and is backing off between attempts, again up to a 300-second limit. The event message names the reason: manifest unknown is a wrong tag, unauthorized or pull access denied is a missing or wrong imagePullSecrets, and timeouts point at registry networking. See How to fix ImagePullBackOff and ErrImagePull.

CreateContainerConfigError is the config twin: the image pulled, but the pod references a ConfigMap, Secret, or key that does not exist in that namespace. The event names the missing object. Create it or fix the reference; covered in Fixing CreateContainerConfigError.

OOMKilled: the container hit its memory limit

When a container exceeds its memory limit, the kernel's OOM killer ends it with SIGKILL, and Kubernetes reports Reason: OOMKilled with exit code 137 (128 plus signal 9). Check kubectl describe pod for the last state, then compare the limit against real usage with kubectl top pod. Raise the limit if usage is legitimately higher; if memory climbs steadily until the kill, it is a leak, and a higher limit only delays it. Language runtimes need their heap sized below the container limit. Details in How to fix OOMKilled (exit code 137).

Pending: the scheduler cannot place the pod

A Pending pod has not been bound to a node. The FailedScheduling event spells out why for each node, for example insufficient CPU on some and an untolerated taint on others. The common causes are resource requests larger than any node's free capacity, taints without matching tolerations, node selectors or affinity rules that match nothing, and PersistentVolumeClaims that cannot bind. Requests count, not actual usage, so an overcommitted request blocks scheduling on an idle cluster. See why your pod is stuck in Pending.

NodeNotReady: the node itself is unhealthy

If several pods fail at once on the same node, check the node before the pods. The node controller marks a node unhealthy when it stops reporting for longer than --node-monitor-grace-period, which defaults to 50s per the kube-controller-manager reference as of October 2026. Pods get default tolerations of 300 seconds for not-ready and unreachable, so they stay bound for five minutes before eviction starts. Run kubectl describe node <node> and read the conditions: MemoryPressure, DiskPressure, or a stopped kubelet are the usual answers. The node-side steps are in Kubernetes Node NotReady diagnosis and fix.

Probes failing: liveness restarts, readiness removes

Probe failures look like other errors. A failing liveness probe makes the kubelet kill and restart the container, which surfaces as CrashLoopBackOff. A failing readiness probe never restarts anything; it removes the pod from Service endpoints, which surfaces as 503s or a stuck rollout. The defaults are periodSeconds: 10, timeoutSeconds: 1, and failureThreshold: 3, so a slow endpoint fails liveness after about 30 seconds. Slow-starting apps need a startupProbe rather than a long initialDelaySeconds. Readiness has subtler traps during deploys, covered in readiness probes lie during rolling updates.

Questions people ask

How do I troubleshoot a Kubernetes pod that keeps restarting?

Run kubectl describe pod and check the last state and exit code, then kubectl logs --previous to read the output of the crashed container. Exit code 137 with OOMKilled means memory; Unhealthy events mean a liveness probe; anything else is usually the application or its config.

What is the difference between CrashLoopBackOff and ImagePullBackOff?

CrashLoopBackOff means the image ran and the process keeps exiting, so the problem is in the application or its config. ImagePullBackOff means the image never ran because the node could not pull it, so the problem is the image name, tag, or registry credentials.

Why is my Kubernetes pod stuck in Pending?

The scheduler cannot find a node that meets the pod's requests and constraints. Read the FailedScheduling event: it lists insufficient CPU or memory, untolerated taints, affinity mismatches, or an unbound PersistentVolumeClaim. Lower the requests, add capacity, or fix the constraint.

How long before Kubernetes evicts pods from a NotReady node?

By default about five minutes after the node is detected as unhealthy. The node is marked after the 50-second grace period, and pods carry automatic 300-second tolerations for not-ready and unreachable taints before they are evicted.

The call we'd make

Train everyone on call to run describe and logs --previous before touching anything, and to name the error group before guessing at a fix. Then turn each section above into a runbook with links to the detailed guides. Most Kubernetes incidents we see are not novel: they are one of these seven states with a cause the events already printed.

Sources

Explore topics:KubernetesDevOps
React
Share this post
KU

Kiril Urbonas

AI Engineer

553 articles
View all articles by Kiril Urbonas

You might have missed

Evergreen posts worth revisiting.