kubernetes

Kubernetes Events Explained: A Powerful Troubleshooting Tool

Learn what Kubernetes events are, how to read them with kubectl, common reasons and messages, their 1 hour limit, and how to export them for alerting.

By Shubhankar Tripathi • • 5 min read

Kubernetes Events Explained: A Powerful Troubleshooting Tool

bitcodematrix.com | Kubernetes Series


1. Introduction

When something goes wrong in Kubernetes, the first question is usually: what did the cluster just try to do to this object? The answer is often found in events. An event is a small record that a component creates when something happens to an object: a Pod is scheduled, an image is pulled, a probe fails, a volume cannot be mounted or a Deployment scales up. Events are the cluster's running commentary, and they are the fastest way to understand why a Pod is Pending, restarting or not ready.

This article explains what events are, what their fields mean, how to read and filter them, which components produce which events, how to use them to diagnose common problems, their limits (most importantly their short lifetime), how to keep them longer and alert on them, and how to troubleshoot missing events. It complements the articles on Pod Pending troubleshooting, logging and monitoring architecture.

After reading it you should be able to:

  • Explain what a Kubernetes event is and how it differs from a log line or a metric.

  • Read, sort and filter events with kubectl.

  • Recognize the most common event reasons and what to do about them.

  • Understand the limits of events and how to export them for history and alerts.

  • Use events as the first step in a repeatable troubleshooting routine.

2. What Events Are

Events are Kubernetes API objects. A control plane component or the kubelet creates an Event that refers to another object, such as a Pod or a Node, and describes something that happened to it. Events are stored by the API server like other objects, which is why kubectl can list them, and they are deleted automatically after a fixed time.

Components create events in the API server, kubectl reads them and an exporter can ship them to a backend

Figure 1: Events are created by cluster components and expire quickly

Signal

What it answers

Events

What the cluster did or tried to do to an object, and why it failed. Short-lived.

Logs

What an application or component printed. Kept as long as your logging system keeps them.

Metrics

How much or how often, as numbers over time.

Object status and conditions

The current state of an object, such as Ready or not Ready.


Events do not replace the other signals. They are best for explaining state changes and failures of Kubernetes operations, such as scheduling, image pulls and volume mounts, while application behavior belongs in logs and trends belong in metrics.

3. Anatomy of an Event

kubectl get events -n default -o yaml

 

apiVersion: v1

kind: Event

metadata:

  name: web-6d8f9-abc.17a1b2c3d4e5f678

  namespace: default

involvedObject:

  kind: Pod

  name: web-6d8f9-abc

  namespace: default

type: Warning

reason: FailedScheduling

message: "0/3 nodes are available: 3 Insufficient cpu."

source:

  component: default-scheduler

count: 4

firstTimestamp: "2026-10-13T05:30:01Z"

lastTimestamp: "2026-10-13T05:34:12Z"


Field

Meaning

type

Normal for routine happenings or Warning for problems.

reason

A short, CamelCase code such as Scheduled, Pulled, BackOff or FailedMount. It is the best field to filter and alert on.

message

A human-readable explanation, often with the actual error.

involvedObject

The object the event is about: kind, name and namespace.

source (or reporting component)

The component that reported it, such as default-scheduler, kubelet or deployment-controller.

count, firstTimestamp, lastTimestamp

Repeated identical events are aggregated into one event whose count increases, instead of creating many objects.


Kubernetes also has a newer Event API in the events.k8s.io group, with field names such as regarding, note and series. The core v1 events are still widely used and both are served, so you normally interact with them in the same way through kubectl.

Events are namespaced and live in the namespace of the object they refer to. Events about cluster-scoped objects, such as Nodes, are normally created in the default namespace, which is why a node event can seem to be missing if you look in the wrong namespace.

4. Reading Events with kubectl

4.1 kubectl describe

The simplest way is kubectl describe, which prints the events for that object at the end of its output.

kubectl describe pod <pod-name>

