kubelet 清理资源以缓解磁盘压力

kubelet 资源清理缓解磁盘压力指南

在 Kubernetes 集群中,当节点磁盘压力过大时,可通过以下几种方式利用 kubelet 清理资源,从而缓解磁盘压力。

一、镜像垃圾回收

自动回收

kubelet 内置了镜像垃圾回收机制,其行为由配置参数控制。编辑 /var/lib/kubelet/config.yaml 文件,添加或修改如下参数:

imageGCHighThresholdPercent: 85
imageGCLowThresholdPercent: 80

imageGCHighThresholdPercent 表示当磁盘使用率达到 85% 时触发镜像回收;imageGCLowThresholdPercent 表示回收操作将持续进行,直到磁盘使用率降至 80%。修改后,重启 kubelet 服务:

sudo systemctl restart kubelet

手动回收

根据不同的容器运行时,使用对应命令手动清理镜像:

  • Docker
docker image prune -a -f
  • containerd
crictl rmi $(crictl images -q)

触发条件与过程

  • 触发条件:当节点的磁盘使用率超过设定的阈值时,kubelet 会触发镜像垃圾回收。正常情况下会定时执行,以保证节点资源充足;在节点资源不足时,Kubelet 在驱逐 Pod 前会先强制执行一次垃圾回收,如果清理后资源充足则不会驱逐 Pod。
  • 清理过程:kubelet 会识别不再被任何容器引用的镜像(未使用镜像),并按照最近使用时间排序,优先删除最旧的镜像。对于新拉取的镜像,会存活一定时间(默认 2 分钟)后才执行清理,以防止刚拉取的镜像就被清理掉。

关键参数

  • --image-gc-high-threshold:磁盘使用率的上限阈值,默认为 85%。
  • --image-gc-low-threshold:磁盘使用率的下限阈值,默认为 80%。
  • --minimum-image-ttl-duration:镜像最短生存时间,默认 2 分钟。

回收频率与流程

  • 回收频率:Kubelet 默认每 5 分钟执行一次镜像垃圾回收。
  • 回收流程:Kubelet 会识别不再被任何 Pod 引用的镜像,并按照最近使用时间(LRU)策略逐个清理,直到磁盘使用率降到设定的下限或没有空闲镜像可以清理。

二、容器垃圾回收

自动回收

kubelet 可以根据配置自动清理已停止的容器。编辑 /var/lib/kubelet/config.yaml 文件,添加或修改如下参数:

containerRuntimeOptions:containerGC:maxPerPodContainer: 1minAge: 2m

maxPerPodContainer 限制每个 Pod 最多保留的已停止容器数量为 1;minAge 表示只有停止时间超过 2 分钟的容器才会被清理。修改后,重启 kubelet 服务。

手动回收

  • Docker
docker container prune -f
  • containerd
crictl rm $(crictl ps -a -q)

触发条件与过程

  • 触发条件:kubelet 定期执行容器垃圾回收,以清理不再需要的容器,主要针对普通容器、sandbox 容器以及容器日志目录。对于普通容器,Kubelet 会根据 MaxPerPodContainerMaxContainers 的设置,按照 LRU 策略,从 Pod 的死亡容器列表删除一定数量的容器,直到满足配置需求;对于 sandbox 容器,Kubelet 按照每个 Pod 保留一个的原则清理多余的死亡 sandbox;对于日志目录,只要没有 Pod 与之关联了就将其删除。
  • 清理过程:kubelet 会删除已经终止的容器,特别是那些已经超出保留时间的容器。

关键参数

  • --maximum-dead-containers-per-container:每个 Pod 可以保留的死亡容器的最大数量,默认为 1。
  • --maximum-dead-containers:节点上可以保留的死亡容器的最大数量,默认为 -1,表示没有限制。
  • --minimum-container-ttl-duration:容器可被回收的最小生存时间,默认为 0 分钟,即死亡容器可以立即被回收。

