Skip to content

Commit c3114b2

Browse files
authored
Merge pull request kubernetes#119652 from lixd/kubelet_image_gc
fix kubelet image gc
2 parents 6ba7258 + 41584bd commit c3114b2

File tree

3 files changed

+43
-13
lines changed

3 files changed

+43
-13
lines changed

pkg/kubelet/container/testing/fake_runtime.go

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -364,7 +364,13 @@ func (f *FakeRuntime) ListImages(_ context.Context) ([]kubecontainer.Image, erro
364364
defer f.Unlock()
365365

366366
f.CalledFunctions = append(f.CalledFunctions, "ListImages")
367-
return f.ImageList, f.Err
367+
return snapshot(f.ImageList), f.Err
368+
}
369+
370+
func snapshot(imageList []kubecontainer.Image) []kubecontainer.Image {
371+
result := make([]kubecontainer.Image, len(imageList))
372+
copy(result, imageList)
373+
return result
368374
}
369375

370376
func (f *FakeRuntime) RemoveImage(_ context.Context, image kubecontainer.ImageSpec) error {

pkg/kubelet/images/image_gc_manager.go

Lines changed: 1 addition & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -118,9 +118,6 @@ type realImageGCManager struct {
118118
// Reference to this node.
119119
nodeRef *v1.ObjectReference
120120

121-
// Track initialization
122-
initialized bool
123-
124121
// imageCache is the cache of latest image list.
125122
imageCache imageCache
126123

@@ -196,7 +193,6 @@ func NewImageGCManager(runtime container.Runtime, statsProvider StatsProvider, r
196193
statsProvider: statsProvider,
197194
recorder: recorder,
198195
nodeRef: nodeRef,
199-
initialized: false,
200196
tracer: tracer,
201197
}
202198

@@ -206,16 +202,9 @@ func NewImageGCManager(runtime container.Runtime, statsProvider StatsProvider, r
206202
func (im *realImageGCManager) Start() {
207203
ctx := context.Background()
208204
go wait.Until(func() {
209-
// Initial detection make detected time "unknown" in the past.
210-
var ts time.Time
211-
if im.initialized {
212-
ts = time.Now()
213-
}
214-
_, err := im.detectImages(ctx, ts)
205+
_, err := im.detectImages(ctx, time.Now())
215206
if err != nil {
216207
klog.InfoS("Failed to monitor images", "err", err)
217-
} else {
218-
im.initialized = true
219208
}
220209
}, 5*time.Minute, wait.NeverStop)
221210

pkg/kubelet/images/image_gc_manager_test.go

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -516,6 +516,41 @@ func TestDeleteUnusedImagesRemoveAllUnusedImages(t *testing.T) {
516516
assert.Len(fakeRuntime.ImageList, 1)
517517
}
518518

519+
func TestDeleteUnusedImagesLimitByImageLiveTime(t *testing.T) {
520+
ctx := context.Background()
521+
mockCtrl := gomock.NewController(t)
522+
defer mockCtrl.Finish()
523+
mockStatsProvider := statstest.NewMockProvider(mockCtrl)
524+
525+
manager, fakeRuntime := newRealImageGCManager(ImageGCPolicy{
526+
MinAge: time.Second * 3, // set minAge to 3 seconds,
527+
}, mockStatsProvider)
528+
fakeRuntime.ImageList = []container.Image{
529+
makeImage(0, 1024),
530+
makeImage(1, 2048),
531+
makeImage(2, 2048),
532+
}
533+
fakeRuntime.AllPodList = []*containertest.FakePod{
534+
{Pod: &container.Pod{
535+
Containers: []*container.Container{
536+
makeContainer(2),
537+
},
538+
}},
539+
}
540+
// start to detect images
541+
manager.Start()
542+
// try to delete images, but images are not old enough,so no image will be deleted
543+
err := manager.DeleteUnusedImages(ctx)
544+
assert := assert.New(t)
545+
require.NoError(t, err)
546+
assert.Len(fakeRuntime.ImageList, 3)
547+
// sleep 3 seconds, then images will be old enough to be deleted
548+
time.Sleep(time.Second * 3)
549+
err = manager.DeleteUnusedImages(ctx)
550+
require.NoError(t, err)
551+
assert.Len(fakeRuntime.ImageList, 1)
552+
}
553+
519554
func TestFreeSpaceRemoveByLeastRecentlyUsed(t *testing.T) {
520555
ctx := context.Background()
521556
mockCtrl := gomock.NewController(t)

0 commit comments

Comments
 (0)