kubectl describe node <node-name>

kubectl describe pvc <pvc-name>

kubectl describe deployment <name>


4.2 kubectl get events

# Events in the current namespace (order is not guaranteed)

kubectl get events

 

# Sorted by time, newest last

kubectl get events --sort-by=.lastTimestamp

 

# All namespaces

kubectl get events -A --sort-by=.lastTimestamp

 

# Only warnings

kubectl get events --field-selector type=Warning

 

# Events about one object

kubectl get events --field-selector involvedObject.name=<pod-name>

kubectl get events --field-selector involvedObject.kind=Node

 

# A specific reason

kubectl get events -A --field-selector reason=FailedScheduling

 

# Watch new events as they happen

kubectl get events -w


4.3 kubectl events

Recent kubectl versions include a dedicated kubectl events command that sorts events by time and can filter by object. Check that your kubectl version has it.

kubectl events

kubectl events --for pod/<pod-name>

kubectl events --types=Warning

kubectl events -A --watch


Task

Command

Why is this Pod not starting?

kubectl describe pod <pod>

What went wrong recently in the namespace?

kubectl get events --sort-by=.lastTimestamp

Any problems anywhere?

kubectl get events -A --field-selector type=Warning

What is happening right now?

kubectl get events -w

Events of a Node

kubectl describe node <node>


5. Common Events by Component

Reasons are not a fixed public contract, and new ones appear in new versions, but the common ones have been stable for years.

5.1 Scheduler

Reason

Meaning and action

Scheduled (Normal)

The Pod was assigned to a node. The message names the node.

FailedScheduling (Warning)

No node fits. The message lists the reasons, such as Insufficient cpu or untolerated taints. See the Pod Pending troubleshooting article.

Preempted (Normal)

The Pod was evicted by the scheduler to make room for a higher-priority Pod.


5.2 Kubelet: starting and running containers

Reason

Meaning and action

Pulling, Pulled (Normal)

The image is being pulled or was pulled. The Pulled message often shows how long it took.

Failed, ErrImagePull, BackOff (Warning)

The image pull failed or is being retried with a delay. Check the image name, tag and registry credentials.

Created, Started (Normal)

The container was created and started.

Unhealthy (Warning)

A liveness, readiness or startup probe failed. The message shows the probe error.

Killing (Normal or Warning)

The kubelet is stopping the container, for example after a failed liveness probe or a deletion.

BackOff: Back-off restarting failed container (Warning)

A container keeps crashing, so restarts are being delayed. This is CrashLoopBackOff. Read the previous container logs.

FailedMount, FailedAttachVolume (Warning)

A volume could not be mounted or attached, for example a missing ConfigMap or Secret or a volume still attached elsewhere.

FailedCreatePodSandBox (Warning)

The Pod network or runtime sandbox could not be created, often a CNI or runtime problem.

Evicted (Warning)

The kubelet evicted the Pod because the node ran low on a resource such as memory or disk.


5.3 Controllers and autoscalers

Reason

Meaning and action

SuccessfulCreate, SuccessfulDelete (Normal)

A ReplicaSet, Job or StatefulSet created or deleted a Pod.

FailedCreate (Warning)

A controller could not create a Pod. Common causes are quota, admission webhooks, Pod Security and missing ServiceAccounts.

ScalingReplicaSet (Normal)

A Deployment scaled a ReplicaSet up or down during a rollout or scaling.

SuccessfulRescale (Normal)

The Horizontal Pod Autoscaler changed the replica count.

FailedGetResourceMetric, FailedComputeMetricsReplicas (Warning)

The HPA could not read metrics. Check Metrics Server and Pod requests.

BackoffLimitExceeded, DeadlineExceeded (Warning)

A Job failed too many times or ran too long.

TriggeredScaleUp, NotTriggerScaleUp (Normal)

The Cluster Autoscaler added nodes, or decided that adding nodes would not help a Pending Pod.


