前言
上班正摸鱼爽着呢,突然"叮、叮、叮......"钉钉报警群一直响个不停,如图所示

看报警信息服务器磁盘使用率超过80%,声明一下,我是一名测试开发工程师,运维离职,运维工作被迫接手,k8s自学了一段时间,但还是入门级选手,因此这里记录一下解决问题的过程。
解决过程
看报警弹框,知道是Prometheus
设置的报警信息,打开部署的prometheus
网址,查看一下EcsDiskUseRateHight
这个监控规则,点击status->rules,然后查找,如下图所示:

嗯,确实有这个监控规则,如下图所示:

这个查询表达式,乍一看还是挺蒙的,这里做个分解,
ini
(
max by(device, instance) (node_filesystem_size_bytes{device=~"/dev/.*",fstype!=""})
-
max by(device, instance) (node_filesystem_avail_bytes{device=~"/dev/.*",fstype!=""})
)
/
max by(device, instance) (node_filesystem_size_bytes{device=~"/dev/.*",fstype!=""})
* 100
>= 80
1. 关键指标
node_filesystem_size_bytes
:文件系统总大小(字节)node_filesystem_avail_bytes
:文件系统可用空间(字节)device=~"/dev/.*"
:筛选设备名以/dev/
开头的磁盘(如/dev/sda1
)fstype!=""
:排除无文件系统类型的挂载点(如tmpfs
)
2. 计算逻辑
计算已用空间: 总空间 - 可用空间
scss
```
max by(device, instance) (node_filesystem_size_bytes{...})
-
max by(device, instance) (node_filesystem_avail_bytes{...})
```
计算使用率百分比: (已用空间 / 总空间) * 100
scss
```
(已用空间) / max by(device, instance) (node_filesystem_size_bytes{...}) * 100
```
当结果 >= 80
时,表示磁盘使用率超过 80%,触发告警。
3. max by(device, instance)
的作用
- 按
device
(磁盘设备)和instance
(节点实例)分组,取每组的时间序列中的最大值(避免重复数据)。
如果想在节点上直接验证磁盘使用率,可以用以下命令:
bash
df -h | grep -E "^/dev"
排查磁盘占用情况
登录目标节点
bash
ssh <user>@<node-ip>
查看磁盘使用情况
bash
df -h # 查看整体磁盘占用
du -sh /var/lib/* | sort -rh # 检查大目录

重点关注:
/var/lib/docker
(Docker存储)/var/lib/containerd
(Containerd存储)/var/lib/kubelet
(Kubelet数据)/var/log
(日志文件)
清理磁盘空间
清理Docker/Containerd无用镜像和容器
Docker环境
bash
# 删除所有停止的容器
docker container prune -f
# 删除未被使用的镜像
docker image prune -a -f
# 删除所有无用数据(包括卷、网络等)
docker system prune -a -f
Containerd环境
bash
# 查看镜像
crictl images
# 查看所有镜像数量
crictl images |wc -l
# 删除无用镜像
crictl rmi <image-id>
# 批量删除容器未使用的镜像
crictl rmi --prune
# 清理所有停止的容器
crictl rm $(crictl ps -aq)
我这里使用crictl rmi --prune
清除所有未使用的镜像
清理日志文件
容器日志
K8s默认存储容器日志在/var/log/pods
和/var/log/containers
:
bash
# 查看日志占用情况
du -sh /var/log/pods/* | sort -rh
# 手动清理(建议先确认日志是否重要)
find /var/log/pods -type f -name "*.log" -mtime +7 -delete
系统日志
bash
journalctl --vacuum-time=7d # 清理7天前的日志
清理EmptyDir和HostPath卷
如果Pod使用EmptyDir
或HostPath
,可能残留数据:
bash
# 查找占用大的目录
find /var/lib/kubelet/pods -type d -exec du -sh {} + | sort -rh
# 手动清理(需确认是否可删除)
rm -rf /var/lib/kubelet/pods/<pod-id>/volumes/*/data
预防措施
配置日志轮转
在/etc/docker/daemon.json
(Docker)或/etc/containerd/config.toml
(Containerd)中配置日志限制:
json
{
"log-driver": "json-file",
"log-opts": {
"max-size": "100m",
"max-file": "3"
}
}
重启服务:
bash
systemctl restart docker # 或 containerd
定期监控节点
像我开头说的那样,配置Prometheus
监控,正因为有监控及时报警到钉钉群,我才及时去跟进解决问题,避免额外的损失。
最后
在Kubernetes集群中,节点磁盘占用率过高可能导致Pod被驱逐、调度失败,甚至影响整个集群的稳定性。我这次遇到的问题实际上就是长时间未清理容器未使用的镜像,清理之后,磁盘使用率立马降下来,从80%降到34%。