From ff017839c76b5d263ca080d8f05b73d77f932f78 Mon Sep 17 00:00:00 2001 From: derekwaynecarr Date: Wed, 7 Sep 2016 13:28:08 -0400 Subject: [PATCH] Log an event when container runtime exceeds grace-period during eviction --- pkg/kubelet/events/event.go | 1 + pkg/kubelet/kubelet.go | 2 +- pkg/kubelet/kubelet_test.go | 2 +- pkg/kubelet/pod_workers.go | 3 ++- pkg/kubelet/pod_workers_test.go | 3 ++- 5 files changed, 7 insertions(+), 4 deletions(-) diff --git a/pkg/kubelet/events/event.go b/pkg/kubelet/events/event.go index c878062b088..6107c715b03 100644 --- a/pkg/kubelet/events/event.go +++ b/pkg/kubelet/events/event.go @@ -24,6 +24,7 @@ const ( FailedToStartContainer = "Failed" KillingContainer = "Killing" BackOffStartContainer = "BackOff" + ExceededGracePeriod = "ExceededGracePeriod" // Image event reason list PullingImage = "Pulling" diff --git a/pkg/kubelet/kubelet.go b/pkg/kubelet/kubelet.go index 3f49c3424f4..e8c3751fe85 100644 --- a/pkg/kubelet/kubelet.go +++ b/pkg/kubelet/kubelet.go @@ -701,7 +701,7 @@ func NewMainKubelet(kubeCfg *componentconfig.KubeletConfiguration, kubeDeps *Kub klet.setNodeStatusFuncs = klet.defaultNodeStatusFuncs() // setup eviction manager - evictionManager, evictionAdmitHandler, err := eviction.NewManager(klet.resourceAnalyzer, evictionConfig, killPodNow(klet.podWorkers), klet.imageManager, kubeDeps.Recorder, nodeRef, klet.clock) + evictionManager, evictionAdmitHandler, err := eviction.NewManager(klet.resourceAnalyzer, evictionConfig, killPodNow(klet.podWorkers, kubeDeps.Recorder), klet.imageManager, kubeDeps.Recorder, nodeRef, klet.clock) if err != nil { return nil, fmt.Errorf("failed to initialize eviction manager: %v", err) diff --git a/pkg/kubelet/kubelet_test.go b/pkg/kubelet/kubelet_test.go index af1cdd572ac..7d57d09e291 100644 --- a/pkg/kubelet/kubelet_test.go +++ b/pkg/kubelet/kubelet_test.go @@ -226,7 +226,7 @@ func newTestKubeletWithImageList( Namespace: "", } // setup eviction manager - evictionManager, evictionAdmitHandler, err := eviction.NewManager(kubelet.resourceAnalyzer, eviction.Config{}, killPodNow(kubelet.podWorkers), kubelet.imageManager, fakeRecorder, nodeRef, kubelet.clock) + evictionManager, evictionAdmitHandler, err := eviction.NewManager(kubelet.resourceAnalyzer, eviction.Config{}, killPodNow(kubelet.podWorkers, fakeRecorder), kubelet.imageManager, fakeRecorder, nodeRef, kubelet.clock) require.NoError(t, err, "Failed to initialize eviction manager") kubelet.evictionManager = evictionManager diff --git a/pkg/kubelet/pod_workers.go b/pkg/kubelet/pod_workers.go index 95715c76eb4..b6c81b4a7c7 100644 --- a/pkg/kubelet/pod_workers.go +++ b/pkg/kubelet/pod_workers.go @@ -282,7 +282,7 @@ func (p *podWorkers) checkForUpdates(uid types.UID) { // killPodNow returns a KillPodFunc that can be used to kill a pod. // It is intended to be injected into other modules that need to kill a pod. -func killPodNow(podWorkers PodWorkers) eviction.KillPodFunc { +func killPodNow(podWorkers PodWorkers, recorder record.EventRecorder) eviction.KillPodFunc { return func(pod *api.Pod, status api.PodStatus, gracePeriodOverride *int64) error { // determine the grace period to use when killing the pod gracePeriod := int64(0) @@ -325,6 +325,7 @@ func killPodNow(podWorkers PodWorkers) eviction.KillPodFunc { case r := <-ch: return r.err case <-time.After(timeoutDuration): + recorder.Eventf(pod, api.EventTypeWarning, events.ExceededGracePeriod, "Container runtime did not kill the pod within specified grace period.") return fmt.Errorf("timeout waiting to kill pod") } } diff --git a/pkg/kubelet/pod_workers_test.go b/pkg/kubelet/pod_workers_test.go index 04ca76a1e61..3231776aa45 100644 --- a/pkg/kubelet/pod_workers_test.go +++ b/pkg/kubelet/pod_workers_test.go @@ -331,8 +331,9 @@ func TestFakePodWorkers(t *testing.T) { // TestKillPodNowFunc tests the blocking kill pod function works with pod workers as expected. func TestKillPodNowFunc(t *testing.T) { + fakeRecorder := &record.FakeRecorder{} podWorkers, processed := createPodWorkers() - killPodFunc := killPodNow(podWorkers) + killPodFunc := killPodNow(podWorkers, fakeRecorder) pod := newPod("test", "test") gracePeriodOverride := int64(0) err := killPodFunc(pod, api.PodStatus{Phase: api.PodFailed, Reason: "reason", Message: "message"}, &gracePeriodOverride)