导读:本期聚焦于林则安创作的《Kubernetes 节点磁盘爆满导致 NotReady 该如何处理?》,敬请观看详情。节点磁盘使用率逼近 100% 时,容器运行时和 kubelet 常会同时失去响应,节点状态在几分钟内从 Ready 变成 NotReady。这个问题在 Windows 节点上更容易被忽略,因为系统盘除了容器镜像和日志,还叠加了页面文件、补丁缓存和 Defender 扫描临时文件。处理时不能只重启节点,否则故障很快复现。需要先定位是哪些文件占满磁盘,再根据 kubelet 的磁盘压力条件调整驱逐阈值,并补齐日志轮转和容量告警。本文会给出 Windows 节点上常见的几个高占用目录,例如 C:\var\log\kubelet、C:\ProgramData\Docker、C:\Windows\Temp,以及对应的清理和预防方法。同时也会说明如何通过 kubectl describe node 查看磁盘压力条件,避免再次出现节点 NotReady 导致 Pod 调度失败。

Kubernetes 节点的 Ready 状态由 kubelet 周期性向 API Server 上报心跳来维持。当磁盘可用空间跌破驱逐阈值,或者磁盘压力条件持续存在,kubelet 可能无法正常写入状态文件和 Pod 日志,心跳上报也会随之失败,节点就会被控制平面标记为 NotReady。在 Windows 节点上,磁盘爆满往往不是单一原因造成的,容器镜像层、容器日志、系统补丁缓存、Defender 扫描临时文件以及页面文件都可能占用大量空间。因此处理时首先要恢复节点的写入能力,而不是直接重启了事,否则故障会在几分钟到几小时内再次出现。

Kubernetes 节点磁盘爆满导致 NotReady 该如何处理?

一、快速恢复节点:定位并清理占用磁盘的大文件

节点显示 NotReady 后,第一步是通过 kubectl describe node <节点名> 查看 Conditions 部分是否出现 DiskPressure 为 True 的情况。该条件表示 kubelet 已经检测到节点上的可用磁盘空间低于驱逐阈值,可能已经开始驱逐 Pod。此时应立即登录节点,检查系统盘和数据盘的使用率。Windows 节点可以使用 Get-PSDrive 或文件资源管理器查看盘符用量,但更快的办法是直接定位大文件。

在 Windows Kubernetes 节点上,以下几个位置最容易堆积大文件:C:\var\log\kubelet 存放 kubelet 自身日志,如果长时间未轮转,单个日志文件可能超过几 GB;C:\ProgramData\Docker 下的 windowsfilter 和 containers 目录保存镜像层和容器可写层;C:\Windows\Temp 以及用户配置目录 C:\Windows\System32\config\systemprofile\AppData\Local\Temp 会残留容器运行时和系统组件的临时文件。此外,C:\ProgramData\containerd 目录在 containerd 作为容器运行时时也会占据大量空间,尤其是 root\io.containerd.content.v1.content 下的镜像内容存储。

可以用下面这段 PowerShell 命令快速找出指定目录下最大的 20 个文件,按大小降序排列。推荐优先扫描系统盘和容器数据盘,注意执行时可能需要管理员权限。

Get-ChildItem -Path C:\var\log\kubelet,C:\ProgramData\Docker,C:\Windows\Temp,C:\ProgramData\containerd -Recurse -File -ErrorAction SilentlyContinue | Sort-Object Length -Descending | Select-Object -First 20 FullName,Length

清理时需要区分哪些文件可以安全删除。kubelet 日志如果已经超过数 GB,可以停止 kubelet 服务后重命名或删除旧日志文件,再启动服务生成新日志。容器镜像如果已经不再使用,应优先使用 docker image prune 或 ctr images prune 清理悬挂镜像,而不是直接删除 windowsfilter 目录下的文件,否则可能破坏正在运行的容器。系统临时文件可以通过磁盘清理工具或手动删除 C:\Windows\Temp 下的过期内容。完成清理后,节点磁盘可用空间应迅速回升,kubelet 会在下一次心跳周期内恢复 Ready 状态。

二、调整 Kubelet 驱逐与垃圾回收参数

磁盘清理解决的是当前故障,但要避免节点再次因为磁盘爆满而进入 NotReady,需要调整 kubelet 的驱逐阈值和镜像垃圾回收策略。kubelet 通过 --eviction-hard 参数定义硬驱逐条件,当节点资源低于阈值时会强制驱逐 Pod。默认情况下,Linux 节点的 imagefs.available 和 nodefs.available 通常设置为 10% 到 15%,但 Windows 节点可能因为系统盘本身空间较小而需要根据实际情况调整。

