# MicroK8s images prune utility for production servers

**URL:** <https://discuss.kubernetes.io/t/microk8s-images-prune-utility-for-production-servers/15874>\
**Category:** microk8s\
**Tags:** microk8s\
**Created:** [May 12, 2021, 9:59am UTC](https://discuss.kubernetes.io/t/microk8s-images-prune-utility-for-production-servers/15874 "2021-05-12T09:59:58Z")\
**Posts on this page:** 7\
**Page:** 1

<div class="post-metadata">

**Author:** ![philippelt](https://sea2.discourse-cdn.com/flex016/user_avatar/discuss.kubernetes.io/philippelt/32/7620_2.png) [@philippelt](https://discuss.kubernetes.io/u/philippelt)\
**Post date:** [May 12, 2021, 9:59am UTC](https://discuss.kubernetes.io/t/microk8s-images-prune-utility-for-production-servers/15874/1 "2021-05-12T09:59:58Z")

</div>

For those that are using microk8s for production, you could be interested in a prune utility that would remove images unused by current containers (like docker system prune). The microk8s ctr utility do not provide such feature.

My experience is that images are quickly stacking and I am not sure any garbage collector is taking care of that.

If you need one, check [GitHub - philippelt/microk8s\_prune: Containerd prune utility to cleanup loaded but unused images. This utility is targeting microk8s release but can easily be adapted to any containerd installation.](https://github.com/philippelt/microk8s_prune)

If you are aware of alternative methods, all suggestions are welcome…

---

<div class="post-metadata">

**Author:** ![Franco\_Martin](https://sea2.discourse-cdn.com/flex016/user_avatar/discuss.kubernetes.io/franco_martin/32/12736_2.png) [@Franco\_Martin](https://discuss.kubernetes.io/u/Franco_Martin)\
**Post date:** [June 17, 2023, 12:50pm UTC](https://discuss.kubernetes.io/t/microk8s-images-prune-utility-for-production-servers/15874/2 "2023-06-17T12:50:55Z")

</div>

Sorry for being late, but for folks in the future I’ll leave this suggestion:

- install crictl on each node from [The docs](https://github.com/kubernetes-sigs/cri-tools/blob/master/docs/crictl.md)
- run `crictl -r unix:///var/snap/microk8s/common/run/containerd.sock rmi --prune`  
Maybe add this to a cron task…

---

<div class="post-metadata">

**Author:** ![Jamie\_Carl](https://sea2.discourse-cdn.com/flex016/user_avatar/discuss.kubernetes.io/jamie_carl/32/12956_2.png) [@Jamie\_Carl](https://discuss.kubernetes.io/u/Jamie_Carl)\
**Post date:** [July 25, 2023, 5:23am UTC](https://discuss.kubernetes.io/t/microk8s-images-prune-utility-for-production-servers/15874/3 "2023-07-25T05:23:32Z")

</div>

[Franco\_Martin](https://discuss.kubernetes.io/u/Franco_Martin) has the right answer. Thank you! I have successfully recovered about 500GB of storage on my cluster thanks to this answer.

---

<div class="post-metadata">

**Author:** ![bispaj](https://avatars.discourse-cdn.com/v4/letter/b/c0e974/32.png) [@bispaj](https://discuss.kubernetes.io/u/bispaj)\
**Post date:** [June 7, 2024, 3:41pm UTC](https://discuss.kubernetes.io/t/microk8s-images-prune-utility-for-production-servers/15874/4 "2024-06-07T15:41:23Z")

</div>

In contrast to [Franco\_Martin](https://discuss.kubernetes.io/u/Franco_Martin)’s answer and [Jamie\_Carl](https://discuss.kubernetes.io/u/Jamie_Carl/summary)’s affirmation, I recommend properly [configuring kublet garbage collection.](https://kubernetes.io/docs/concepts/architecture/garbage-collection/#containers-images)

The docs recommend avoiding external GC tools: “You should avoid using external garbage collection tools, as these can break the kubelet behavior and remove containers that should exist.”

---

<div class="post-metadata">

**Author:** ![rayel](https://sea2.discourse-cdn.com/flex016/user_avatar/discuss.kubernetes.io/rayel/32/16213_2.png) [@rayel](https://discuss.kubernetes.io/u/rayel)\
**Post date:** [November 8, 2024, 1:24am UTC](https://discuss.kubernetes.io/t/microk8s-images-prune-utility-for-production-servers/15874/5 "2024-11-08T01:24:41Z")

</div>

Thank you! `crictl` was the solution for me;  
I recovered more than 100GB of storage.  
@bispaj, I spent a couple of hours trying to figure out how to get GC to work the way I wanted in MicroK8s.  
The Kubernetes documentation isn’t always helpful for MicroK8s

---

<div class="post-metadata">

**Author:** ![bispaj](https://avatars.discourse-cdn.com/v4/letter/b/c0e974/32.png) [@bispaj](https://discuss.kubernetes.io/u/bispaj)\
**Post date:** [November 8, 2024, 4:21pm UTC](https://discuss.kubernetes.io/t/microk8s-images-prune-utility-for-production-servers/15874/6 "2024-11-08T16:21:37Z")

</div>

Interesting, glad you found a solution. I’m mostly curious if you don’t mind sharing, how do you want GC to work?

I set the following config then restarted the `kubelite` daemon on each node.

> sudo tee -a /var/snap/microk8s/current/args/kubelet \<\< EOF  
> –image-gc-high-threshold=75  
> –image-gc-low-threshold=10  
> EOF

Simple, but it has worked flawlessly in production envs for the last year. Your GC requirements may be more complicated.

---

<div class="post-metadata">

**Author:** ![rayel](https://sea2.discourse-cdn.com/flex016/user_avatar/discuss.kubernetes.io/rayel/32/16213_2.png) [@rayel](https://discuss.kubernetes.io/u/rayel)\
**Post date:** [November 8, 2024, 4:54pm UTC](https://discuss.kubernetes.io/t/microk8s-images-prune-utility-for-production-servers/15874/7 "2024-11-08T16:54:34Z")

</div>

Well, I was looking for some kind of kubelit yaml config file, but I didn’t found!  
Your example is what I was looking for.  
Great, I will try to use your example!  
Thank you for sharing.