5.4 Nodes and storage

Reason

Meaning and action

NodeNotReady, NodeReady (Normal or Warning)

The node controller changed the Ready state of a node. See the node conditions.

NodeHasDiskPressure, NodeHasMemoryPressure (Normal or Warning)

The node reports resource pressure, which can lead to evictions.

ProvisioningFailed (Warning)

A dynamic volume could not be created. Read the PVC events and the storage driver logs.

FailedBinding, WaitForFirstConsumer

A PVC is not bound yet. WaitForFirstConsumer is normal until a Pod uses it.


6. Troubleshooting with Events

Events are the first step in most Pod problems. The pattern is always the same: find the object that is wrong, read its events from the oldest to the newest, and follow the chain.

Symptom

Events to look for and what they mean

Pod Pending

FailedScheduling: read the node-by-node reasons. If there is no event, the scheduler is not handling the Pod.

ContainerCreating for a long time

FailedMount, FailedCreatePodSandBox or slow Pulling events show a volume, network or image problem.

ImagePullBackOff

Failed with a pull error message, then BackOff. Wrong tag, missing credentials or network issues.

CrashLoopBackOff

BackOff restarting failed container, with a growing delay. Then read kubectl logs --previous.

Running but not Ready

Unhealthy: Readiness probe failed. Fix the probe, the port or the application start-up.

Restarts without a crash

Unhealthy: Liveness probe failed, then Killing. The probe may be too strict.

Pod disappeared

Evicted, Preempted, or a node problem such as NodeNotReady and TaintManagerEviction.

Deployment has fewer Pods than expected

FailedCreate on the ReplicaSet, for example exceeded quota or an admission webhook denial.

HPA not scaling

FailedGetResourceMetric or missing request errors in HPA events.

Job failing

BackoffLimitExceeded or DeadlineExceeded on the Job.


# A good first routine for a misbehaving workload

kubectl get pods -o wide

kubectl describe pod <pod>

kubectl get events --sort-by=.lastTimestamp | tail -20

kubectl logs <pod> --previous


7. Limitations of Events

  • Short lifetime. The API server deletes events after a time to live, one hour by default (the event-ttl setting, which managed services usually do not let you change). An incident from last night usually has no events left.

  • Aggregation. Repeated events are merged and counted. You see the first and last time, not every occurrence.

  • Rate limiting and best effort. Components limit how fast they emit events and may drop them under load, so events are not an audit trail.

  • Namespaced and scattered. You must look in the right namespace, and node events often sit in the default namespace.

  • Load on etcd. Events are objects in etcd, and a flood of events in a large or unstable cluster adds load. This is another reason for the short lifetime.

  • Free text. The message format is not stable and should not be parsed in scripts. Use the reason field.

  • Not logs. They explain Kubernetes actions, not what your application did.

8. Keeping Events Longer

To investigate incidents after the fact, copy events to a place that keeps them. Several approaches are common, and the tools evolve, so check which are maintained when you choose.

Approach

Notes

Event exporter or router

A small controller watches events and forwards them to a sink such as Elasticsearch, a webhook, Slack or a message queue. The kubernetes-event-exporter project is a popular example.

Logging agent with an events source

Some agents can collect Kubernetes events directly, for example Fluent Bit and Grafana Alloy, and store them with your logs.

Managed platform integration

Many cloud services and observability platforms collect events automatically. Check what your provider keeps and for how long.

Scripted snapshots

A scheduled job running kubectl get events -A -o json for simple cases, which is crude but easy.


Note that kube-state-metrics and Prometheus do not store events. To alert on events you need an exporter or a logging pipeline that supports alerts on the stored records.

9. Alerting on Events

Events can drive useful alerts, provided you filter them carefully, because many Warning events are harmless and short-lived.

Event reason

Why alert

FailedScheduling for more than several minutes

Workloads cannot start. Pair with a Pending Pods alert from metrics.

BackOff, Unhealthy

