文章转载自:https://www.kuboard.cn/learning/k8s-advanced/gc.html

Kubelet的垃圾回收功能可以清理不再使用的容器和镜像,kubelet对容器进行垃圾回收的频率是每分钟一次,对镜像进行垃圾回收的频率是每五分钟一次。

不推荐使用外部的垃圾回收工具,因为这些工具有可能会删除 kubelet 仍然需要的容器或者镜像。

镜像回收

Kubernetes 通过 imageManager 配合 cadvisor 管理所有镜像的生命周期。

镜像的垃圾回收策略主要考虑两方面因素: HighThresholdPercent 和 LowThresholdPercent。

  • 磁盘利用率超过 high threshold 将触发垃圾回收动作
  • 垃圾回收功能将删除最近最少使用的镜像,直到磁盘利用率低于 low threshold

容器回收

容器的垃圾回收侧率主要考虑三个用户自定义的变量:

  • MinAge: 容器创建到现在的最小时长,低于此时长的不能被垃圾回收;如果设置为 0,则禁用该选项
  • MaxPerPodContainer:以 Pod UID + 容器名 作为组合键,MaxPerPodContainer 指定了同一个 Pod UID + 容器名 组合键下可以包含的已停止容器的最大数量。如果设置为小于 0 的数值,则禁用该选项
  • MaxContainers: 指定了最大的已停止容器的数量。如果设置为小于 0 的数值,则禁用该选项

Kubelet 将对满足上述三个条件,且已经停止的容器执行垃圾回收的动作。通常,创建时间最长的容器将被最早移除。 MaxPerPodContainer 和 MaxContainer 这两个参数可能会相互冲突,例如, 如果要为每个 Pod 保存 MaxPerPodContainer 个已停止容器的话,可能最终总的已停止的容器的数量要超过 MaxContainers 的定义。 此时,优先保证 MaxContainers 的限定, MaxPerPodContainer 将被重新调整:最坏的情况下,kubelet 将 MaxPerPodContainer 的要求降低到 1,并删除创建时间最久的已停止的容器。此外,当 Pod 的已停止容器创建时长超过 MinAge 时,该容器将被即刻删除。

对于那些不是通过 kubelet 创建的容器,kubelet 不能对其进行垃圾回收操作。

配置

通过以下 kubelet 启动参数,可以调整镜像垃圾回收的变量:

  • image-gc-high-threshold,磁盘利用率高于此参数时,将触发镜像的垃圾回收。默认值为 85%
  • iamge-gc-low-threshold,磁盘利用率低于此参数时,镜像的垃圾回收将停止。默认值为 80%

通过以下 kubelet 启动参数,可以调整容器的垃圾回收的变量:

  • minimum-container-ttl-duration,容器创建到现在的最小时长,低于此时长的不能被垃圾回收。默认值为 0 分钟,即,每一个已停止的容器都可以被垃圾回收
  • maximum-dead-containers-per-container,对于每个容器的旧实例,最多可以保留的个数。默认值为 1
  • maximum-dead-containers,全局最大可以保留的已停止的容器数量。默认值为 -1,即,不做全局性限制

容器在被垃圾回收时,也许仍然是有用的。例如,这些容器可能包含了对于问题诊断(trouble shooting)来说非常有用的日志和数据。强烈建议将 maximum-dead-containers-per-container 设置为足够大的数值,至少不能小于1,以便为每一个容器至少保留一个已停止的容器。同样的,也建议为 maximum-dead-containers 设置一个比较大的数值。 参考 issue #13287

Deprecation

此文档的某些特性已经不推荐使用,未来将被 kubelet eviction 替代。

包括:

Existing Flag New Flag Rationale
--image-gc-high-threshold --eviction-hard or --eviction-soft 已有的 eviction 信号可以触发镜像的垃圾回收
--image-gc-low-threshold --eviction-minimum-reclaim eviction reclaims 可实现相同的效果
--maximum-dead-containers 如果日志被存储在容器外部,就不推荐使用此特性
--maximum-dead-containers-per-container 如果日志被存储在容器外部,就不推荐使用此特性
--minimum-container-ttl-duration 如果日志被存储在容器外部,就不推荐使用此特性
--low-diskspace-threshold-mb --eviction-hard or eviction-soft eviction 通过其他资源判断是否要垃圾回收,而不再通过磁盘利用率这个参数
--outofdisk-transition-frequency --eviction-pressure-transition-period eviction generalizes disk pressure transition to other resources

