
1. 问题现象与背景解析当Kubernetes集群节点出现DiskPressure状态时意味着该节点上的磁盘资源包括根分区或特定挂载点已经达到或接近其容量上限。这种情况通常会在kubelet监控到磁盘空间低于某个阈值时自动触发系统会通过污点Taint机制阻止新的Pod调度到该节点并可能驱逐现有Pod以释放空间。在实际生产环境中我们经常会在以下场景遇到该问题容器日志未配置轮转策略导致日志文件膨胀长期运行的Pod产生大量临时文件未清理节点上的Docker存储驱动配置不当导致镜像层堆积应用未正确处理大文件的上传/下载行为监控系统未能及时发现存储增长趋势关键提示DiskPressure不同于MemoryPressure它往往具有累积性特征。当警报触发时问题可能已经存在较长时间需要结合历史数据分析根本原因。2. 诊断流程与排查工具2.1 快速状态确认首先通过kubectl获取节点详细状态kubectl describe node node-name | grep -A 10 Conditions典型输出会包含类似信息Conditions: Type Status LastHeartbeatTime LastTransitionTime Reason Message ---- ------ ----------------- ------------------ ------ ------- DiskPressure True Thu, 08 Jun 2023 14:23:45 0800 Thu, 08 Jun 2023 12:18:32 0800 KubeletHasDiskPressure kubelet has disk pressure2.2 磁盘使用分析登录问题节点执行磁盘分析# 查看整体磁盘使用 df -hT # 定位大文件目录 du -h --max-depth1 / | sort -hr # Docker专用命令适用于overlay2存储驱动 docker system df -v2.3 Kubelet配置检查查看当前磁盘压力阈值配置ps -ef | grep kubelet | grep -E image-gc-high-threshold|image-gc-low-threshold默认情况下Kubelet会在以下条件触发DiskPressure根分区可用空间 10%镜像文件系统可用空间 15%3. 常见问题场景与解决方案3.1 容器日志占用过大问题特征/var/log/containers/ 目录体积异常增长单个日志文件超过100MB解决方案配置全局日志轮转推荐方案apiVersion: v1 kind: ConfigMap metadata: name: kubelet-config namespace: kube-system data: kubelet: | containerLogMaxSize: 100Mi containerLogMaxFiles: 3临时清理方案# 清理所有容器日志谨慎操作 truncate -s 0 /var/log/containers/*.log3.2 Docker镜像堆积问题特征/var/lib/docker/overlay2 占用超过80%空间docker images显示大量无用镜像解决方案设置自动垃圾回收# 修改kubelet启动参数 --eviction-hardmemory.available100Mi,nodefs.available10%,imagefs.available15% \ --image-gc-high-threshold85 \ --image-gc-low-threshold80手动清理命令# 删除悬空镜像 docker image prune -a -f # 按时间筛选删除旧镜像 docker images --format {{.ID}}\t{{.CreatedSince}} | grep weeks ago | awk {print $1} | xargs docker rmi3.3 临时文件未清理问题特征/tmp 或 /var/tmp 目录占用异常特定Pod的emptyDir卷体积过大解决方案为emptyDir设置大小限制volumes: - name: temp-vol emptyDir: sizeLimit: 500Mi创建定期清理任务# 添加cron任务每天凌晨清理 0 0 * * * find /tmp -type f -atime 7 -delete4. 高级处理技巧与预防措施4.1 动态扩容方案对于云环境节点可考虑自动化扩容方案AWS EBS自动扩容流程# 检查文件系统类型 lsblk -f # 扩展EBS卷后执行 growpart /dev/xvda 1 resize2fs /dev/xvda14.2 监控告警配置Prometheus示例告警规则- alert: NodeDiskPressure expr: kubelet_node_name{jobkubelet} and on(node) kube_node_status_condition{conditionDiskPressure,statustrue} 1 for: 10m labels: severity: critical annotations: summary: {{ $labels.node }} has disk pressure4.3 存储优化实践分离存储分区将/var/lib/docker挂载到独立磁盘为/var/log创建专用分区选择高效存储驱动# 检查当前存储驱动 docker info | grep Storage Driver # 推荐配置需在docker daemon.json中设置 { storage-driver: overlay2, storage-opts: [ overlay2.override_kernel_checktrue ] }5. 疑难问题排查实录5.1 已删除文件仍占用空间现象df显示磁盘已满但du统计结果远小于磁盘容量原因文件被删除但仍有进程持有文件句柄解决方案# 查找被删除但未释放的文件 lsof L1 | grep deleted # 重启持有文件的进程或服务 systemctl restart service-name5.2 Kubelet无法回收空间现象即使磁盘使用率低于阈值DiskPressure状态仍不解除解决方案手动触发kubelet状态更新systemctl restart kubelet检查kubelet日志获取详细原因journalctl -u kubelet -n 100 | grep -i pressure5.3 特定挂载点压力现象根分区空间充足但特定挂载点如/var/lib/kubelet触发压力解决方案# 查看所有文件系统inode使用情况 df -i # 如果inode耗尽查找小文件目录 find / -xdev -printf %h\n | sort | uniq -c | sort -k 1 -n6. 长效治理架构建议日志收集架构优化部署Fluentd或Filebeat将日志实时导出到ES集群对于高日志量业务建议使用Sidecar模式直接写入Kafka存储资源规划原则生产环境节点根分区建议不小于100GB每个工作节点预留30%的磁盘缓冲空间对StatefulSet使用PVC动态供给节点维护策略# 设置定期维护窗口自动排水 kubectl drain node-name --ignore-daemonsets --delete-emptydir-data在实际运维中我们发现90%的DiskPressure问题源于日志和镜像管理不当。建议将磁盘管理纳入CI/CD流程比如在流水线中增加镜像清理步骤在Helm chart中预设日志轮转配置。对于关键业务节点可以考虑部署local-volume-provisioner实现自动扩展。