[转帖]kubelet 原理解析六: 垃圾回收
https://segmentfault.com/a/1190000022163856
概述
在k8s中节点会通过docker pull机制获取外部的镜像,那么什么时候清除镜像呢?k8s运行的容器又是什么时候清除呢?
- api-server: 运行在master,无状态组件,go自动内存垃圾回收
- controller-manager: 运行在master,无状态组件,go自动内存垃圾回收,owner机制提供resource垃圾回收
- scheduler: 运行在master,无状态组件,go自动内存垃圾回收
- kube-proxy:运行在node,无状态组件,无垃圾收集需要
- kubelet:运行在node,无状态组件,需要管理宿主机的image和container
Kubelet会定期进行垃圾回收(Garbage Collection),以清理节点上的无用镜像和容器。
- 每隔 1 分钟进行一次容器清理
- 每隔 5 分钟进行一次镜像清理
截止到 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中,主要是三个参数:
- MinAge:容器可以被垃圾回收的最小年龄,默认0分钟,命令行参数为minimum-container-ttl-duration
- MaxPerPodContainer: 每个pod中保留的最大的停止容器数量,默认为1,命令行参数为maximum-dead-containers-per-container
- MaxContainers: 整个节点保留的最大的停止容器数量,默认为-1,标示没有限制,命令行参数为maximum-dead-containers
容器回收过程如下:
- 顶层函数会每分钟被调用,触发container gc操作;
- 该操作会以container的结束时间是否超过gcPolicy.MinAge为依据,查询出那些满足条件的容器,并组织成为按照pod为key,container列表为值的字典;这一步并没有做实际删除,但是其操作结果为后两部奠定了数据依据;
- 对字典中的每个pod的container做处理,找出该pod超过gcPolicy.MaxPerPodContainer的容器,然后对它们按照结束时间排序,执行删除,保障每个pod下已结束的container数满足配置参数;
- 经过上一部的删除后,针对node来讲,如果节点上待删除的容器数依然大于gcPolicy.MaxContainers, 就执行反向的运算。把node允许保留的最大容器数平分给每个pod,再按照该标准对每个pod执行一轮删除;
- 如果依然还不满足要求的数量,就不再按照pod做key,直接将所有的container拍扁平,按照时间顺序先删除最旧的容器,直到满足总数小于gcPolicy.MaxContainers。
镜像的回收
镜像回收主要参数:
- minimum-image-ttl-duration:最少这么久镜像都未被使用,才允许清理;比如:’300ms’, ‘10s’ or ‘2h45m’.”
- image-gc-high-threshold:imageFS磁盘使用率的上限,当达到该值时触发镜像清理。默认值为 90%
- image-gc-low-threshold: imageFS磁盘使用率的下限,每次清理直到使用率低于这个值或者没有可以清理的镜像了才会停止。默认值为 80%
具体流程比较简单;
- 与容器GC比较起来,镜像GC顶层函数被触发的周期更长,为5分钟触发一次。
- 通过cadvisor获取到节点上imageFS的详情,得到capacity、avaiable,据此推算磁盘使用率等信息;
- 当磁盘使用率大于image-gc-high-threshold参数中指定的值时,触发镜像的GC操作;
- 找出当前未被使用的镜像列表并按时间排序,过滤掉那些小于minimum-image-ttl-duration的镜像;
- 正式从节点上删除镜像;每次都比较是否删除的镜像数以满足所需释放的bytesToFree,若满足就停止删除。
- 那些用户手动 run 起来的容器,对于 Kubelet 垃圾回收来说就是不可见的,也就不能阻止对相关镜像的垃圾回收
- 当镜像存放目录磁盘使用率(df -h) 大于 HighThresholdPercent后,开始删除节点中未使用的docker镜像
- 当磁盘使用率降低至LowThresholdPercent时,停止镜像的垃圾回收。
- 在节点中存在一定的image是必要的,因为可以减少docker拉取镜像的速度减少带宽压力,加速容器启动.
参考
[转帖]kubelet 原理解析六: 垃圾回收的更多相关文章
- 精华推荐 | 【JVM深层系列】「GC底层调优系列」一文带你彻底加强夯实底层原理之GC垃圾回收技术的分析指南(GC原理透析)
前提介绍 很多小伙伴,都跟我反馈,说自己总是对JVM这一块的学习和认识不够扎实也不够成熟,因为JVM的一些特性以及运作机制总是混淆以及不确定,导致面试和工作实战中出现了很多的纰漏和短板,解决广大小伙伴 ...
- 深入解析Java垃圾回收机制
引入垃圾回收 哪些内存需要回收? 引用计数法 可达性分析 如何回收 Marking 标记 Normal Deletion 清除 Deletion with Compacting 压缩 为什么需要分代收 ...
- Java多线程系列 JUC线程池07 线程池原理解析(六)
关闭“线程池” shutdown()的源码如下: public void shutdown() { final ReentrantLock mainLock = this.mainLock; // ...
- go GC垃圾回收原理
目录 1.前言 2. 垃圾回收算法 3. Golang垃圾回收 3.1 垃圾回收原理 3.2 内存标记(Mark) 3.3 三色标记 3.4 Stop The World 4. 垃圾回收优化 4.1 ...
- 配置Kubelet的垃圾回收
文章转载自:https://www.kuboard.cn/learning/k8s-advanced/gc.html Kubelet的垃圾回收功能可以清理不再使用的容器和镜像,kubelet对容器进行 ...
- CLR via C#深解笔记七 - 自动内存管理(垃圾回收)
每个应用程序都要使用这样或者那样的资源,比如文件.内存缓冲区.屏幕空间.网络连接.数据库资源等.事实上,在面向对象的环境中,每个类型都代表可供程序使用的一种资源. 要使用这些资源,必须为代表资源的类型 ...
- 深度好文:PHP写时拷贝与垃圾回收机制(转)
原文地址:http://www.php100.com/9/20/87255.html 写入拷贝(Copy-on-write,简称COW)是一种计算机程序设计领域的优化策略.其核心思想是,如果有多个调用 ...
- 垃圾回收、python中的流程控制
垃圾回收机制 1.概念 垃圾回收机制(GC):是Python解释器自带一种机制,专门用来回收不可用的变量值所占用的内存空间 2.原理 Python的垃圾回收机制(GC)主要使用引用计数(referen ...
- jvm垃圾回收原理(转)
原文链接:jvm垃圾回收原理 在jvm中堆空间划分为三个代:年轻代(Young Generation).年老代(Old Generation)和永久代(Permanent Generation).年轻 ...
- JVM垃圾回收原理
原文地址:http://chenchendefeng.iteye.com/blog/455883 一.相关概念 基本回收算法 1. 引用计数(Reference Counting) 比较古老的回收算法 ...
随机推荐
- 3大方面升级华为云CCE集群体验,助力集群高效运维管理
本文分享自华为云社区<华为云从心打造CCE集群升级体验,助力集群高效运维管理>,作者:云容器大未来 . 在云原生时代浪潮的推动下,Kubernetes的发展日新月异,更新的集群版本可以带来 ...
- PPT 毕业答辩PPT应该怎么样改
PPT 毕业答辩PPT应该怎么样改
- C# 写日志文件
常用方法: public class FileHelper { private static void Write(string fileName, byte[] bytes) { FileStrea ...
- 编码器-解码器 | 基于 Transformers 的编码器-解码器模型
基于 transformer 的编码器-解码器模型是 表征学习 和 模型架构 这两个领域多年研究成果的结晶.本文简要介绍了神经编码器-解码器模型的历史,更多背景知识,建议读者阅读由 Sebastion ...
- 飞书接入ChatGPT
飞书接入ChatGPT 前天我用飞书接入了GPT-3,现在终于可以在国内畅通地聊天了. 上面是群聊截图,下面是私聊截图 其实实现过程极其简单,但是我和好兄弟确实绕了不少弯路. 首先提醒: 1 不适合个 ...
- redis之列表 redis之hash redis其他操作 redis管道 django中使用redis celery介绍和安装 celery快速使用 celery包结构
目录 昨日回顾 今日内容 1 redis之列表 2 redis之hash 3 redis其他操作 4 redis 管道 5 django中使用redis 6 celery介绍和安装 7 celery快 ...
- 【Django drf】认证类 权限类 频率类 过滤类 排序类 分页类
目录 认证类 前期准备 自定义认证类 配置认证类 全局配置 局部禁用 认证组件使用步骤 基于类中方法的认证(了解) 权限类 前期准备 重写has_permission() 添加权限不足信息 权限组件使 ...
- [kuangbin] 专题13 基础计算几何 题解 + 总结
kuangbin带你飞:点击进入新世界 [kuangbin] 专题7 线段树 题解 + 总结:https://www.cnblogs.com/RioTian/p/13413897.html kuang ...
- 扒一扒迅雷11新功能——6T云盘功能、极致传输、高清播放、跨端同步
云盘功能 极致传输 高清播放 跨端同步
- 概率图模型 · 概率论基础 | 讲的非常好的 KL 散度博客
知乎博客链接:https://zhuanlan.zhihu.com/p/425693597 感觉讲的非常好,谢谢善良的博主