kubernetes 通过节点压力驱逐和镜像垃圾回收机制实现磁盘空间自动清理:kubelet 每5分钟扫描并删除未引用且超时(默认2h)的镜像;需配置 imagefs.available 阈值、日志轮转及监控告警以保障效果。

Kubernetes 本身不直接提供“磁盘空间自动清理”功能,但它通过内置的 节点压力驱逐(Node Pressure Eviction) 和 镜像垃圾回收(Image GC) 机制,配合合理配置,可实现对节点磁盘空间的自动化、可控释放。关键在于理解触发条件、配置参数,并辅以运维实践。
镜像垃圾回收(Image GC)自动清理无用镜像
Kubelet 会定期扫描本地镜像,删除未被任何 Pod 引用且满足条件的镜像,从而释放 /var/lib/docker(或 containerd 的镜像存储路径)空间。
- 默认启用,无需额外开启
- 触发时机:kubelet 每 5 分钟检查一次(可通过
--image-gc-interval调整) - 清理依据:
- 镜像未被任何运行中或已停止但未被清理的容器引用
- 镜像创建时间早于
--minimum-image-ttl-duration(默认 2h) - 总镜像占用超过
--eviction-hard或--eviction-soft中定义的imagefs.available阈值时,会加速清理
建议配置示例(在 kubelet 启动参数中):
--image-gc-interval=30m \ --minimum-image-ttl-duration=2h \ --eviction-hard=imagefs.available<h3>日志与容器运行时垃圾自动清理</h3><p>容器日志(如 <code>/var/log/pods/</code> 和 <code>/var/lib/docker/containers/</code> 下的日志)长期积累会快速耗尽磁盘。Kubernetes 不管理日志生命周期,需依赖以下方式:</p>
-
容器运行时配置日志轮转(推荐)
Kubernetes Security Posture Scorecard下载评估 Kubernetes 集群安全态势,覆盖 RBAC、工作负载安全、网络策略、基础设施即代码(IaC)、运行时监控和密钥管理等 30 项控制项……
- Docker:在
/etc/docker/daemon.json中设置:{ "log-driver": "json-file", "log-opts": { "max-size": "100m", "max-file": "3" } } - containerd:在
/etc/containerd/config.toml中配置containerd.runtimes.runc.options下的SystemdCgroup = true及日志选项(需搭配cri-o或containerd版本 ≥ 1.6)
- Docker:在
kubelet 日志目录清理(有限)
kubelet 自身日志(/var/log/kubelet.log)不自动清理,需配合 logrotate;Pod 日志目录(/var/log/pods/)中的已终止 Pod 日志,会在 Pod 被彻底删除(包括Terminated状态消失)后由 kubelet 异步清理,延迟取决于--pod-cidr和 GC 周期(默认每 20s 扫描一次,可通过--housekeeping-interval调整)。
节点磁盘压力驱逐(Eviction)主动腾退资源
当节点根文件系统(nodefs)或镜像文件系统(imagefs)空间不足时,kubelet 会按策略驱逐 Pod,防止节点失联:
- 驱逐触发条件基于
--eviction-hard(立即执行)或--eviction-soft(带宽限期) - 驱逐顺序:先终止 BestEffort 类型 Pod,再 Burstable,最后 Guaranteed(仅当硬阈值突破且无其他选择时)
- 驱逐后,其容器、卷挂载、日志目录将逐步被清理(通常在几分钟内)
常见磁盘相关驱逐参数:
--eviction-hard=nodefs.available<p>其中 <code>eviction-minimum-reclaim</code> 表示每次驱逐后至少尝试释放的空间量,避免反复触发。</p><h3>补充建议:可观测性与主动干预</h3><p>仅靠自动机制可能滞后。建议同步部署:</p>
- 使用
node_disk_*系列 Prometheus 指标(来自 Node Exporter)监控node_disk_used_percent、node_filesystem_avail_bytes - 设置告警(如
node_filesystem_avail_bytes{mountpoint="/"} ) - 对长期运行的调试 Pod 或 Job,显式设置
restartPolicy: Never并配合 TTL 控制器(ttlSecondsAfterFinished)及时清理 - 定期运行
crictl images --quiet | xargs crictl rmi(containerd)或docker image prune -af(Docker)作为辅助脚本(需谨慎,避免误删)
不复杂但容易忽略










