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

一、快速恢复节点:定位并清理占用磁盘的大文件
节点显示 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