配置Kubelet的垃圾回收的更多相关文章

  1. JVM垃圾回收机制总结(3) :按代垃圾收集器

    为什么要分代 分代的垃圾回收策略,是基于这样一个事实:不同的对象的生命周期是不一样的 . 因此,不同生命周期的对象可以采取不同的收集方式,以便提高回收效率. 在Java程序运行的过程中,会产生大量的对 ...

  2. JVM调优总结(六)-分代垃圾回收详述2

    分代垃圾回收流程示意 选择合适的垃圾收集算法 串行收集器 用单线程处理所有垃圾回收工作,因为无需多线程交互,所以效率比较高.但是,也无法使用多处理器的优势,所以此收集器适合单处理器机器.当然,此收集器 ...

  3. java虚拟机学习-JVM调优总结-分代垃圾回收详述(9)

    为什么要分代 分代的垃圾回收策略,是基于这样一个事实:不同的对象的生命周期是不一样的.因此,不同生命周期的对象可以采取不同的收集方式,以便提高回收效率. 在Java程序运行的过程中,会产生大量的对象, ...

  4. JVM虚拟机学习一:垃圾回收算法总结

    1.java虚拟机中涉及到的数据类型 Java虚拟机中,数据类型可以分为两类:基本类型和引用类型. 基本类型的变量保存原始值,即:他代表的值就是数值本身:而引用类型的变量保存引用值.“引用值”代表了某 ...

  5. JVM调优总结(4):分代垃圾回收

    为什么要分代 分代的垃圾回收策略,是基于这样一个事实:不同的对象的生命周期是不一样的.因此,不同生命周期的对象可以采取不同的收集方式,以便提高回收效率. 在Java程序运行的过程中,会产生大量的对象, ...

  6. JVM垃圾回收(GC)整理总结学习

    基本回收算法 1. 引用计数(Reference Counting)比较古老的回收算法.原理是此对象有一个引用,即增加一个计数,删除一个引用则减少一个计数.垃圾回收时,只用收集计数为0的对象.此算法最 ...

  7. java虚拟机垃圾回收机制详解

    首先,看一下java虚拟机运行的时候内存分配图: jvm虚拟机栈:一个是线程独有的,每次启动一个线程,就创建一个jvm虚拟机栈,线程退出的时候就销毁.这里面主要保存线程本地变量名和局部变量值. 本地方 ...

  8. JVM垃圾回收原理

    原文地址:http://chenchendefeng.iteye.com/blog/455883 一.相关概念 基本回收算法 1. 引用计数(Reference Counting) 比较古老的回收算法 ...

  9. JVM调优总结(四)-分代垃圾回收详述

    为什么要分代 分代的垃圾回收策略,是基于这样一个事实:不同的对象的生命周期是不一样的.因此,不同生命周期的对象可以采取不同的收集方式,以便提高回收效率. 在Java程序运行的过程中,会产生大量的对象, ...

随机推荐

  1. SpringBoot接口 - 如何优雅的写Controller并统一异常处理?

    SpringBoot接口如何对异常进行统一封装,并统一返回呢?以上文的参数校验为例,如何优雅的将参数校验的错误信息统一处理并封装返回呢?@pdai 为什么要优雅的处理异常 如果我们不统一的处理异常,经 ...

  2. DHCP 动态主机设置协议 分析

    在TCP/IP网络中,每个接口都需要一个IP地址.子网掩码和广播地址( IPv6中没有),简单来说就是需要网络配置信息.如果想访问外部网络可以通过DNS获取外部地址,再通过路由间接转发出去.但是在&q ...

  3. day04 缓冲字符流__异常处理

    缓冲字符流 缓冲字符输入流:java.io.BufferedReader 是一个高级的字符流,特点是块读文本数据,并且可以按行读取字符串. package io; import java.io.*; ...

  4. 使用fit-content撑开子元素

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  5. 剑指offer——day-1

    今天开始记录一下剑指offer的题目训练,提升一下自己的编程能力吧 题目一: 用两个栈实现一个队列.队列的声明如下,请实现它的两个函数 appendTail 和 deleteHead ,分别完成在队列 ...

  6. mybatis 01: 静态代理 + jdk动态代理

    背景 有时目标对象不可直接访问,只能通过代理对象访问 图示: 示例1: 房东 ===> 目标对象 房屋中介 ===> 代理对象 你,我 ===> 客户端对象 示例2: 运营商(电信, ...

  7. 论文解读(DropEdge)《DropEdge: Towards Deep Graph Convolutional Networks on Node Classification》

    论文信息 论文标题:DropEdge: Towards Deep Graph Convolutional Networks on Node Classification论文作者:Yu Rong, We ...

  8. DolphinScheduler - 1.3 系列核心表结构剖析

    Apache DolphinScheduler 是一个分布式去中心化,易扩展的可视化 DAG 工作流任务调度系统.致力于解决数据处理流程中错综复杂的依赖关系,使调度系统在数据处理流程中开箱即用. 近日 ...

  9. virtual box 安装虚拟机如何全屏

    最近由于要进行微信小程序的开发.可恶的腾讯狗没有提供linux版的开发工具!不得以安装虚拟机!暗号虚拟机后发现win10的界面实在是太小,于是乎去解决这个问题!其实很简单,一般来是说直接点虚拟机面板上 ...

  10. as 和 which 引导非限制性定语从句的区别

    定语从句关系代词作用表格:as 和 which 都可以指代整个句子.as 引导非限制性定语从句可以放在主句之前.主句之后.主句之中:which 引导非限制性定语从句只能放在先行词之后. (一)As i ...