diff --git a/README.md b/README.md index e4f0dab9a..09ee596af 100644 --- a/README.md +++ b/README.md @@ -727,7 +727,9 @@ profiles: This strategy evicts pods that are older than `maxPodLifeTimeSeconds`. You can also specify `states` parameter to **only** evict pods matching the following conditions: - - [Pod Phase](https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle/#pod-phase) status of: `Running`, `Pending`, `Unknown` +> The primary purpose for using states like `Succeeded` and `Failed` is releasing resources so that new pods can be rescheduled. +> I.e., the main motivation is not for cleaning pods, rather to release resources. + - [Pod Phase](https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle/#pod-phase) status of: `Running`, `Pending`, `Succeeded`, `Failed`, `Unknown` - [Pod Reason](https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle/#pod-conditions) reasons of: `NodeAffinity`, `NodeLost`, `Shutdown`, `UnexpectedAdmissionError` - [Container State Waiting](https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle/#container-state-waiting) condition of: `PodInitializing`, `ContainerCreating`, `ImagePullBackOff`, `CrashLoopBackOff`, `CreateContainerConfigError`, `ErrImagePull`, `ImagePullBackOff`, `CreateContainerError`, `InvalidImageName` diff --git a/pkg/framework/plugins/podlifetime/pod_lifetime_test.go b/pkg/framework/plugins/podlifetime/pod_lifetime_test.go index 19bbe2572..7ce8ff21e 100644 --- a/pkg/framework/plugins/podlifetime/pod_lifetime_test.go +++ b/pkg/framework/plugins/podlifetime/pod_lifetime_test.go @@ -577,6 +577,32 @@ func TestPodLifeTime(t *testing.T) { pods[0].Status.Reason = "UnexpectedAdmissionError" }, }, + { + description: "1 pod with pod status phase v1.PodSucceeded should be evicted", + args: &PodLifeTimeArgs{ + MaxPodLifeTimeSeconds: &maxLifeTime, + States: []string{string(v1.PodSucceeded)}, + }, + pods: []*v1.Pod{p16}, + nodes: []*v1.Node{node1}, + expectedEvictedPodCount: 1, + applyPodsFunc: func(pods []*v1.Pod) { + pods[0].Status.Phase = v1.PodSucceeded + }, + }, + { + description: "1 pod with pod status phase v1.PodUnknown should be evicted", + args: &PodLifeTimeArgs{ + MaxPodLifeTimeSeconds: &maxLifeTime, + States: []string{string(v1.PodFailed)}, + }, + pods: []*v1.Pod{p16}, + nodes: []*v1.Node{node1}, + expectedEvictedPodCount: 1, + applyPodsFunc: func(pods []*v1.Pod) { + pods[0].Status.Phase = v1.PodFailed + }, + }, { description: "1 pod with pod status phase v1.PodUnknown should be evicted", args: &PodLifeTimeArgs{ diff --git a/pkg/framework/plugins/podlifetime/validation.go b/pkg/framework/plugins/podlifetime/validation.go index cd9775018..4eb2fc828 100644 --- a/pkg/framework/plugins/podlifetime/validation.go +++ b/pkg/framework/plugins/podlifetime/validation.go @@ -47,6 +47,8 @@ func ValidatePodLifeTimeArgs(obj runtime.Object) error { // Pod Status Phase string(v1.PodRunning), string(v1.PodPending), + string(v1.PodSucceeded), + string(v1.PodFailed), string(v1.PodUnknown), // Pod Status Reasons diff --git a/pkg/framework/plugins/podlifetime/validation_test.go b/pkg/framework/plugins/podlifetime/validation_test.go index 7caf85d1c..9c93be989 100644 --- a/pkg/framework/plugins/podlifetime/validation_test.go +++ b/pkg/framework/plugins/podlifetime/validation_test.go @@ -36,6 +36,14 @@ func TestValidateRemovePodLifeTimeArgs(t *testing.T) { }, expectError: false, }, + { + description: "Pod Status Reasons Succeeded or Failed", + args: &PodLifeTimeArgs{ + MaxPodLifeTimeSeconds: func(i uint) *uint { return &i }(1), + States: []string{string(v1.PodSucceeded), string(v1.PodFailed)}, + }, + expectError: false, + }, { description: "Pod Status Reasons CrashLoopBackOff ", args: &PodLifeTimeArgs{