Files
descheduler/pkg/framework/plugins/podlifetime

PodLifeTime Plugin

What It Does

The PodLifeTime plugin evicts pods based on their age, status phase, condition transitions, container states, exit codes, and owner kinds. It can be used for simple age-based eviction or for fine-grained cleanup of pods matching specific transition criteria.

How It Works

The plugin builds a filter chain from the configured criteria. All non-empty filter categories are ANDed together (a pod must satisfy every specified filter to be evicted). Within each filter category, items are ORed (matching any one entry satisfies that filter).

Once pods are selected, they are sorted by their creation time with the oldest first, then evicted in order. Eviction stops when limits are reached (per-node limits, total limits, or Pod Disruption Budget constraints).

Use Cases

  • Evict completed/succeeded pods that have been idle too long:

    args:
      states: [Succeeded]
      conditions:
        - reason: PodCompleted
          status: "True"
          minTimeSinceLastTransitionSeconds: 14400  # 4 hours
    
  • Evict failed pods, excluding Job-owned pods:

    args:
      states: [Failed]
      exitCodes: [1]
      ownerKinds:
        exclude: [Job]
      maxPodLifeTimeSeconds: 3600
      includingInitContainers: true
    
  • Resource Leakage Mitigation: Restart long-running pods that may have accumulated memory leaks:

    args:
      maxPodLifeTimeSeconds: 604800  # 7 days
      states: [Running]
    
  • Clean up stuck pods in CrashLoopBackOff:

    args:
      states: [CrashLoopBackOff, ImagePullBackOff]
    
  • Evict pods owned only by specific kinds:

    args:
      states: [Succeeded, Failed]
      ownerKinds:
        include: [Job]
      maxPodLifeTimeSeconds: 600
    

Configuration

Parameter Description Type Required Default
maxPodLifeTimeSeconds Pods older than this many seconds are evicted uint No* nil
states Filter pods by phase, pod status reason, or container waiting/terminated reason. A pod matches if any of its state values appear in this list []string No nil
conditions Only evict pods with matching status conditions (see PodConditionFilter) []PodConditionFilter No nil
exitCodes Only evict pods with matching container terminated exit codes []int32 No nil
ownerKinds Include or exclude pods by owner reference kind OwnerKinds No nil
namespaces Limit eviction to specific namespaces (include or exclude) Namespaces No nil
labelSelector Only evict pods matching these labels metav1.LabelSelector No nil
includingInitContainers Extend state/exitCode filtering to init containers bool No false
includingEphemeralContainers Extend state filtering to ephemeral containers bool No false

*At least one filtering criterion must be specified (maxPodLifeTimeSeconds, states, conditions, or exitCodes).

States

The states field matches pods using an OR across these categories:

Category Examples
Pod phase Running, Pending, Succeeded, Failed, Unknown
Pod status reason NodeAffinity, NodeLost, Shutdown, UnexpectedAdmissionError
Container waiting reason CrashLoopBackOff, ImagePullBackOff, ErrImagePull, CreateContainerConfigError, CreateContainerError, InvalidImageName, PodInitializing, ContainerCreating
Container terminated reason OOMKilled, Error, Completed, DeadlineExceeded, Evicted, ContainerCannotRun, StartError

When includingInitContainers is true, init container states are also checked. When includingEphemeralContainers is true, ephemeral container states are also checked.

PodConditionFilter

Each condition filter matches against pod.status.conditions[] entries. Within a single filter, all specified field-level checks must match (AND). Unset fields are not checked. Across the list, condition filters are ORed — a pod is eligible for eviction if any of the listed condition filters match.

Field Description
type Condition type (e.g., Ready, Initialized, ContainersReady)
status Condition status (True, False, Unknown)
reason Condition reason (e.g., PodCompleted)
minTimeSinceLastTransitionSeconds Require the matching condition's lastTransitionTime to be at least this many seconds in the past

At least one of these fields must be set per filter entry.

When minTimeSinceLastTransitionSeconds is set on a filter, a pod's condition must both match the type/status/reason fields AND have transitioned long enough ago. If the condition has no lastTransitionTime, it does not match.

OwnerKinds

Field Description
include Only evict pods owned by these kinds
exclude Do not evict pods owned by these kinds

At most one of include/exclude may be set.

Example

Age-based eviction with state filter

apiVersion: descheduler/v1alpha2
kind: DeschedulerPolicy
profiles:
  - name: default
    plugins:
      deschedule:
        enabled:
          - name: PodLifeTime
    pluginConfig:
      - name: PodLifeTime
        args:
          maxPodLifeTimeSeconds: 86400  # 1 day
          states:
            - Running
          namespaces:
            include:
              - default

Transition-based eviction for completed pods

apiVersion: descheduler/v1alpha2
kind: DeschedulerPolicy
profiles:
  - name: default
    plugins:
      deschedule:
        enabled:
          - name: PodLifeTime
    pluginConfig:
      - name: PodLifeTime
        args:
          states:
            - Succeeded
          conditions:
            - reason: PodCompleted
              status: "True"
              minTimeSinceLastTransitionSeconds: 14400
          namespaces:
            include:
              - default

This configuration evicts Succeeded pods in the default namespace that have a PodCompleted condition with status True and whose last matching transition happened more than 4 hours ago.