From bad0593a686467877880884da5948ca534881d86 Mon Sep 17 00:00:00 2001 From: lixd Date: Fri, 28 Jul 2023 17:42:07 +0800 Subject: [PATCH 1/5] fix kubelet image gc Signed-off-by: lixd --- pkg/kubelet/images/image_gc_manager.go | 13 +------------ 1 file changed, 1 insertion(+), 12 deletions(-) diff --git a/pkg/kubelet/images/image_gc_manager.go b/pkg/kubelet/images/image_gc_manager.go index 52aa0d0ceea..a66f08c80b6 100644 --- a/pkg/kubelet/images/image_gc_manager.go +++ b/pkg/kubelet/images/image_gc_manager.go @@ -100,9 +100,6 @@ type realImageGCManager struct { // Reference to this node. nodeRef *v1.ObjectReference - // Track initialization - initialized bool - // imageCache is the cache of latest image list. imageCache imageCache @@ -176,7 +173,6 @@ func NewImageGCManager(runtime container.Runtime, statsProvider StatsProvider, r statsProvider: statsProvider, recorder: recorder, nodeRef: nodeRef, - initialized: false, tracer: tracer, } @@ -186,16 +182,9 @@ func NewImageGCManager(runtime container.Runtime, statsProvider StatsProvider, r func (im *realImageGCManager) Start() { ctx := context.Background() go wait.Until(func() { - // Initial detection make detected time "unknown" in the past. - var ts time.Time - if im.initialized { - ts = time.Now() - } - _, err := im.detectImages(ctx, ts) + _, err := im.detectImages(ctx, time.Now()) if err != nil { klog.InfoS("Failed to monitor images", "err", err) - } else { - im.initialized = true } }, 5*time.Minute, wait.NeverStop) From 9533cfe2eedb5e425f2db15745e3eddbf6a53a71 Mon Sep 17 00:00:00 2001 From: lixd Date: Thu, 24 Aug 2023 21:57:50 +0800 Subject: [PATCH 2/5] fix: add unit test Signed-off-by: lixd --- pkg/kubelet/images/image_gc_manager_test.go | 35 +++++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git a/pkg/kubelet/images/image_gc_manager_test.go b/pkg/kubelet/images/image_gc_manager_test.go index a6844cdc798..00e90789777 100644 --- a/pkg/kubelet/images/image_gc_manager_test.go +++ b/pkg/kubelet/images/image_gc_manager_test.go @@ -437,6 +437,41 @@ func TestDeleteUnusedImagesRemoveAllUnusedImages(t *testing.T) { assert.Len(fakeRuntime.ImageList, 1) } +func TestDeleteUnusedImagesLimitByImageLiveTime(t *testing.T) { + ctx := context.Background() + mockCtrl := gomock.NewController(t) + defer mockCtrl.Finish() + mockStatsProvider := statstest.NewMockProvider(mockCtrl) + + manager, fakeRuntime := newRealImageGCManager(ImageGCPolicy{ + MinAge: time.Second * 3, // set minAge to 3 seconds, + }, mockStatsProvider) + fakeRuntime.ImageList = []container.Image{ + makeImage(0, 1024), + makeImage(1, 2048), + makeImage(2, 2048), + } + fakeRuntime.AllPodList = []*containertest.FakePod{ + {Pod: &container.Pod{ + Containers: []*container.Container{ + makeContainer(2), + }, + }}, + } + // start to detect images + manager.Start() + // try to delete images, but images are not old enough,so no image will be deleted + err := manager.DeleteUnusedImages(ctx) + assert := assert.New(t) + require.NoError(t, err) + assert.Len(fakeRuntime.ImageList, 3) + // sleep 3 seconds, then images will be old enough to be deleted + time.Sleep(time.Second * 3) + err = manager.DeleteUnusedImages(ctx) + require.NoError(t, err) + assert.Len(fakeRuntime.ImageList, 1) +} + func TestFreeSpaceRemoveByLeastRecentlyUsed(t *testing.T) { ctx := context.Background() mockCtrl := gomock.NewController(t) From 12c0c08e658adddca3372aa4a8067dfbec8078e6 Mon Sep 17 00:00:00 2001 From: lixd Date: Fri, 25 Aug 2023 09:57:28 +0800 Subject: [PATCH 3/5] fix data race in test Signed-off-by: lixd --- pkg/kubelet/container/testing/fake_runtime.go | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/pkg/kubelet/container/testing/fake_runtime.go b/pkg/kubelet/container/testing/fake_runtime.go index bf82205303c..a80951b7cc3 100644 --- a/pkg/kubelet/container/testing/fake_runtime.go +++ b/pkg/kubelet/container/testing/fake_runtime.go @@ -81,6 +81,12 @@ type FakeVersion struct { Version string } +func snapshot(imageList []kubecontainer.Image) []kubecontainer.Image { + result := make([]kubecontainer.Image, len(imageList)) + copy(result, imageList) + return result +} + func (fv *FakeVersion) String() string { return fv.Version } @@ -362,7 +368,7 @@ func (f *FakeRuntime) ListImages(_ context.Context) ([]kubecontainer.Image, erro defer f.Unlock() f.CalledFunctions = append(f.CalledFunctions, "ListImages") - return f.ImageList, f.Err + return snapshot(f.ImageList), f.Err } func (f *FakeRuntime) RemoveImage(_ context.Context, image kubecontainer.ImageSpec) error { From 26a395ecc28bcfab79c9d6c2d46c3b019b2ec7ef Mon Sep 17 00:00:00 2001 From: lixd Date: Tue, 19 Sep 2023 15:52:44 +0800 Subject: [PATCH 4/5] Trigger CI Signed-off-by: lixd From 41584bde23301c985d70e8dfc9d2f24bdd093f07 Mon Sep 17 00:00:00 2001 From: lixd Date: Wed, 20 Sep 2023 09:08:30 +0800 Subject: [PATCH 5/5] fix code style Signed-off-by: lixd --- pkg/kubelet/container/testing/fake_runtime.go | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/pkg/kubelet/container/testing/fake_runtime.go b/pkg/kubelet/container/testing/fake_runtime.go index a80951b7cc3..e5526618fb5 100644 --- a/pkg/kubelet/container/testing/fake_runtime.go +++ b/pkg/kubelet/container/testing/fake_runtime.go @@ -81,12 +81,6 @@ type FakeVersion struct { Version string } -func snapshot(imageList []kubecontainer.Image) []kubecontainer.Image { - result := make([]kubecontainer.Image, len(imageList)) - copy(result, imageList) - return result -} - func (fv *FakeVersion) String() string { return fv.Version } @@ -371,6 +365,12 @@ func (f *FakeRuntime) ListImages(_ context.Context) ([]kubecontainer.Image, erro return snapshot(f.ImageList), f.Err } +func snapshot(imageList []kubecontainer.Image) []kubecontainer.Image { + result := make([]kubecontainer.Image, len(imageList)) + copy(result, imageList) + return result +} + func (f *FakeRuntime) RemoveImage(_ context.Context, image kubecontainer.ImageSpec) error { f.Lock() defer f.Unlock()