一.简单说明

GC(Garbage Collector)即垃圾收集清理,kubernetes集群中,kubelet的GC功能将会清理未使用的image和container。其中kubelet对container每分钟执行一次GC,对image每5分钟执行一次GC。这样可以保障kubernetes集群资源紧缺的情况下,保证其NODE节点的稳定性。

二.kubernetes的驱逐策略

kubelet能够主动检测和防止计算资源的全面短缺,这种情况下,kubelet可以主动的结束一个或多个pod以回收短缺的资源,如果被驱逐的Pod由Deployment管理,这里Deployment会创建另一个Pod给kubernetes来调度。

三.kubernetes的驱逐信号

kubelet支持按照以下表格中描述的信号触发驱逐

驱逐信号 描述
memory.available memory.available := node.status.capacity[memory] - node.stats.memory.workingSet
nodefs.available nodefs.available := node.stats.fs.available
nodefs.inodesFree nodefs.inodesFree := node.stats.fs.inodesFree
imagefs.available imagefs.available := node.stats.runtime.imagefs.available
imagefs.inodesFree imagefs.inodesFree := node.stats.runtime.imagefs.inodesFree

上面的每个信号都支持字面值或百分比的值,基于百分比的值的计算与每个信号对应的总容量有关。

  • memory.available

    memory.available的值从cgroupfs获取,而不是通过类似free -m的工具,因为free -m不能在容器中工作。

kubelet支持两种文件系统分区:

  • nodefs

    nodefs文件系统,kubelet将其用于卷和守护程序日志等。
  • imagefs

    imagefs文件系统,容器运行时用于保存镜像和容器可写层。

四.驱逐阈值

kubelet支持指定驱逐阈值,用于触发kubelet回收资源。

阈值配置形式如下:

[eviction-signal][operator][quantity]
  • eviction-signal:这里是驱逐的信号
  • operator:是所需的关系运算符,例如<
  • quantity:是驱逐阈值值标志,例如1Gi,也可以使用%标记表示百分比

举例说明:

如果一个节点由10Gi内存,希望在可用内存下降到1Gi以下时,引起驱逐操作,则驱逐阈值可以使用下面任意一种方式指定(但不是两者同时):

  • memory.available<10%

  • memory.available<1Gi

4.1 软驱逐阈值

软驱逐阈值使用一对由驱逐阈值和管理员必须指定的宽限期组成的配置对。在超过宽限期前,kubelet不会采取任何动作回收和驱逐信号关联的资源。如果没有提供宽限期,kubelet启动时将报错。

此外,如果达到了软驱逐阈值,操作员可以指定从节点驱逐 pod 时,在宽限期内允许结束的 pod 的最大数量。如果指定了pod.Spec.TerminationGracePeriodSeconds值,kubelet将使用它和宽限期二者中较小的一个。如果没有指定,kubelet将立即终止 pod,而不会优雅结束它们。

软驱逐阈值的配置支持下列标记:

  • eviction-soft

    描述了驱逐阈值的集合(例如 memory.available<1.5Gi),如果在宽限期之外满足条件将触发 pod 驱逐。
  • eviction-soft-grace-period

    描述了驱逐宽限期的集合(例如 memory.available=1m30s),对应于在驱逐 pod 前软驱逐阈值应该被控制的时长。
  • eviction-max-pod-grace-period

    描述了当满足软驱逐阈值并终止 pod 时允许的最大宽限期值(秒数)。

4.2 硬驱逐阈值

硬驱逐阈值没有宽限期,一旦察觉,kubelet将立即采取行动回收关联的短缺资源。如果满足硬驱逐阈值,kubelet将立即结束 pod 而不是优雅终止。

硬驱逐阈值的配置支持下列标记:

  • eviction-hard

    描述了驱逐阈值的集合(例如 memory.available<1Gi),如果满足条件将触发 pod 驱逐。

kubelet 有如下所示的默认硬驱逐阈值:

  • memory.available<100Mi
  • nodefs.available<10%
  • nodefs.inodesFree<5%
  • imagefs.available<15%

五.kubernetes最小驱逐回收

在某些场景,驱逐 pod 会导致回收少量资源。这将导致 kubelet 反复碰到驱逐阈值。除此之外,对如 disk 这类资源的驱逐时比较耗时的。

为了减少这类问题,kubelet可以为每个资源配置一个 minimum-reclaim。当 kubelet 发现资源压力时,kubelet将尝试至少回收驱逐阈值之下 minimum-reclaim 数量的资源。

例如使用下面的配置:

