kubectl describe: Read Pod Events Guide
Use kubectl describe pod to read events, conditions, and container states. Diagnose scheduling failures, image pulls, crashes, and probe failures.
π‘ Quick Answer:
kubectl describe pod <name>shows the full pod lifecycle: container states, conditions, events, resource requests, volumes, and node assignment. Scroll to the Events section at the bottom for the diagnostic gold β it shows scheduling decisions, image pulls, container starts, probe failures, and OOM kills in chronological order.
The Problem
kubectl get pods shows status but not why:
NAME READY STATUS RESTARTS AGE
my-pod 0/1 CrashLoopBackOff 5 3mWhat crashed? Why? When? You need kubectl describe for the full story.
The Solution
Read the Events Section
kubectl describe pod my-pod
# Scroll to the bottom:
# Events:
# Type Reason Age From Message
# ---- ------ ---- ---- -------
# Normal Scheduled 3m default-scheduler Successfully assigned default/my-pod to worker-1
# Normal Pulling 3m kubelet Pulling image "myapp:latest"
# Normal Pulled 2m kubelet Successfully pulled image
# Normal Created 2m kubelet Created container my-app
# Normal Started 2m kubelet Started container my-app
# Warning Unhealthy 1m kubelet Readiness probe failed: HTTP probe failed with statuscode: 503
# Warning BackOff 30s kubelet Back-off restarting failed containerCommon Event Patterns
Scheduling failure:
Warning FailedScheduling default-scheduler 0/3 nodes are available:
1 node(s) had untolerated taint {node-role.kubernetes.io/control-plane:},
2 node(s) didn't match Pod's node affinity/selectorImage pull failure:
Warning Failed kubelet Failed to pull image "myapp:v2": rpc error:
code = NotFound desc = failed to pull and unpack image: not found
Warning Failed kubelet Error: ImagePullBackOffOOM Kill:
Warning OOMKilling kubelet Memory cgroup out of memory: Killed process 12345
Normal Killing kubelet Stopping container my-appProbe failure:
Warning Unhealthy kubelet Liveness probe failed: HTTP probe failed with statuscode: 500
Normal Killing kubelet Container my-app failed liveness probe, will be restartedKey Sections in Describe Output
kubectl describe pod my-pod
# 1. Metadata
# Name, Namespace, Node, Labels, Annotations
# 2. Status & Conditions
# Status: Running
# Conditions:
# Type Status
# Initialized True
# Ready False β Pod not serving traffic
# ContainersReady False
# PodScheduled True
# 3. Container Details
# Container ID, Image, State (Running/Waiting/Terminated)
# Last State: Terminated (exit code, reason, signal)
# Restart Count, Resource Requests/Limits
# Liveness/Readiness probe config
# Environment variables, Mounts
# 4. Volumes
# ConfigMap, Secret, PVC references
# 5. Events (most recent last)
# Chronological lifecycle eventsDescribe Other Resources
# Node (capacity, allocatable, conditions, taints)
kubectl describe node worker-1
# Service (endpoints, selector matches)
kubectl describe svc my-service
# Deployment (replicas, rollout status, events)
kubectl describe deployment my-app
# PVC (bound status, storage class, events)
kubectl describe pvc my-data
# Events only (all namespace events)
kubectl get events --sort-by='.lastTimestamp'
kubectl get events -A --field-selector reason=FailedSchedulingScripting with Events
# Get events as JSON for automation
kubectl get events -o json | jq '.items[] | select(.reason == "OOMKilling") | {pod: .involvedObject.name, time: .lastTimestamp}'
# Watch events in real time
kubectl get events -w
# Events for a specific pod
kubectl get events --field-selector involvedObject.name=my-podCommon Issues
βEvents:
Events expire after 1 hour by default. If the pod has been running longer, events may have been garbage collected. Check kubectl get events for recent cluster events.
Describe shows βPendingβ with no events
Scheduler hasnβt processed the pod yet. Wait a few seconds β if still no events, the scheduler may be overloaded or down.
Multiple containers β which one failed?
Each container has its own section in describe output with individual State, Last State, and Restart Count.
Best Practices
- Always read Events section first β it tells the chronological story
- Check Conditions for Ready/NotReady β explains why traffic isnβt routing
- Compare Requests vs Node capacity β for scheduling failures
- Use
kubectl get events --sort-byfor cluster-wide troubleshooting kubectl logs <pod> --previouscomplements describe β events show what, logs show why
Key Takeaways
kubectl describe podis the primary troubleshooting command- Events section at the bottom shows the complete lifecycle chronology
- Common patterns: FailedScheduling, ImagePullBackOff, OOMKilling, probe failures
- Events expire after 1 hour β check quickly after issues occur
- Combine with
kubectl logs --previousfor full diagnosis

Recommended
Kubernetes Recipes β The Complete Book100+ production-ready patterns with detailed explanations, best practices, and copy-paste YAML. Everything in one place.
Get the Book βLearn by Doing
CopyPasteLearn β Hands-on Cloud & DevOps CoursesMaster Kubernetes, Ansible, Terraform, and MLOps with interactive, copy-paste-run lessons. Start free.
Browse Courses β