回收频率与流程

  • 回收频率:Kubelet 默认每分钟执行一次容器垃圾回收。
  • 回收流程:Kubelet 会清理可以驱逐的容器,包括那些状态不是 RUNNING 且在本轮 GC 前创建的容器。Kubelet 在到达 GC 时间点时,会遍历所有 Pod,使其满足 --maximum-dead-containers-per-container 的设置,如果不满足 --maximum-dead-containers,则计算值 X = (--maximum-dead-containers)/(Pod 总数),再遍历所有 Pod,使其满足已停止运行的容器集个数不大于 X 且至少为 1,如果还不满足 --maximum-dead-containers,则对所有已停止的容器(普通容器 + sandbox 容器)排序,优先删除创建时间最早的容器直到满足 --maximum-dead-containers 为止。执行清理直到满足以下条件之一:
    • 每个 Pod 中存在的已挂掉的容器数满足阈值。
    • 所有 Pod 中存在的已挂掉的容器数满足阈值。

三、未使用的 Volume 清理

手动清理

定期清理不再使用的持久卷声明(PVC)和挂载的 Volume 能释放大量磁盘空间。使用以下命令删除所有处于 Released 状态的 PVC:

kubectl get pvc --field-selector status.phase=Released -o name | xargs kubectl delete

此外,若使用的是动态存储卷,确保存储类(StorageClass)配置了正确的回收策略。

触发条件与过程

  • 触发条件:当节点磁盘空间不足时,kubelet 会尝试清理未使用的 Volumes。
  • 清理过程:kubelet 会识别并删除那些不再被任何 Pod 引用的 Volumes。

自动清理涉及方面

  • PersistentVolumeClaim (PVC) 和 PersistentVolume (PV) 的回收策略:Kubernetes 中的 PVC 对象可以设置 reclaimPolicy 属性,该属性有两个值:RetainDelete。当 PVC 与 PV 绑定后,如果 Pod 被删除,根据 reclaimPolicy 的设置,Volume 可以被保留或自动删除。
  • StorageClass 的 reclaimPolicy:在 StorageClass 对象中,可以设置 reclaimPolicy,这将决定 PV 的默认回收策略。当设置为 Delete 时,PV 和绑定的存储资源在 PVC 删除时将被自动清理。
  • Kubelet 垃圾回收机制:Kubelet 定期进行垃圾收集,包括容器和镜像。Kubelet 每分钟对未使用的容器执行一次垃圾收集,每五分钟对未使用的镜像执行一次垃圾收集。
  • Volume 插件目录清理:Kubelet 可以通过配置 --volume-plugin-dir 参数来指定卷插件目录,并定期清理其中的数据。
  • 日志文件管理:Kubelet 会定期清理旧的日志文件,或者配置日志轮转工具(如 logrotate)来管理日志文件的大小和生命周期,以释放磁盘空间。
  • 手动清理命令:可以使用 kubectl 命令清理未使用的 PV 和 PVC,例如查找未被使用的 PVC 并删除它们,进而可能触发关联 Volume 的清理。
  • 定期审计和清理:定期检查集群中的 Volume 使用情况,手动清理未被自动回收的 Volume。

四、驱逐机制(Eviction)

配置参数

kubelet 可以基于磁盘压力等条件驱逐 Pod,释放节点资源。编辑 /var/lib/kubelet/config.yaml 文件,添加或修改如下参数:

evictionHard:imagefs.available: 10%nodefs.available: 10%
evictionSoft:imagefs.available: 15%nodefs.available: 15%
evictionSoftGracePeriod:imagefs.available: 5mnodefs.available: 5m
evictionMinimumReclaim:imagefs.available: 5%nodefs.available: 5%

上述配置中,当镜像文件系统或节点文件系统的可用空间低于 10% 时,触发硬驱逐;低于 15% 时触发软驱逐,软驱逐会在 5 分钟后执行,每次驱逐操作至少回收 5% 的可用空间。修改后,重启 kubelet 服务。