--eviction-hard=memory.available<500Mi,nodefs.available<1Gi,imagefs.available<100Gi
--eviction-minimum-reclaim="memory.available=0Mi,nodefs.available=500Mi,imagefs.available=2Gi"`

如果 memory.available 驱逐阈值被触发,kubelet将保证 memory.available 至少为 500Mi。对于 nodefs.available,kubelet将保证 nodefs.available 至少为 1.5Gi。对于 imagefs.available,kubelet将保证 imagefs.available 至少为 102Gi,直到不再有相关资源报告压力为止。

所有资源的默认 eviction-minimum-reclaim 值为 0。

注意:当磁盘驱逐成熟时,下面的 kubelet 标志将被标记为废弃的,以简化支持驱逐的配置。

现有标签 新标签
--image-gc-high-threshold --eviction-hard or eviction-soft
--image-gc-low-threshold --eviction-minimum-reclaim
--maximum-dead-containers deprecated
--maximum-dead-containers-per-container deprecated
--minimum-container-ttl-duration deprecated
--low-diskspace-threshold-mb --eviction-hard or eviction-soft
--outofdisk-transition-frequency --eviction-pressure-transition-period

参考官网链接:https://kubernetes.io/zh/docs/tasks/administer-cluster/out-of-resource/

kubernetes集群之GC处理的更多相关文章

  1. 二进制安装部署kubernetes集群---超详细教程

    本文收录在容器技术学习系列文章总目录 前言:本篇博客是博主踩过无数坑,反复查阅资料,一步步搭建完成后整理的个人心得,分享给大家~~~ 本文所需的安装包,都上传在我的网盘中,需要的可以打赏博主一杯咖啡钱 ...

  2. Kubernetes探索学习001--Centos7.6使用kubeadm快速部署Kubernetes集群

    Centos7.6使用kubeadm快速部署kubernetes集群 为什么要使用kubeadm来部署kubernetes?因为kubeadm是kubernetes原生的部署工具,简单快捷方便,便于新 ...

  3. kubeadm搭建kubernetes集群之二:创建master节点

    在上一章kubeadm搭建kubernetes集群之一:构建标准化镜像中我们用VMware安装了一个CentOS7虚拟机,并且打算用这个虚拟机的镜像文件作为后续整个kubernetes的标准化镜像,现 ...

  4. CentOS 7.5 使用 yum 安装 Kubernetes 集群(二)

    一.安装方式介绍 1.yum 安装 目前CentOS官方已经把Kubernetes源放入到自己的默认 extras 仓库里面,使用 yum 安装,好处是简单,坏处也很明显,需要官方更新 yum 源才能 ...

  5. (转)实验文档4:kubernetes集群的监控和日志分析

    改造dubbo-demo-web项目为Tomcat启动项目 Tomcat官网 准备Tomcat的镜像底包 准备tomcat二进制包 运维主机HDSS7-200.host.com上:Tomcat8下载链 ...

  6. (转)实验文档3:在kubernetes集群里集成Apollo配置中心

    使用ConfigMap管理应用配置 拆分环境 主机名 角色 ip HDSS7-11.host.com zk1.od.com(Test环境) 10.4.7.11 HDSS7-12.host.com zk ...

  7. 监控 Kubernetes 集群应用

    Prometheus的数据指标是通过一个公开的 HTTP(S) 数据接口获取到的,我们不需要单独安装监控的 agent,只需要暴露一个 metrics 接口,Prometheus 就会定期去拉取数据: ...

  8. Kubernetes集群搭建 ver1.20.5

    目录 部署方式 1. 基础环境准备 1.1 基础初始化 1.2 安装docker 2. 部署harbor及haproxy高可用反向代理 2.1 镜像加速配置 2.2 高可用master可配置 3. 初 ...

  9. 基于Containerd安装部署高可用Kubernetes集群

    转载自:https://blog.weiyigeek.top/2021/7-30-623.html 简述 Kubernetes(后续简称k8s)是 Google(2014年6月) 开源的一个容器编排引 ...

  10. 升级二进制kubernetes集群

    升级二进制kubernetes集群 背景介绍 最近由于时间不足,暂时无法对小版本更新第一时间出新的文档.若需要升级集群版本,可以参考此文档进行操作,每个节点一个一个地更新.大版本更新请各位持续关注我的 ...

随机推荐

  1. 怎么解决DB读写分离,导致数据不一致问题?

    前言 在互联网中大型项目中,读写分离应该是我们小伙伴经常听说的,这个主要解决大流量请求时,提高系统的吞吐量.因为绝大部分互联网产品都是读多写少,大部分都是读请求,很小部分是写请求. 上图: 1)一个主 ...

  2. 什么是swagger,一篇带你入门

    一.前言 在前后端分离开发的过程中,前端和后端需要进行api对接进行交互,就需要一个api规范文档,方便前后端的交互,但api文档不能根据代码的变化发生实时动态的改变,这样后端修改了接口,前端不能及时 ...

  3. 实现领域驱动设计 - 使用ABP框架 - 聚合

    这是本指南的关键部分.我们将通过实例介绍和解释一些明确的规则.在实现领域驱动设计时,您可以遵循这些规则并将其应用到您的解决方案中 领域案例 这些例子将使用GitHub中使用的一些概念,比如Issue, ...

  4. 面试题-Storm框架

    前言 Storm框架在实际项目中已经平稳运行快一年了,也很好的支撑了海量读写器的数据处理需求,不过和RabbitMQ一样,为了项目进度,实际工作中只能尽快的调研,关注一些关键点,其他的细节就只能放一放 ...

  5. study Rust-8【使用结构体的方法】

    1.方法 与函数类似:它们使用 fn 关键字和名称声明,可以拥有参数和返回值,同时包含在某处调用该方法时会执行的代码.2.不过方法与函数是不同的,因为它们在结构体的上下文中被定义(或者是枚举或 tra ...

  6. DNS介绍与实现方法

    简介:域名系统(Domain Name System,缩写:DNS)是互联网的一项服务.是一种可以将域名和IP地址相互映射的以层次结构分布的数据库系,允许终端用户设备将给定的人类可读URL转换为网络可 ...

  7. 几种JAVA表达式语言计算工具

    测试表达式工具分类 这里测试了几种方式,MS excel,Spring SEPL,MVEL,Google aviator import com.googlecode.aviator.AviatorEv ...

  8. PHP采集图片实例(PHP采集)

    以下为引用的内容: <?php/** *  采集图片php程序**  Copyright(c) 2008 by 小超(ccxxcc) All rights reserved**  To cont ...

  9. ubuntu安装clamav

    直接apt安装 sudo apt-get update sudo apt-get install clamav clamav-daemon clamscan --version 停止服务更新病毒库 为 ...

  10. Java8 新特性-Lambda表达式

    目录 1.Lambda表达式介绍 2.Lambda表达式语法细讲 3. Lambda表达式语法精简 4. Lambda方法引用 5. 综合实例 6. @FunctionalInterface注解 7. ...