Windows 节点的 kubelet 配置文件一般位于 C:\var\lib\kubelet\config.yaml,修改该文件可以统一管理驱逐参数和垃圾回收阈值。下面是一个示例配置,将节点文件系统可用空间低于 10% 时触发驱逐,镜像文件系统低于 15% 时触发驱逐,同时将镜像垃圾回收的高水位设为 85%,低水位设为 80%。

evictionHard:
  memory.available: "500Mi"
  nodefs.available: "10%"
  imagefs.available: "15%"
imageGCHighThresholdPercent: 85
imageGCLowThresholdPercent: 80

需要注意,nodefs.available 在 Windows 节点上通常指系统盘 C:\,而 imagefs.available 指镜像存储所在盘符。如果 Docker 或 containerd 使用单独的 D 盘存放镜像,那么 imagefs.available 应该根据 D 盘容量设置,否则 kubelet 可能误判镜像盘空间不足。阈值不宜设置过低,否则节点在磁盘接近完全耗尽前不会主动驱逐,Pod 和 kubelet 的写入失败会直接导致 NotReady;阈值也不宜过高,否则节点会频繁驱逐 Pod,影响业务稳定性。调整完成后需要重启 kubelet 服务,可以使用 Restart-Service kubelet 命令使配置生效。

三、建立磁盘容量监控与日志轮转机制

除了被动处理磁盘爆满,更可靠的做法是提前预警。Prometheus 的 node_exporter 在 Windows 节点上可以采集文件系统可用字节数,配合 predict_linear 函数可以预测磁盘何时耗尽。下面是一条告警规则,当 C 盘预计 24 小时内可用空间降为零时触发告警。该规则需要 Windows 节点已部署 node_exporter 并正确上报 node_filesystem_avail_bytes 指标。

alert: NodeDiskWillFillIn24Hours
expr: predict_linear(node_filesystem_avail_bytes{mountpoint="C:"}[1h], 24*3600) < 0
for: 10m
labels:
  severity: warning
annotations:
  summary: "节点磁盘预计 24 小时内耗尽"

日志轮转是防止容器日志无限增长的关键手段。在 Docker 作为容器运行时的 Windows 节点上,可以修改 C:\ProgramData\Docker\config\daemon.json 文件,为 json-file 日志驱动设置单个日志文件的最大大小和保留文件数量。下面是一个示例配置,限制每个容器日志最多 10MB,最多保留 3 个轮转文件。

{
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "10m",
    "max-file": "3"
  }
}

修改后需要重启 Docker 服务,命令为 Restart-Service docker。对于已经存在的大量旧日志,可以手动清理 C:\ProgramData\Docker\containers 下对应容器目录中的 *-json.log 文件,或者直接删除无用的已停止容器。此外,系统级日志例如 C:\Windows\Logs 下的 CBS 和 DISM 日志也会占用空间,可以通过磁盘清理工具定期处理。将磁盘使用率纳入日常巡检和告警体系后,节点 NotReady 的故障可以大幅减少,即使出现也能快速定位并恢复。

Kubernetes磁盘爆满节点NotReady磁盘清理修改时间:2026-09-29 00:43:37

免责声明:已尽一切努力确保本网站所含信息的准确性。网站作品多为原创整理与精心创作,观点力求客观中立。本站旨在免费分享,内容仅供个人学习、研究或参考使用。若引用了第三方作品,版权归原作者所有。如内容涉及您的权益,请联系我们进行处理Email:chomcom@qq.com。
引用或转载本作品时,请注明当前出处:https://www.ipipp.com/html/0929/63200.html,基于非商业用途的前提下,欢迎转载或二创本作品。
内容垂直聚焦
专注技术核心技术栏目,确保每篇文章深度聚焦于实用技能。从代码技巧到架构设计,为用户提供无干扰的纯技术知识沉淀,精准满足专业提升需求。
知识结构清晰
覆盖从开发到部署的全链路。AI、前端、编程、数据库、服务器、建站、系统层层递进,构建清晰学习路径,帮助用户系统化掌握开发与运维所需的核心技术。
深度技术解析
拒绝泛泛而谈,深入技术细节与实践难点。无论是数据库优化还是服务器配置,均结合真实场景与代码示例进行剖析,致力于提供可直接应用于工作的解决方案。
专业领域覆盖
精准对应开发生命周期。从前端界面到后端编程,从数据库操作到服务器运维,形成完整闭环,一站式满足全栈工程师和运维人员的技术需求。
即学即用高效
内容强调实操性,步骤清晰、代码完整。用户可根据教程直接复现和应用于自身项目,显著缩短从学习到实践的距离,快速解决开发中的具体问题。
持续更新保障
专注既定技术方向进行长期、稳定的内容输出。确保各栏目技术文章持续更新迭代,紧跟主流技术发展趋势,为用户提供经久不衰的学习价值。