触发条件与过程

  • 触发条件:当节点资源(如内存、磁盘空间)低于硬驱逐阈值时,kubelet 会触发驱逐机制。
  • 驱逐过程:kubelet 会根据配置的驱逐策略,选择并终止某些 Pod 以释放资源。例如,当节点的可用内存低于 100Mi 时,kubelet 可能会开始驱逐 Pod。

五、日志文件管理

自动轮转

使用 logrotate 工具配置日志轮转,编辑 /etc/logrotate.d/kubelet 文件:

/var/log/kubelet.log {dailymissingokrotate 7compressdelaycompressnotifemptycreate 0640 root admsharedscriptspostrotateif [ -f /var/run/kubelet.pid ]; thenkill -HUP `cat /var/run/kubelet.pid`fiendscript
}

上述配置表示每天轮转一次 kubelet 日志文件,保留最近 7 天的日志,压缩旧日志文件。

手动清理

手动删除不再需要的日志文件:

sudo rm -rf /var/log/pods/*

需注意,此操作会清除所有 Pod 的日志,操作前请备份重要日志。

触发条件与管理过程

  • 触发条件:日志文件占用大量磁盘空间时。
  • 管理过程:kubelet 会定期清理旧的日志文件,或者配置日志轮转工具(如 logrotate)来管理日志文件的大小和生命周期。

日志管理涉及方面

  • 日志文件路径规则:Kubelet 将容器日志默认写入 /var/log/pods 目录下,每个 Pod 的日志存放在以其命名空间、名称和 UID 为名的子目录中。容器日志文件以容器重启次数命名,格式为 <容器重启次数>.log
  • 日志文件软链接规则:容器日志目录下的日志文件实际上是软链接类型文件,指向实际的日志文件。
  • 日志文件清理:Kubelet 每 1 分钟执行一次容器清理,包括清理死亡容器的日志目录。如果一个 Pod 已经不再占用其日志目录,Kubelet 会清理这些日志目录。
  • 日志文件大小和文件数限制:Kubelet 配置选项 containerLogMaxSizecontainerLogMaxFiles 分别允许配置每个日志文件大小的最大值和每个容器允许的最大文件数,默认分别为 10Mi 和 5。
  • 日志轮换机制:Kubelet 提供了基于可以执行多少并发日志轮换以及监控和轮换日志所需要的间隔来调整日志的轮换方式的机制。可以通过配置 containerLogMaxWorkerscontainerLogMonitorInterval 来调整。
  • 系统组件日志位置:在使用 systemd 的 Linux 节点上,kubelet 和容器运行时默认写入 journald。如果 systemd 不存在,kubelet 和容器运行时将写入到 /var/log 目录中的 .log 文件。
  • 自定义日志目录:Kubelet 允许将 Pod 日志目录从默认的 /var/log/pods 更改为自定义路径,通过在 kubelet 的配置文件中配置 podLogsDir 参数来进行此调整。

六、配置参数调整

减少日志级别

编辑 kubelet 服务的启动参数文件 /etc/systemd/system/kubelet.service.d/10-kubeadm.conf,添加或修改 --v 参数来降低日志级别:

Environment="KUBELET_EXTRA_ARGS=--v=2"

日志级别范围从 0 到 10,数值越小,日志输出越少。修改后,重新加载 systemd 配置并重启 kubelet 服务:

sudo systemctl daemon-reload
sudo systemctl restart kubelet

减少缓存

减少 kubelet 的缓存数据,如临时文件和下载的镜像等。编辑 /var/lib/kubelet/config.yaml 文件,添加或修改如下参数:

cacheDir: /var/lib/kubelet/cache
cacheMaxSize: 1024Mi

上述配置将 kubelet 的缓存目录设置为 /var/lib/kubelet/cache,并限制缓存最大为 1024MB。修改后,重启 kubelet 服务。

通用参数调整

管理员可以通过调整 kubelet 的配置参数来优化资源清理行为,例如调整垃圾回收的阈值和频率。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/78179.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SPOJ 11576 TRIP2 - A Famous King’s Trip 【Tarjan+欧拉回路】

自我吐槽 &#xff08;哭 题目传送门 SPOJ 洛谷 题目大意 让你在简单无向图上删去2条边&#xff0c;使该图联通并存在欧拉回路 输出字典序最小的一对边 思路 考虑到存在欧拉回路的充要条件&#xff0c;即 i n x ≡ 0 ( m o d 2 ) ∀ i ( 1 ≤ i ≤ n ) in_x\equiv 0 (\m…

藏文情感分析器入门学习实践

&#x1f3af; 项目目标&#xff1a; 输入一段藏文短句。自动分析这句话的情感倾向&#xff1a;积极&#xff08;正面&#xff09;/消极&#xff08;负面&#xff09;/中立。 &#x1f50d; 技术原理简介 情感分析是什么&#xff1f; 情感分析&#xff08;Sentiment Analysi…

双指针(5)——有效三角形个数

题目&#xff1a; 这道题我们首先可能会想到暴力解法&#xff0c;三个for循环然后进行check&#xff08;&#xff09;。时间复杂度肯定是不允许的。 同时&#xff0c;验证可以组成三角形的条件是任意两边之和大于第三边&#xff0c;这就意味着我们每组要进行三次比较。但也有捷…

书生实战营之沐曦专场

一&#xff1a;实验环境进入和启动实验容器(D.run平台) 1.1首先进入平台进行注册 D.run平台https://console.d.run/ 注册和登录环节就跳过了。 1.2 启动实验容器--详细步骤如下 1.2.1选择容器的名称、区域、镜像&#xff08;注意镜像必须选择Dlinfer&#xff09; 1.2.2可以选…

内置类型成员变量的初始化详解

在 C 中&#xff0c;内置类型&#xff08;如 int、float、double、char、指针等&#xff09;的初始化方式与类类型&#xff08;如 std::string、自定义类&#xff09;不同。由于内置类型没有构造函数&#xff0c;它们的初始化行为由编译器直接处理。以下是详细解析&#xff1a;…

对第三方软件开展安全测评,如何保障其安全使用?

对第三方软件开展安全测评&#xff0c;能够精准找出软件存在的各类安全隐患&#xff0c;进而为软件的安全使用给予保障。此次会从漏洞发现、风险评估、测试环境等多个方面进行具体说明。 漏洞发现情况 在测评过程中&#xff0c;我们借助专业技术与工具&#xff0c;对第三方软…

11.Spring Boot 3.1.5 中使用 SpringDoc OpenAPI(替代 Swagger)生成 API 文档

Spring Boot 3.1.5 中使用 SpringDoc OpenAPI&#xff08;替代 Swagger&#xff09;生成 API 文档 1. 项目结构 假设项目名为 springboot-openapi-demo&#xff0c;以下是项目的基本结构&#xff1a; springboot-openapi-demo/ ├── src/ │ ├── main/ │ │ ├─…

python入门(1)变量与输入输出

一、变量 使用规则 变量名值例子 a13变量名规则 变量名可以用大小写字母、数字、下划线。 数字、下划线不可开头 例子 name name1 1name name_first _first 二、输入输出 输出print print(*objects,sep"",end"\n") objects:多个要输出的值 sep:每个…

TS 安装

TS较JS优势 1 TS静态类型编程语言。编译时发现错误 2 类型系统 强化变量类型概念 3 支持新语法 4 类型推断机制 可以和React框架中的各种hook配合 5 任何地方都有代码提示 tsc 命令 将TS转为JS 1 tsc 文件.ts 生成 js文件 2 执行JS代码

Linux-常用监控工具

以下是对 Linux 系统中常用监控工具&#xff08;netstat、ss、dmesg&#xff09;的系统性介绍&#xff0c;涵盖其核心功能、典型用法及实际应用场景&#xff0c;帮助您分析系统状态和内核参数调整后的效果&#xff1a; 1. netstat -s&#xff1a;网络协议栈统计监控 功能 net…

Linux系统:详解文件描述符与重定向原理以及相关接口(open,read,write,dup2)

本节重点 从狭义与广义角度理解文件理解文件描述符掌握open,write,read系统调用理解重定向的概念与原理掌握重定向的指令操作stdout与stderr的比较为什么存在stderr&#xff1f; 一、理解“文件” 1.1 狭义角度 在狭义层面&#xff0c;Linux文件是磁盘或存储设备上连续或分…

美国市场变局:沃尔玛95%覆盖率的3个流量入口重构策略

过去几年&#xff0c;美国零售市场经历了极大的变化。电商发展迅猛&#xff0c;加上疫情影响&#xff0c;消费者购物习惯出现转向。而作为美国零售巨头&#xff0c;沃尔玛&#xff08;Walmart&#xff09;凭借高达95%的线下覆盖率&#xff0c;始终是品牌和卖家不可忽视的渠道。…

一文详解 Linux下的开源打印系统CUPS(Common UNIX Printing System)

文章目录 前言一、CUPS 简介二、CUPS 常用指令解析2.1 安装 CUPS2.2 启动/重启服务2.3 添加打印机&#xff08;核心操作&#xff09;2.4 设置默认打印机2.5 打印文件2.6 查看打印任务2.7 取消打印任务2.8 查看、移除已添加的打印机 三、调试与常见问题3.1 日志查看3.2 驱动问题…

React useCallback函数

应用场景&#xff1a;父组件向子组件传递函数类型的props时

python 桌面程序开发简述及示例

Python桌面程序开发简述及示例 Python凭借其简洁的语法和丰富的库支持,非常适合开发跨平台的桌面应用程序。本文将介绍Python桌面开发的主要方法,并提供实际代码示例。 一、Python桌面开发主要方法 1.1 Tkinter(标准库) Python内置的GUI库,适合开发简单桌面应用 1.2 …

数字智慧方案5875丨智慧交通枢纽综合解决方案(43页PPT)(文末有下载方式)

篇幅所限&#xff0c;本文只能提供部分资料内容&#xff0c;完整资料请看下面链接 https://download.csdn.net/download/2301_78256053/89575708 资料解读&#xff1a;智慧交通枢纽综合解决方案 详细资料请看本解读文章的最后内容。 随着城市化进程的加速和交通需求的不断增…

企业级分布式 MCP 方案

飞书原文档链接地址&#xff1a;https://ik3te1knhq.feishu.cn/wiki/D8kSwC9tFi61CMkRdd8cMxNTnpg 企业级分布式 MCP 方案 [!TIP] 背景&#xff1a;现阶段 MCP Client 和 MCP Server 是一对一的连接方式&#xff0c;若当前 MCP Server 挂掉了&#xff0c;那么 MCP Client 便不…

【AI提示词】奥卡姆剃刀思维模型专家

提示说明 一位专注于奥卡姆剃刀思维模型的专业人士&#xff0c;擅长将简洁性原则应用于复杂问题的分析与解决。 提示词 # Role: 奥卡姆剃刀思维模型专家## Profile - language: 中文 - description: 一位专注于奥卡姆剃刀思维模型的专业人士&#xff0c;擅长将简洁性原则应用…

2.1 行列式

引言 行列式是线性代数的核心工具&#xff0c;贯穿矩阵运算、特征值计算与微分方程求解。本文系统梳理2.1节核心考点&#xff0c;结合公式速查与典型例题&#xff0c;助你高效突破行列式难点&#xff01; 考点一&#xff1a;数值型行列式计算 1️⃣ 行列式的定义 (1) 定义方…

单词规律(简单)

思路和同构字符串那道题一样。、但是这道题要注意的地方就是&#xff0c;检查 pattern 和 s 的单词数量是否一致以及在进行字符串比较的时候应该用equals来进行比较&#xff0c;而不能用“&#xff01;”&#xff0c;“&#xff01;”比较的是对象引用而非内容。 class Soluti…