@@ -77,7 +77,7 @@ type ImageGCManager interface {
77
77
GarbageCollect (ctx context.Context , beganGC time.Time ) error
78
78
79
79
// Start async garbage collection of images.
80
- Start ()
80
+ Start (ctx context. Context )
81
81
82
82
GetImageList () ([]container.Image , error )
83
83
@@ -214,20 +214,20 @@ func NewImageGCManager(runtime container.Runtime, statsProvider StatsProvider, p
214
214
return im , nil
215
215
}
216
216
217
- func (im * realImageGCManager ) Start () {
218
- ctx := context . Background ( )
217
+ func (im * realImageGCManager ) Start (ctx context. Context ) {
218
+ logger := klog . FromContext ( ctx )
219
219
go wait .Until (func () {
220
220
_ , err := im .detectImages (ctx , time .Now ())
221
221
if err != nil {
222
- klog . InfoS ("Failed to monitor images" , "err" , err )
222
+ logger . Info ("Failed to monitor images" , "err" , err )
223
223
}
224
224
}, 5 * time .Minute , wait .NeverStop )
225
225
226
226
// Start a goroutine periodically updates image cache.
227
227
go wait .Until (func () {
228
228
images , err := im .runtime .ListImages (ctx )
229
229
if err != nil {
230
- klog . InfoS ("Failed to update image list" , "err" , err )
230
+ logger . Info ("Failed to update image list" , "err" , err )
231
231
} else {
232
232
im .imageCache .set (images )
233
233
}
@@ -241,6 +241,7 @@ func (im *realImageGCManager) GetImageList() ([]container.Image, error) {
241
241
}
242
242
243
243
func (im * realImageGCManager ) detectImages (ctx context.Context , detectTime time.Time ) (sets.Set [string ], error ) {
244
+ logger := klog .FromContext (ctx )
244
245
isRuntimeClassInImageCriAPIEnabled := utilfeature .DefaultFeatureGate .Enabled (features .RuntimeClassInImageCriAPI )
245
246
imagesInUse := sets .New [string ]()
246
247
@@ -261,11 +262,11 @@ func (im *realImageGCManager) detectImages(ctx context.Context, detectTime time.
261
262
}
262
263
263
264
if ! isRuntimeClassInImageCriAPIEnabled {
264
- klog .V (5 ).InfoS ("Container uses image" , "pod" , klog .KRef (pod .Namespace , pod .Name ), "containerName" , container .Name , "containerImage" , container .Image , "imageID" , container .ImageID , "imageRef" , container .ImageRef )
265
+ logger .V (5 ).Info ("Container uses image" , "pod" , klog .KRef (pod .Namespace , pod .Name ), "containerName" , container .Name , "containerImage" , container .Image , "imageID" , container .ImageID , "imageRef" , container .ImageRef )
265
266
imagesInUse .Insert (container .ImageID )
266
267
} else {
267
268
imageKey := getImageTuple (container .ImageID , container .ImageRuntimeHandler )
268
- klog .V (5 ).InfoS ("Container uses image" , "pod" , klog .KRef (pod .Namespace , pod .Name ), "containerName" , container .Name , "containerImage" , container .Image , "imageID" , container .ImageID , "imageRef" , container .ImageRef , "imageKey" , imageKey )
269
+ logger .V (5 ).Info ("Container uses image" , "pod" , klog .KRef (pod .Namespace , pod .Name ), "containerName" , container .Name , "containerImage" , container .Image , "imageID" , container .ImageID , "imageRef" , container .ImageRef , "imageKey" , imageKey )
269
270
imagesInUse .Insert (imageKey )
270
271
}
271
272
}
@@ -279,17 +280,17 @@ func (im *realImageGCManager) detectImages(ctx context.Context, detectTime time.
279
280
for _ , image := range images {
280
281
imageKey := image .ID
281
282
if ! isRuntimeClassInImageCriAPIEnabled {
282
- klog .V (5 ).InfoS ("Adding image ID to currentImages" , "imageID" , imageKey )
283
+ logger .V (5 ).Info ("Adding image ID to currentImages" , "imageID" , imageKey )
283
284
} else {
284
285
imageKey = getImageTuple (image .ID , image .Spec .RuntimeHandler )
285
- klog .V (5 ).InfoS ("Adding image ID with runtime class to currentImages" , "imageKey" , imageKey , "runtimeHandler" , image .Spec .RuntimeHandler )
286
+ logger .V (5 ).Info ("Adding image ID with runtime class to currentImages" , "imageKey" , imageKey , "runtimeHandler" , image .Spec .RuntimeHandler )
286
287
}
287
288
288
289
currentImages .Insert (imageKey )
289
290
290
291
// New image, set it as detected now.
291
292
if _ , ok := im .imageRecords [imageKey ]; ! ok {
292
- klog .V (5 ).InfoS ("Image ID is new" , "imageID" , imageKey , "runtimeHandler" , image .Spec .RuntimeHandler )
293
+ logger .V (5 ).Info ("Image ID is new" , "imageID" , imageKey , "runtimeHandler" , image .Spec .RuntimeHandler )
293
294
im .imageRecords [imageKey ] = & imageRecord {
294
295
firstDetected : detectTime ,
295
296
runtimeHandlerUsedToPullImage : image .Spec .RuntimeHandler ,
@@ -298,21 +299,21 @@ func (im *realImageGCManager) detectImages(ctx context.Context, detectTime time.
298
299
299
300
// Set last used time to now if the image is being used.
300
301
if isImageUsed (imageKey , imagesInUse ) {
301
- klog .V (5 ).InfoS ("Setting Image ID lastUsed" , "imageID" , imageKey , "lastUsed" , now )
302
+ logger .V (5 ).Info ("Setting Image ID lastUsed" , "imageID" , imageKey , "lastUsed" , now )
302
303
im .imageRecords [imageKey ].lastUsed = now
303
304
}
304
305
305
- klog .V (5 ).InfoS ("Image ID has size" , "imageID" , imageKey , "size" , image .Size )
306
+ logger .V (5 ).Info ("Image ID has size" , "imageID" , imageKey , "size" , image .Size )
306
307
im .imageRecords [imageKey ].size = image .Size
307
308
308
- klog .V (5 ).InfoS ("Image ID is pinned" , "imageID" , imageKey , "pinned" , image .Pinned )
309
+ logger .V (5 ).Info ("Image ID is pinned" , "imageID" , imageKey , "pinned" , image .Pinned )
309
310
im .imageRecords [imageKey ].pinned = image .Pinned
310
311
}
311
312
312
313
// Remove old images from our records.
313
314
for image := range im .imageRecords {
314
315
if ! currentImages .Has (image ) {
315
- klog .V (5 ).InfoS ("Image ID is no longer present; removing from imageRecords" , "imageID" , image )
316
+ logger .V (5 ).Info ("Image ID is no longer present; removing from imageRecords" , "imageID" , image )
316
317
delete (im .imageRecords , image )
317
318
}
318
319
}
@@ -322,6 +323,7 @@ func (im *realImageGCManager) detectImages(ctx context.Context, detectTime time.
322
323
323
324
// handleImageVolumes ensures that image volumes are considered as images in use.
324
325
func (im * realImageGCManager ) handleImageVolumes (ctx context.Context , imagesInUse sets.Set [string ], container * container.Container , pod * container.Pod , images []container.Image ) error {
326
+ logger := klog .FromContext (ctx )
325
327
if ! utilfeature .DefaultFeatureGate .Enabled (features .ImageVolume ) {
326
328
return nil
327
329
}
@@ -334,7 +336,7 @@ func (im *realImageGCManager) handleImageVolumes(ctx context.Context, imagesInUs
334
336
for _ , mount := range status .Mounts {
335
337
for _ , image := range images {
336
338
if mount .Image != nil && mount .Image .Image == image .ID {
337
- klog .V (5 ).InfoS ("Container uses image as mount" , "pod" , klog .KRef (pod .Namespace , pod .Name ), "containerName" , container .Name , "imageID" , image .ID )
339
+ logger .V (5 ).Info ("Container uses image as mount" , "pod" , klog .KRef (pod .Namespace , pod .Name ), "containerName" , container .Name , "imageID" , image .ID )
338
340
imagesInUse .Insert (image .ID )
339
341
}
340
342
}
@@ -345,6 +347,7 @@ func (im *realImageGCManager) handleImageVolumes(ctx context.Context, imagesInUs
345
347
346
348
func (im * realImageGCManager ) GarbageCollect (ctx context.Context , beganGC time.Time ) error {
347
349
ctx , otelSpan := im .tracer .Start (ctx , "Images/GarbageCollect" )
350
+ logger := klog .FromContext (ctx )
348
351
defer otelSpan .End ()
349
352
350
353
freeTime := time .Now ()
@@ -373,7 +376,7 @@ func (im *realImageGCManager) GarbageCollect(ctx context.Context, beganGC time.T
373
376
}
374
377
375
378
if available > capacity {
376
- klog . InfoS ("Availability is larger than capacity" , "available" , available , "capacity" , capacity )
379
+ logger . Info ("Availability is larger than capacity" , "available" , available , "capacity" , capacity )
377
380
available = capacity
378
381
}
379
382
@@ -388,8 +391,9 @@ func (im *realImageGCManager) GarbageCollect(ctx context.Context, beganGC time.T
388
391
usagePercent := 100 - int (available * 100 / capacity )
389
392
if usagePercent >= im .policy .HighThresholdPercent {
390
393
amountToFree := capacity * int64 (100 - im .policy .LowThresholdPercent )/ 100 - available
391
- klog . InfoS ("Disk usage on image filesystem is over the high threshold, trying to free bytes down to the low threshold" , "usage" , usagePercent , "highThreshold" , im .policy .HighThresholdPercent , "amountToFree" , amountToFree , "lowThreshold" , im .policy .LowThresholdPercent )
394
+ logger . Info ("Disk usage on image filesystem is over the high threshold, trying to free bytes down to the low threshold" , "usage" , usagePercent , "highThreshold" , im .policy .HighThresholdPercent , "amountToFree" , amountToFree , "lowThreshold" , im .policy .LowThresholdPercent )
392
395
remainingImages , freed , err := im .freeSpace (ctx , amountToFree , freeTime , images )
396
+ logger .Info ("Disk usage on image filesystem is over the high threshold, trying to free bytes down to the low threshold" , "usage" , usagePercent , "highThreshold" , im .policy .HighThresholdPercent , "amountToFree" , amountToFree , "lowThreshold" , im .policy .LowThresholdPercent )
393
397
if err != nil {
394
398
return err
395
399
}
@@ -423,9 +427,10 @@ func (im *realImageGCManager) freeOldImages(ctx context.Context, images []evicti
423
427
return images , nil
424
428
}
425
429
var deletionErrors []error
430
+ logger := klog .FromContext (ctx )
426
431
remainingImages := make ([]evictionInfo , 0 )
427
432
for _ , image := range images {
428
- klog .V (5 ).InfoS ("Evaluating image ID for possible garbage collection based on image age" , "imageID" , image .id )
433
+ logger .V (5 ).Info ("Evaluating image ID for possible garbage collection based on image age" , "imageID" , image .id )
429
434
// Evaluate whether image is older than MaxAge.
430
435
if freeTime .Sub (image .lastUsed ) > im .policy .MaxAge {
431
436
if err := im .freeImage (ctx , image , ImageGarbageCollectedTotalReasonAge ); err != nil {
@@ -444,7 +449,8 @@ func (im *realImageGCManager) freeOldImages(ctx context.Context, images []evicti
444
449
}
445
450
446
451
func (im * realImageGCManager ) DeleteUnusedImages (ctx context.Context ) error {
447
- klog .InfoS ("Attempting to delete unused images" )
452
+ logger := klog .FromContext (ctx )
453
+ logger .Info ("Attempting to delete unused images" )
448
454
freeTime := time .Now ()
449
455
450
456
images , err := im .imagesInEvictionOrder (ctx , freeTime )
@@ -470,22 +476,23 @@ func (im *realImageGCManager) DeleteUnusedImages(ctx context.Context) error {
470
476
func (im * realImageGCManager ) freeSpace (ctx context.Context , bytesToFree int64 , freeTime time.Time , images []evictionInfo ) ([]string , int64 , error ) {
471
477
// Delete unused images until we've freed up enough space.
472
478
var deletionErrors []error
479
+ logger := klog .FromContext (ctx )
473
480
spaceFreed := int64 (0 )
474
481
var imagesLeft []string
475
482
for _ , image := range images {
476
- klog .V (5 ).InfoS ("Evaluating image ID for possible garbage collection based on disk usage" , "imageID" , image .id , "runtimeHandler" , image .imageRecord .runtimeHandlerUsedToPullImage )
483
+ logger .V (5 ).Info ("Evaluating image ID for possible garbage collection based on disk usage" , "imageID" , image .id , "runtimeHandler" , image .imageRecord .runtimeHandlerUsedToPullImage )
477
484
// Images that are currently in used were given a newer lastUsed.
478
485
if image .lastUsed .Equal (freeTime ) || image .lastUsed .After (freeTime ) {
479
- klog .V (5 ).InfoS ("Image ID was used too recently, not eligible for garbage collection" , "imageID" , image .id , "lastUsed" , image .lastUsed , "freeTime" , freeTime )
480
486
imagesLeft = append (imagesLeft , image .id )
487
+ logger .V (5 ).Info ("Image ID was used too recently, not eligible for garbage collection" , "imageID" , image .id , "lastUsed" , image .lastUsed , "freeTime" , freeTime )
481
488
continue
482
489
}
483
490
484
491
// Avoid garbage collect the image if the image is not old enough.
485
492
// In such a case, the image may have just been pulled down, and will be used by a container right away.
486
493
if freeTime .Sub (image .firstDetected ) < im .policy .MinAge {
487
- klog .V (5 ).InfoS ("Image ID's age is less than the policy's minAge, not eligible for garbage collection" , "imageID" , image .id , "age" , freeTime .Sub (image .firstDetected ), "minAge" , im .policy .MinAge )
488
494
imagesLeft = append (imagesLeft , image .id )
495
+ logger .V (5 ).Info ("Image ID's age is less than the policy's minAge, not eligible for garbage collection" , "imageID" , image .id , "age" , freeTime .Sub (image .firstDetected ), "minAge" , im .policy .MinAge )
489
496
continue
490
497
}
491
498
@@ -511,7 +518,8 @@ func (im *realImageGCManager) freeImage(ctx context.Context, image evictionInfo,
511
518
isRuntimeClassInImageCriAPIEnabled := utilfeature .DefaultFeatureGate .Enabled (features .RuntimeClassInImageCriAPI )
512
519
// Remove image. Continue despite errors.
513
520
var err error
514
- klog .InfoS ("Removing image to free bytes" , "imageID" , image .id , "size" , image .size , "runtimeHandler" , image .runtimeHandlerUsedToPullImage )
521
+ logger := klog .FromContext (ctx )
522
+ logger .Info ("Removing image to free bytes" , "imageID" , image .id , "size" , image .size , "runtimeHandler" , image .runtimeHandlerUsedToPullImage )
515
523
err = im .runtime .RemoveImage (ctx , container.ImageSpec {Image : image .id , RuntimeHandler : image .runtimeHandlerUsedToPullImage })
516
524
if err != nil {
517
525
return err
@@ -537,17 +545,18 @@ func (im *realImageGCManager) imagesInEvictionOrder(ctx context.Context, freeTim
537
545
538
546
im .imageRecordsLock .Lock ()
539
547
defer im .imageRecordsLock .Unlock ()
548
+ logger := klog .FromContext (ctx )
540
549
541
550
// Get all images in eviction order.
542
551
images := make ([]evictionInfo , 0 , len (im .imageRecords ))
543
552
for image , record := range im .imageRecords {
544
553
if isImageUsed (image , imagesInUse ) {
545
- klog .V (5 ).InfoS ("Image ID is being used" , "imageID" , image )
554
+ logger .V (5 ).Info ("Image ID is being used" , "imageID" , image )
546
555
continue
547
556
}
548
557
// Check if image is pinned, prevent garbage collection
549
558
if record .pinned {
550
- klog .V (5 ).InfoS ("Image is pinned, skipping garbage collection" , "imageID" , image )
559
+ logger .V (5 ).Info ("Image is pinned, skipping garbage collection" , "imageID" , image )
551
560
continue
552
561
553
562
}
0 commit comments