如何释放 K8s 节点上的空间,kubelet ImageGCFailed

如何释放 K8s 节点上的空间,kubelet ImageGCFailed

我们在 Ubuntu 20.04 上有一个 4 节点 k8s 1.21.4 集群。其中一个节点已开始耗尽空间(>80% 已满,其他节点为 20%)。我配置了 kubelet 以更积极地对未使用的映像进行垃圾收集,但这失败了:

ImageGCFailed:无法对所需数量的图像进行垃圾回收。原本想释放 133560354816 字节,但实际释放了 0 字节

我也试过了crictl rmi --prune。几天前它节省了一些空间,但现在什么也没做,磁盘使用量继续增长。

正在运行的crictl images节点没有显示任何大信息,并且它们与正在运行的 pod 相匹配。其他节点占用的空间要小得多,图像列表要长得多。

OS-IMAGE             KERNEL-VERSION      CONTAINER-RUNTIME
Ubuntu 20.04.3 LTS   5.4.0-153-generic   containerd://1.5.2

root@xxx:/var/lib/containerd# du -xhs *
...
264G    io.containerd.snapshotter.v1.overlayfs

有什么想法吗?谢谢。

答案1

验证特定节点上的磁盘空间是否足以托管分配给它的 pod 的图像可能是个好主意。

如果能对在节点上运行 kubernetes 而不出现此错误所需的最小磁盘大小有某种官方说法,那就太好了。否则,不清楚卷必须有多大才能符合运行 kubernetes 的规格。

通过日志,您可能获得的信息较少。尝试查找 ImageGCFailed 类型的事件以获取有关错误的更多详细信息。如果您使用的是 prometheus,您可以通过查看 cadvisor Prometheus 指标来查看是否公开了有关容器垃圾收集的任何信息。

解决方法:1

使用此命令crictl rmi --prune 仅清除未使用的图像。我建议您还删除其他未使用的文件以清除磁盘空间。

解决方法:2

根据开放的 github 问题尝试这个评论,这可能有助于解决您的问题:

FWIW“以 GB 为单位的启动磁盘大小(每个节点)”设置为最小值 10 Gb。

你也可以参考这个官方文档了解有关未使用的容器和图像的垃圾收集。

相关内容