https://segmentfault.com/a/1190000022163856
在k8s中节点会通过docker pull机制获取外部的镜像,那么什么时候清除镜像呢?k8s运行的容器又是什么时候清除呢?
Kubelet会定期进行垃圾回收(Garbage Collection),以清理节点上的无用镜像和容器。
截止到 v1.15 版本,垃圾回收间隔时间还都是在源码中固化的,不可自定义配置,如果节点上已经运行了 Kubelet,不建议再额外运行其它的垃圾回收工具,因为这些工具可能错误地清理掉 Kubelet 认为本应保留的镜像或容器,从而可能造成不可预知的问题。
docker容器的本质是宿主机上的一个进程,为了将容器做差异化的封装,docker借助于类似AUFS之类的文件系统做了很多事情。容器停止执行后,这些文件系统并不会自动清除,通过docker ps -a也能够看到这些资源(这是为了下次可以快速启动)。kubelet有一套container gc的方案,专门用于清理宿主机上的非所需容器。
另外,容器镜像较耗存储资源,但是每一台k8s node的存储空间都是有限的,kubelet上运行的pod生命周期可能很短,但是每个pod可能都使用不同的镜像,这就会导致宿主机上会留下很多不再需要的容器镜像,为了将有限的空间腾出来高效利用,kubelet设计了一套image gc的方案。
GC机制即将被eviction替代,在kubelet参数中已经有对应的提示信息。
容器GC的业务逻辑主要在(m *kubeGenericRuntimeManager)GarbageCollect中,主要是三个参数:
容器回收过程如下:
镜像回收主要参数:
具体流程比较简单;