Kubernetes节点磁盘占用率过高:排查与清理实战

前言

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

看报警信息服务器磁盘使用率超过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使用EmptyDirHostPath,可能残留数据:

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%。

相关推荐
moxiaoran57532 小时前
Kubernetes(k8s)学习笔记(二)--k8s 集群安装
笔记·学习·kubernetes
KubeSphere3 小时前
云原生周刊:KubeSphere 平滑升级
kubernetes
晨埃LUO定5 小时前
【k8s系列4】工具介绍
云原生·容器·kubernetes
云逸001~6 小时前
Kubeflow 快速入门实战(二) - Pipelines / Katib / KServer
云原生·kubernetes·大模型·llm·mlops·kubeflow·kserver
掉头发的王富贵6 小时前
从零开始玩转 Kubernetes:一站式入门指南,带你快速掌握 K8s的核心组件
后端·容器·kubernetes
Connie14516 小时前
K8s使用LIRA插件更新安全组交互流程
安全·容器·kubernetes
merge不墨迹6 小时前
Kubernetes 创建 Jenkins 实现 CICD 配置指南
kubernetes·jenkins
Ares-Wang7 小时前
kubernetes》》k8s》》Endpoint
java·容器·kubernetes
Lx35210 小时前
📌K8s生产环境排错之:那些暗黑操作
后端·kubernetes