mirror of
https://github.com/k3s-io/kubernetes.git
synced 2025-08-14 22:33:34 +00:00
Merge pull request #119652 from lixd/kubelet_image_gc
fix kubelet image gc
This commit is contained in:
commit
c3114b2789
@ -364,7 +364,13 @@ func (f *FakeRuntime) ListImages(_ context.Context) ([]kubecontainer.Image, erro
|
|||||||
defer f.Unlock()
|
defer f.Unlock()
|
||||||
|
|
||||||
f.CalledFunctions = append(f.CalledFunctions, "ListImages")
|
f.CalledFunctions = append(f.CalledFunctions, "ListImages")
|
||||||
return f.ImageList, f.Err
|
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 {
|
func (f *FakeRuntime) RemoveImage(_ context.Context, image kubecontainer.ImageSpec) error {
|
||||||
|
@ -118,9 +118,6 @@ type realImageGCManager struct {
|
|||||||
// Reference to this node.
|
// Reference to this node.
|
||||||
nodeRef *v1.ObjectReference
|
nodeRef *v1.ObjectReference
|
||||||
|
|
||||||
// Track initialization
|
|
||||||
initialized bool
|
|
||||||
|
|
||||||
// imageCache is the cache of latest image list.
|
// imageCache is the cache of latest image list.
|
||||||
imageCache imageCache
|
imageCache imageCache
|
||||||
|
|
||||||
@ -196,7 +193,6 @@ func NewImageGCManager(runtime container.Runtime, statsProvider StatsProvider, r
|
|||||||
statsProvider: statsProvider,
|
statsProvider: statsProvider,
|
||||||
recorder: recorder,
|
recorder: recorder,
|
||||||
nodeRef: nodeRef,
|
nodeRef: nodeRef,
|
||||||
initialized: false,
|
|
||||||
tracer: tracer,
|
tracer: tracer,
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -206,16 +202,9 @@ func NewImageGCManager(runtime container.Runtime, statsProvider StatsProvider, r
|
|||||||
func (im *realImageGCManager) Start() {
|
func (im *realImageGCManager) Start() {
|
||||||
ctx := context.Background()
|
ctx := context.Background()
|
||||||
go wait.Until(func() {
|
go wait.Until(func() {
|
||||||
// Initial detection make detected time "unknown" in the past.
|
_, err := im.detectImages(ctx, time.Now())
|
||||||
var ts time.Time
|
|
||||||
if im.initialized {
|
|
||||||
ts = time.Now()
|
|
||||||
}
|
|
||||||
_, err := im.detectImages(ctx, ts)
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
klog.InfoS("Failed to monitor images", "err", err)
|
klog.InfoS("Failed to monitor images", "err", err)
|
||||||
} else {
|
|
||||||
im.initialized = true
|
|
||||||
}
|
}
|
||||||
}, 5*time.Minute, wait.NeverStop)
|
}, 5*time.Minute, wait.NeverStop)
|
||||||
|
|
||||||
|
@ -516,6 +516,41 @@ func TestDeleteUnusedImagesRemoveAllUnusedImages(t *testing.T) {
|
|||||||
assert.Len(fakeRuntime.ImageList, 1)
|
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) {
|
func TestFreeSpaceRemoveByLeastRecentlyUsed(t *testing.T) {
|
||||||
ctx := context.Background()
|
ctx := context.Background()
|
||||||
mockCtrl := gomock.NewController(t)
|
mockCtrl := gomock.NewController(t)
|
||||||
|
Loading…
Reference in New Issue
Block a user