Kubernetes Evicted Pods: Causes and Prevention
When a production workload disappears from a node. The word "evicted" can obscure the real failure: Kubernetes removed the Pod because the node could no longer provide a safe operating margin. That usually points to resource pressure, scheduling decisions, or an intentional disruption, not an application crash.
A kubernetes evicted pod is a Pod terminated by Kubernetes, commonly because the kubelet detected that available node memory or filesystem capacity had crossed an eviction threshold. The kubelet compares signals such as memory.available and nodefs.available against configured thresholds before reclaiming resources. See the Kubernetes node-pressure eviction documentation for the underlying behavior.
The useful response is not simply to delete and recreate the workload. First identify which pressure signal or scheduling event caused the eviction, then correct the capacity, requests, limits, priority, or placement assumptions that made the Pod vulnerable. Those causes are distinct, and separating them is the first step toward preventing repeat incidents.
Eviction prevention is a day-2 Kubernetes problem that materializes at node capacity. And it is exactly the kind of operational signal a fleet-wide control plane helps you keep ahead of. If you manage ten or more clusters. A unified view of resource pressure and scheduling across nodes pays for itself the first time a memory spike starts evicting workloads.
Request a demo of Plural's AI-native Kubernetes control plane.
What Causes a Kubernetes Evicted Pod?
A Kubernetes evicted pod is usually a symptom of a node running short of a resource, but resource pressure is not the only cause. The kubelet can terminate pods to protect the node, the scheduler can preempt lower-priority workloads, and taints can remove pods from nodes that are no longer suitable. The remediation depends on which mechanism acted and why.
Node pressure from memory and disk
The most common path is node-pressure eviction. The kubelet monitors the resources available on each node and can proactively terminate pods when consumption reaches configured levels. This is intended to reclaim capacity before the node becomes completely starved. Kubernetes documents memory, filesystem space, filesystem inodes, and image filesystem space as eviction signals. In practice, memory.available and nodefs.available are especially useful starting points when investigating a Kubernetes evicted pod.
The kubelet compares those signals with eviction thresholds, which define the minimum resource that should remain available. A node can therefore evict pods even when a container has not exceeded its own memory limit. The node may be under pressure because several workloads collectively consume memory, logs or writable layers fill the filesystem, or container images consume the image filesystem. Before terminating end-user pods, the kubelet attempts to reclaim node-level resources, such as removing unused container images.
See the Kubernetes node-pressure eviction documentation for the signals and threshold behavior. The same documentation explains that a node-pressure eviction sets the selected pod's phase to Failed and terminates it. If a Deployment or StatefulSet owns the pod, the control plane normally creates a replacement, but that replacement may encounter the same pressure if capacity has not changed.
Preemption and priority decisions
Preemption is a different mechanism. When a higher-priority pod cannot be scheduled because available capacity is insufficient, Kubernetes may terminate lower-priority pods to make room. The scheduler's decision is based on pod priority and placement constraints, not necessarily on a node crossing a kubelet eviction threshold. Review PriorityClass assignments and scheduling events before treating every eviction as a memory or disk incident.
Taints, node health, and NoExecute
Taints can also cause a pod to leave a node. A NoExecute taint evicts running pods that do not have a matching toleration. For example, when a node becomes NotReady or otherwise unhealthy, Kubernetes components may apply taints that prevent unsuitable workloads from remaining there. A toleration can allow a pod to stay temporarily or indefinitely, depending on its configuration, but it does not restore a node's health or create additional capacity.
Scheduling rules should be considered together rather than configured in isolation. Review taints and node affinity alongside resource requests, priorities, and node conditions. That combination usually reveals whether the eviction was caused by physical pressure, a deliberate scheduling policy, or a degraded node.
Kubelet Eviction Thresholds: Hard vs Soft
The kubelet does not wait for a node to become unusable before responding to resource pressure. It watches eviction signals such as memory.available and nodefs.available, then compares those signals with configured thresholds. When a threshold is crossed, the kubelet works to recover capacity and may terminate pods if the pressure continues. This behavior is documented in the Kubernetes node-pressure eviction documentation.
The distinction between hard and soft thresholds determines how much shutdown time a pod receives. That difference is operationally significant for applications that need to flush buffers, close connections, or persist state before termination.
| Characteristic | Hard threshold | Soft threshold |
|---|---|---|
| Trigger behavior | Triggers when the eviction signal reaches the configured hard boundary. | Triggers when the eviction signal remains beyond the configured boundary for the required soft-grace interval. |
| Pod termination grace | Uses a 0-second grace period, which means immediate shutdown. | Respects eviction-max-pod-grace-period, allowing a bounded graceful shutdown. |
| Operational tradeoff | Protects node availability aggressively, but can interrupt application cleanup. | Gives workloads time to exit cleanly, but leaves the node under pressure longer. |
| Best fit | Severe pressure where preserving node stability is more important than graceful application termination. | Predictable pressure conditions where workloads benefit from controlled shutdown behavior. |
Resource reclamation comes before pod termination
Thresholds do not mean that the kubelet immediately selects an end-user pod. It first attempts to reclaim node-level resources. For example, when disk resources are starved, it can remove unused container images. Only after these reclamation steps fail to resolve the pressure does the kubelet proceed to terminate pods.
This ordering matters when diagnosing a kubernetes evicted pod. An eviction is not necessarily evidence that scheduling placed too many replicas on the node. It may indicate that image storage, local ephemeral storage, or memory availability crossed a protection boundary. Inspect the relevant eviction signal and node conditions, then compare the timing with image garbage collection and workload activity.
Hard thresholds are a last line of defense against resource starvation, not a substitute for capacity planning. Soft thresholds can reduce abrupt disruption, but they still require enough spare capacity for the grace period to be useful. Treat the threshold configuration, node sizing, workload requests, and observability data as one operating system rather than tuning any single value in isolation.
How Does a Pod Get Evicted? Node-Pressure vs API Eviction
A pod can leave a node for very different reasons, and the distinction matters when you are diagnosing a Kubernetes evicted pod. Node-pressure eviction is an emergency resource-management action taken by the kubelet. API-initiated eviction is a controlled request made through the Kubernetes API, commonly during planned maintenance or a node drain. Both terminate a pod, but they do not provide the same disruption guarantees.
Node-pressure eviction prioritizes node survival
When a node approaches a configured resource threshold, the kubelet monitors eviction signals such as memory.available and nodefs.available. It can proactively terminate selected pods to reclaim capacity and prevent the node from reaching a more severe failure state. Before terminating end-user pods, the kubelet attempts to reclaim node-level resources, such as removing unused container images when disk resources are constrained. See the Kubernetes node-pressure eviction documentation for the signals and thresholds involved.
This path is not a voluntary disruption workflow. Node-pressure eviction does not respect a pod's PodDisruptionBudget or its configured terminationGracePeriodSeconds. Under a hard eviction threshold, termination uses a zero-second grace period, so an application may have little or no time to flush state or finish in-flight work. Soft thresholds can give the kubelet a configured eviction grace period, but that still does not make the eviction subject to a PDB.
For a managed workload, the control plane can create replacement pods after the evicted pod is marked failed. That replacement is useful for restoring the desired replica count, but it does not undo the interruption or guarantee that the replacement will schedule on a healthier node.
API eviction follows an admission-controlled shutdown
API-initiated eviction is designed for graceful, voluntary disruption. A client can create an Eviction object directly, or a command such as kubectl drain can request evictions while preparing a node for maintenance. The API server first performs its admission checks. If the request is allowed, the pod is marked for termination. The kubelet then observes that state and begins the pod's graceful shutdown process.
Unlike node-pressure eviction, this workflow respects both the pod's PodDisruptionBudget and terminationGracePeriodSeconds. A PDB can therefore prevent the API server from taking down too many healthy replicas at once. If the disruption budget does not allow the request, the API may return 429 Too Many Requests, and the eviction can be retried after availability is restored. These behaviors are described in the Kubernetes Eviction API documentation.
The operational takeaway is straightforward: a PDB protects against planned API-driven disruption, not a node that is already running out of memory or disk. Use graceful eviction for maintenance, and treat node pressure as a capacity and reliability problem that requires investigation.
How to Detect Evicted Pods in Your Cluster
Start with the Pod list, then trace the eviction back to the node and kubelet that reported it. A Pod marked as evicted is not merely absent from service. Kubernetes records it as a failed Pod, with a reason of Evicted, so the object contains useful evidence about what happened and when.
Find Pods with an Evicted status
For a quick namespace-level check, filter the Pod list directly:
kubectl get pods -n <namespace> | grep -i evictedTo inspect all namespaces, add the --all-namespaces flag:
kubectl get pods --all-namespaces | grep -i evictedThe output identifies the namespace, Pod name, readiness state, status, restart count, and age. Those fields help establish whether the issue is isolated to one workload or spread across several namespaces. If the status is not obvious in a wider output, request the Pod in YAML and inspect its status fields:
kubectl get pod <pod-name> -n <namespace> -o yaml
kubectl describe pod <pod-name> -n <namespace>Look for status.phase: Failed and a status.reason: Evicted value. The message often describes the resource pressure that led to termination. The container details can also include a Last State entry, which helps distinguish an eviction from an application crash or an ordinary restart. Preserve this output before deleting the object if you need it for incident review.
Inspect node conditions and events
Next, identify the node that hosted the Pod and inspect its conditions:
kubectl describe node <node-name>In the Conditions section, check for signals such as memory pressure or disk pressure. The node description also shows allocatable resources, current requests and limits, taints, and the list of running Pods. Compare those details with the time of the eviction. A node under sustained pressure points toward capacity, resource requests, image storage, or workload placement rather than an isolated application defect.
Cluster events provide the timeline:
kubectl get events --all-namespaces --sort-by=.lastTimestampFilter the result by namespace, Pod name, node name, or keywords such as Evicted, MemoryPressure, and DiskPressure. Events are short-lived in many clusters, so ship them to a durable system when your incident process requires a longer record. The Kubernetes incident response runbook can help turn these checks into a repeatable investigation.
Use kubelet logs to confirm the trigger
When the Pod status and events do not explain the trigger, inspect kubelet logs on the affected node. The exact command depends on the operating system and service manager, but a systemd-based node commonly uses:
sudo journalctl -u kubelet --since "1 hour ago"Search the relevant time window for eviction messages, resource signals, and the Pod UID. Kubelet logs can show whether the eviction manager reacted to memory or filesystem pressure and which resources it attempted to reclaim. Correlate that evidence with node and container metrics, including available memory, filesystem usage, and workload-level resource consumption. This broader view is especially useful when several Pods were evicted together. Pairing event investigation with runtime security and observability gives operators a more complete record of cluster behavior.
Runtime security and observability tooling surfaces the pressure signals behind evictions before they become incidents. Plural's agent-based platform brings those signals into one console, so pattern-developing evictions across a fleet are visible in one place rather than scattered across per-cluster dashboards.
Start today with Plural's single pane of glass for Kubernetes fleet management.
How to Prevent Kubernetes Pod Evictions
Prevention starts before the kubelet sees a node under pressure. Treat scheduling, capacity, and node maintenance as one operating discipline rather than as separate configuration tasks. The following sequence gives platform teams a practical baseline for reducing avoidable evictions while preserving room for legitimate workload growth.
Set accurate requests and limits for every container
Measure actual CPU and memory consumption, then set requests that represent the resources a container needs to be scheduled reliably. Set limits that contain abnormal growth without making normal workload behavior impossible. A request that is too low can pack too many workloads onto one node, while an inflated request can leave usable capacity stranded and force unnecessary scale-out. Review these values after major application changes, not only during the initial deployment.
Use quality-of-service classes intentionally
Kubernetes assigns each Pod a quality-of-service class based on its resource configuration: Guaranteed, Burstable, or BestEffort. Use Guaranteed for workloads that need the most predictable resource reservation, and use Burstable when a workload has a meaningful baseline but can consume additional capacity. BestEffort should be reserved for genuinely disposable work. Do not choose a class by habit. Make the tradeoff explicit for each service, especially when a node may experience memory or disk pressure.
Plan node capacity with operational headroom
Do not size nodes so that requests consume every allocatable resource. Leave headroom for system DaemonSets, kubelet activity, bursts, image pulls, and ordinary variance between requested and observed usage. Track memory and filesystem signals over time, then adjust node groups before pressure becomes an incident. Your node pool capacity planning should account for failure scenarios and deployment surges, not just average utilization.
Apply priority classes and preemption carefully
Priority classes help Kubernetes decide which workloads matter most when scheduling space is constrained. Define a small, documented hierarchy for platform components and business-critical services. Test preemption before relying on it: a higher-priority Pod can terminate lower-priority Pods to make room. So an overly broad priority assignment can turn local pressure into a wider disruption. Pair priority with accurate requests and disruption policies rather than treating it as a substitute for capacity.
Limit namespace consumption with resource quotas
Resource quotas keep one team or environment from consuming all of a cluster's available CPU and memory requests or limits. Set quotas by namespace, review them as workloads grow, and make the admission feedback clear to application teams. Quotas do not create capacity, but they make demand visible and prevent uncontrolled deployments from silently crowding out other services.
Keep image storage and node filesystems under control
Disk pressure can evict Pods even when application memory looks healthy. Configure and monitor image garbage collection, remove abandoned workloads, and investigate log growth and ephemeral-storage usage. The kubelet attempts to reclaim node-level resources before terminating end-user Pods. For example, it removes unused container images when disk resources are starved, as documented in the Kubernetes node-pressure eviction guidance. That recovery path is useful, but it should not replace capacity planning or storage hygiene.
Keep nodes healthy and make the controls observable
Monitor memory, filesystem availability, inode consumption, pending Pods, failed scheduling events, and node conditions across the fleet. Drain or replace unhealthy nodes through a controlled maintenance process, and verify that workloads have enough replicas and suitable placement rules to move safely. A unified control plane such as Plural helps platform teams connect resource configuration, scheduling, fleet changes, and day-2 observability across clusters. That visibility makes it possible to correct the conditions behind a Kubernetes evicted pod before repeated replacements become an availability problem.
Kubernetes Evicted Pod vs Deleted Pod: What's the Difference?
An evicted pod and a deleted pod may both disappear from the list of running workloads, but they represent different operational events. Eviction is a resource or scheduling decision made by Kubernetes. Deletion is an intentional request from an operator or another API client.
What does an evicted pod mean?
A kubernetes evicted pod is terminated because Kubernetes needs to respond to a cluster condition. The kubelet can initiate node-pressure eviction when resources such as available memory or filesystem space fall below configured thresholds. Scheduling mechanisms can also trigger eviction-related behavior, for example when a controller or maintenance workflow requests that workloads leave a node.
For node-pressure eviction, Kubernetes sets the pod phase to Failed and records the reason as Evicted. If a Deployment, StatefulSet, or another workload controller manages the pod, the control plane can create a replacement. That replacement is a new pod, however, so its name, IP address, and local ephemeral state may differ from the original.
The important operational distinction is that node-pressure eviction is not a graceful voluntary disruption. The kubelet does not respect the pod's PodDisruptionBudget or configured terminationGracePeriodSeconds when reclaiming resources under node pressure. This behavior is documented in the Kubernetes node-pressure eviction documentation.
What happens when a pod is deleted?
Deletion starts with an explicit API DELETE request, commonly issued with kubectl delete pod or by a controller. The request says that the named pod should be removed, rather than asking Kubernetes to respond to node pressure. Kubernetes follows the pod's configured terminationGracePeriodSeconds, allowing containers to receive termination signals and shut down cleanly before the pod is removed.
API-initiated eviction is related to deletion but is not the same operation. It uses the Eviction API, which performs admission checks and respects both PodDisruptionBudget rules and the pod's termination grace period. The API server can reject or delay that voluntary eviction when removing the pod would violate the disruption budget. See the Kubernetes Eviction API reference for the request flow.
In practice, investigate an evicted pod as a node-capacity or scheduling signal. Investigate a deleted pod as a change or automation event. Check node conditions, kubelet events, and workload-controller activity for eviction. For deletion, review audit logs, deployment tools, maintenance scripts, and the identity that issued the API request.
Before you move on, one takeaway: evicted pods are almost never an application bug. They are a signal about node capacity, requests and limits, or scheduling pressure. Fixing that layer instead of the Pod is what separates teams that keep seeing Failed pods from teams that prevent them.
Ready to try Plural and reduce day-2 Kubernetes toil?
Frequently Asked Questions
What does it mean when a Pod is evicted in Kubernetes?
An evicted Pod has been terminated because Kubernetes needed to reclaim node resources or because an eviction was requested through the API. During node-pressure eviction, the kubelet marks the Pod as Failed and records the reason as Evicted. If a Deployment or StatefulSet manages it, the control plane usually creates a replacement, provided the replacement can be scheduled on a node with sufficient capacity. See the Kubernetes node-pressure eviction documentation.
Why are Pods evicted in Kubernetes?
The most common cause is node pressure involving memory, filesystem space, filesystem inodes, or image storage. The kubelet compares signals such as memory.available and nodefs.available with configured eviction thresholds. It may reclaim node-level resources, including unused container images, before terminating end-user Pods. Scheduling preemption and taint-based eviction are separate causes that can also remove workloads.
What happens when a Pod is evicted?
The kubelet terminates the selected Pod and Kubernetes records a failed outcome. A workload controller then attempts to restore the desired replica count. The new Pod may remain Pending if the underlying capacity, scheduling, or node-health problem still exists, so replacement alone does not resolve the cause. Node-pressure eviction does not honor a PodDisruptionBudget or the Pod's configured termination grace period, unlike an API-initiated eviction. See the Kubernetes Eviction API documentation.
How do you fix an evicted Pod?
First inspect the Pod's events and the affected node to identify the pressured resource. Then address the cause by increasing node capacity, removing unnecessary workloads or images, correcting resource requests and limits, or adjusting scheduling constraints. Delete the failed Pod only after confirming its controller will recreate it. If evictions recur, treat the pattern as a capacity or resource-management issue rather than repeatedly cleaning up the status records.
Get Started With More Predictable Kubernetes Operations
Eviction prevention depends on consistent visibility into cluster health, resource pressure, and day-2 operations. Plural gives platform teams a unified control plane for managing Kubernetes fleets, so they can connect operational signals with the changes that address them.
Get a free trial of Plural's AI-native Kubernetes fleet management platform.