kubectl describe explained: what to look for on Pods and Deployments
kubectl describe vs get: how to read Pod and Deployment output, Events, Conditions, lastState, and which command to run next. Optional kprompt examples.
kubectl get pods tells you something is wrong. kubectl describe tells you why. If STATUS, READY, or RESTARTS already confuse you, start with kubectl get pods explained — then come back here for the next command.
This guide is a beginner walkthrough of describe on Pods and Deployments: what each section means, which lines matter first, and what to run after you finish reading. Official reference: kubectl describe.
The one-sentence version
- get — a table: is it Running, Pending, CrashLoopBackOff?
- describe — the story: Events, Conditions, lastState, image, probes, mounts.
- Read Events from the bottom. Then logs. Then change one thing.
get vs describe
| kubectl get | kubectl describe | |
|---|---|---|
| Shape | One-line table | Multi-section dump |
| Best for | Scan many objects | Debug one object |
| Shows Events? | No (use get events) | Yes — last lines of describe |
| Shows Conditions? | Only READY in the table | Yes — Ready, Scheduled, … |
| Shows last crash? | RESTARTS count only | lastState / Last Termination |
Namespace matters — same as get
kubectl describe pod api-7d9f8c6b5-xk2n1 -n staging
kubectl describe deploy api -n staging
kubectl describe svc api -n staging
kubectl describe cm api-config -n stagingPrefer a name from get. For many replicas, pick one unhealthy Pod: kubectl get pods -l app=api -n staging, then describe that name. Labels and selectors explained covers -l.
Describe a Pod — read in this order
Do not start at the top and grind through every field. Jump in this order: Status / Node (is it scheduled?), Containers → State and Last State, Conditions, then Events at the bottom.
Status, node, and IP
If Status is Pending and Node is empty, the scheduler has not placed the Pod. Events will usually say FailedScheduling (CPU, memory, taints, or PVC). If Node is set but Status is CrashLoopBackOff, the Pod is on a node and the container keeps dying — skip to lastState and logs.
Containers: State, Last State, Restart Count
This block is the reason describe exists. State is now. Last State is the crash you just missed.
Typical crash block (abbreviated)
Containers:
api:
Image: ghcr.io/example/api:1.4.2
State: Waiting
Reason: CrashLoopBackOff
Last State: Terminated
Reason: Error
Exit Code: 1
Finished: Mon, 01 Sep 2026 10:12:03 +0000
Restart Count: 6- Exit Code 1 (or other app codes) — process crashed; read logs --previous.
- Exit Code 137 — often OOMKilled (128 + 9). Confirm in Reason and the OOMKilled guide.
- Exit Code 143 — SIGTERM (128 + 15); often a probe or a rollout, not a random crash.
- ImagePullBackOff here — wrong image, tag, or registry auth; see ImagePullBackOff.
Also check the Image line. A typo in the tag is a describe finding, not a “Kubernetes is broken” finding.
Conditions
| Condition | True means | If False, look at |
|---|---|---|
| PodScheduled | A node accepted the Pod | Events: FailedScheduling |
| Initialized | Init containers finished | Init container State / logs |
| ContainersReady | App containers report ready | Probes, crashes, ports |
| Ready | Pod can receive Service traffic | Readiness probe + Service selector |
Ready False while Running is common: the process is up, the readiness probe fails, the Service has no Endpoints. That is a Service problem as much as a Pod problem — see What is a Kubernetes Service.
Events (read the bottom first)
Events are the cluster’s recent comments. They age out. If describe Events is empty, run kubectl get events -n staging --sort-by=.lastTimestamp and look at the tail.
Events you will actually see
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal Scheduled 4m default-scheduler Successfully assigned staging/api-… to node-2
Normal Pulled 3m kubelet Successfully pulled image
Normal Created 3m kubelet Created container api
Normal Started 3m kubelet Started container api
Warning Unhealthy 90s kubelet Readiness probe failed: HTTP 500
Warning BackOff 40s kubelet Back-off restarting failed container api- FailedScheduling — not enough CPU/memory, taint, or unbound PVC.
- FailedCreatePodSandBox / network — CNI; not an app log problem.
- Unhealthy — probe failed (liveness restarts; readiness drops traffic).
- BackOff / CrashLoopBackOff — kubelet waiting; the cause is Last State + logs.
- FailedMount — ConfigMap, Secret, or volume name mismatch. See ConfigMap vs Secret.
Describe a Deployment
Describe the Deployment when many Pods look wrong, or when a rollout is stuck. You want replica counts and Deployment conditions — not every Pod field. Refresh What is a Deployment if replicas vs Pods is still fuzzy.
What to extract from describe deploy
kubectl describe deploy api -n staging
# Replicas: 3 desired | 3 updated | 2 total | 1 available | 1 unavailable
# Conditions:
# Type Status Reason
# Progressing True NewReplicaSetAvailable
# Available False MinimumReplicasUnavailable
# OldReplicaSets / NewReplicaSet — which revision is live- desired > available — some Pods are not Ready (probes, crashes, Pending).
- updated != desired during a rollout — wait, or describe the new Pods.
- OldReplicaSets still listed — a previous revision has Pods; labels may have changed.
Then describe one bad Pod from that Deployment. Deployment describe does not replace Pod Events.
After describe — what to run next
| You saw | Next command | Then read |
|---|---|---|
| CrashLoop / Exit Code 1 | kubectl logs POD -n staging --previous --tail=200 | CrashLoopBackOff guide |
| OOMKilled / exit 137 | describe again — memory limit vs usage | OOMKilled guide |
| ImagePullBackOff | check Image: line and imagePullSecrets | ImagePullBackOff guide |
| FailedScheduling | kubectl describe node NODE (or get events) | requests vs cluster free capacity |
| Ready False, Running | readiness probe path/port; kubectl get endpoints | Service vs Deployment |
| FailedMount | describe the ConfigMap or Secret name in the Event | ConfigMap vs Secret |
The beginner loop
kubectl get pods -n staging
kubectl describe pod POD_NAME -n staging
kubectl logs POD_NAME -n staging --tail=200
kubectl logs POD_NAME -n staging --previous
kubectl get events -n staging --sort-by=.lastTimestampCommon beginner mistakes
- Reading only the top of describe and skipping Events.
- Describing the Deployment and never describing a Pod — Events live on the Pod.
- Forgetting -n and describing a name that exists in default, not staging.
- Looking at current logs after a crash — you need --previous for the dead container.
- Treating Warning Events as noise. Age matters: a Warning from 20 minutes ago may be the cause.
- Editing YAML before you can point at one Event line. Describe first, change second.
Same checks in natural language (optional)
kprompt can run the describe/logs loop as a read. Mutations still show a plan and ask for approval on a TTY.
Soft kprompt examples
kprompt "describe pod for deployment api in staging"
kprompt "describe deployment api in staging"
kprompt "show events for api in staging"
kprompt "explain why api pods are crashing in staging"What to learn next
You can now move from the get table to a describe story. The next beginner posts in this track are not published yet: Kubernetes requests and limits, then liveness vs readiness probes. Until those ship, go deeper on the failures describe already pointed at: CrashLoopBackOff, ImagePullBackOff, and OOMKilled. If you skipped the table, start with kubectl get pods explained.
Related posts
kubectl get pods explained: STATUS, restarts, and next commands
How to read kubectl get pods output — READY, STATUS, RESTARTS, AGE — what CrashLoopBackOff and Pending mean, and which kubectl command to run next.
Read articleKubernetes ConfigMap vs Secret: what beginners need to know
ConfigMap vs Secret in Kubernetes: when to use each, env vars and volume mounts, kubectl get/describe, common beginner mistakes, and optional kprompt examples.
Read articleKubernetes labels and selectors explained (the glue between objects)
Labels and selectors in Kubernetes: how Deployments label Pods, how Services find them, kubectl -l and endpoints checks, common mistakes, and optional kprompt examples.
Read article