diff --git a/pkg/controllers/termination/eviction.go b/pkg/controllers/termination/eviction.go index 107c771742ef..c77267607ee9 100644 --- a/pkg/controllers/termination/eviction.go +++ b/pkg/controllers/termination/eviction.go @@ -112,5 +112,6 @@ func (e *EvictionQueue) evict(ctx context.Context, nn types.NamespacedName) bool logging.FromContext(ctx).Errorf("evicting pod, %s", err) return false } + e.recorder.EvictPod(&v1.Pod{ObjectMeta: metav1.ObjectMeta{Name: nn.Name, Namespace: nn.Namespace}}) return true } diff --git a/pkg/events/dedupe.go b/pkg/events/dedupe.go index 312bade3c771..f11669491b00 100644 --- a/pkg/events/dedupe.go +++ b/pkg/events/dedupe.go @@ -43,6 +43,15 @@ func (d *dedupe) NominatePod(pod *v1.Pod, node *v1.Node) { d.rec.NominatePod(pod, node) } +func (d *dedupe) EvictPod(pod *v1.Pod) { + key := fmt.Sprintf("evict-pod-%s", pod.Name) + if _, exists := d.cache.Get(key); exists { + return + } + d.cache.SetDefault(key, nil) + d.rec.EvictPod(pod) +} + func (d *dedupe) PodFailedToSchedule(pod *v1.Pod, err error) { key := fmt.Sprintf("failed-to-schedule-%s-%s", pod.Name, err.Error()) if _, exists := d.cache.Get(key); exists { diff --git a/pkg/events/recorder.go b/pkg/events/recorder.go index a84f1df53ae3..749b579c41ba 100644 --- a/pkg/events/recorder.go +++ b/pkg/events/recorder.go @@ -25,6 +25,8 @@ type Recorder interface { // NominatePod is called when we have determined that a pod should schedule against an existing node and don't // currently need to provision new capacity for the pod. NominatePod(*v1.Pod, *v1.Node) + // EvictedPod is called when a pod is evicted + EvictPod(*v1.Pod) // PodFailedToSchedule is called when a pod has failed to schedule entirely. PodFailedToSchedule(*v1.Pod, error) // NodeFailedToDrain is called when a pod causes a node draining to fail @@ -40,7 +42,11 @@ func NewRecorder(rec record.EventRecorder) Recorder { } func (r recorder) NominatePod(pod *v1.Pod, node *v1.Node) { - r.rec.Eventf(pod, "Normal", "NominatePod", "Pod should schedule on %s", node.Name) + r.rec.Eventf(pod, "Normal", "Nominate", "Pod should schedule on %s", node.Name) +} + +func (r recorder) EvictPod(pod *v1.Pod) { + r.rec.Eventf(pod, "Normal", "Evict", "Evicted pod") } func (r recorder) PodFailedToSchedule(pod *v1.Pod, err error) { diff --git a/pkg/test/eventrecorder.go b/pkg/test/eventrecorder.go index 39c1de71b6d6..58b2c77d1e60 100644 --- a/pkg/test/eventrecorder.go +++ b/pkg/test/eventrecorder.go @@ -41,6 +41,9 @@ func (e *EventRecorder) NominatePod(pod *v1.Pod, node *v1.Node) { defer e.mu.Unlock() e.bindings = append(e.bindings, Binding{pod, node}) } + +func (e *EventRecorder) EvictPod(pod *v1.Pod) {} + func (e *EventRecorder) PodFailedToSchedule(pod *v1.Pod, err error) {} func (e *EventRecorder) NodeFailedToDrain(node *v1.Node, err error) {} diff --git a/test/suites/integration/cni_test.go b/test/suites/integration/cni_test.go index fa8fffbf7358..aaa2dcbc6284 100644 --- a/test/suites/integration/cni_test.go +++ b/test/suites/integration/cni_test.go @@ -1,8 +1,6 @@ package integration_test import ( - "fmt" - "github.com/aws/aws-sdk-go/aws" "github.com/aws/aws-sdk-go/service/ec2" "github.com/aws/karpenter/pkg/apis/awsnodetemplate/v1alpha1"