Crash loops and failing probes.

Evicted, NodeNotReady, NodeHasDiskPressure

Node trouble and resource pressure.

FailedMount, ProvisioningFailed

Storage problems that block Pods.

FailedCreate

Controllers blocked by quota or admission policy.

OOM related node events

Memory pressure on nodes (see the OOMKilled article).


  • Alert on the reason and the namespace, not on the message text.

  • Use counts or time windows so that one transient event does not page anyone.

  • Prefer metrics-based alerts for steady conditions, and use events as extra context in the notification.

10. Hands-On Walkthrough

  1. Watch events in one terminal.

kubectl get events -w


  1. In another terminal, create a Pod with a wrong image tag.

kubectl run bad-image --image=nginx:does-not-exist


  1. Observe the sequence in the first terminal: Scheduled, Pulling, Failed, then BackOff. Read the same sequence with describe.

kubectl describe pod bad-image | grep -A12 Events


  1. Create a Pod that cannot be scheduled because of a huge request.

apiVersion: v1

kind: Pod

metadata:

  name: too-big

spec:

  containers:

  - name: app

    image: nginx:1.27

    resources:

      requests:

        memory: 500Gi


kubectl apply -f too-big.yaml

kubectl get events --field-selector involvedObject.name=too-big


  1. Create a Pod with a failing liveness probe and watch Unhealthy and Killing events.

apiVersion: v1

kind: Pod

metadata:

  name: bad-probe

spec:

  containers:

  - name: app

    image: nginx:1.27

    livenessProbe:

      httpGet:

        path: /does-not-exist

        port: 80

      initialDelaySeconds: 3

      periodSeconds: 5

      failureThreshold: 2


kubectl apply -f bad-probe.yaml

kubectl get events --field-selector involvedObject.name=bad-probe -w


  1. Filter only warnings across the namespace, then clean up.

kubectl get events --field-selector type=Warning --sort-by=.lastTimestamp

kubectl delete pod bad-image too-big bad-probe


After the Pods are deleted, their events remain until the time to live ends, then disappear. This shows why you should read events early.

11. When Events Are Missing

Symptom

Likely cause and fix

kubectl describe shows Events: <none>

The events expired (older than about one hour), or nothing has happened since. Recreate the problem or check logs and exported events.

Events for a Node are not found

Look in the default namespace, or use kubectl get events -A with a field selector for involvedObject.kind=Node.

Events seem to be out of order

Sort by .lastTimestamp. The default list order is not a guaranteed timeline.

The count is high but few events are listed

Aggregation: identical events are merged. Look at count, firstTimestamp and lastTimestamp.

Events not in the logging backend

The exporter is not running, lacks RBAC permission to list and watch events, or filters them out.

Cannot list events: forbidden

Your RBAC role lacks get, list or watch on events. Ask for read access.

Managed service shows different events

Providers may add their own events or collect them differently. Check the provider documentation.


12. Best Practices

  • Make events the first step of every Pod investigation: describe the object, then read recent events sorted by time.

  • Check events soon after a problem starts, because they expire quickly.

  • Use field selectors on type and reason to cut noise.

  • Export events to your logging or monitoring backend so that history survives the time to live.

  • Alert on a small set of meaningful reasons, with time windows, and include the event message in the notification.

  • Do not parse message text in automation. Use reason and involvedObject.

  • Combine events with logs and metrics for the full picture.

  • Write your own operators and controllers so that they emit events for important actions, which helps their users troubleshoot.

13. Conclusion

Kubernetes events are a small but powerful feature: they record what the cluster tried to do to your objects and why it failed. A few commands, kubectl describe, kubectl get events with sorting and field selectors, and kubectl events, solve a large share of everyday problems, from unschedulable Pods to failing probes and volume errors. Their short lifetime and aggregation are the main limits, and an event exporter or logging integration closes that gap. Use events first, then move to logs and metrics, and most mysteries get shorter.