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

相关推荐
陈陈CHENCHEN2 小时前
【Kubernetes】多集群管理实践 - kubeconfig
kubernetes
hwj运维之路2 小时前
超详细ubuntu22.04部署k8s1.28高可用(二)【结合ingress实现业务高可用】
运维·云原生·容器·kubernetes
切糕师学AI2 小时前
.NET Core Web 中的健康检查端点(Health Check Endpoint)
前端·kubernetes·.netcore
Cyber4K6 小时前
【Kubernetes专项】K8s 控制器 DaemonSet 从入门到企业实战应用
云原生·容器·kubernetes
切糕师学AI6 小时前
RKE(Rancher Kubernetes Engine) 是什么?
云原生·容器·kubernetes·rancher
龙飞058 小时前
Kubernetes 排障实战:PVC 一直 Pending 的原因与解决方案
运维·学习·云原生·容器·kubernetes
岁岁种桃花儿8 小时前
流量入口Nginx动态发现K8s Ingress Controller实操指南
nginx·架构·kubernetes
冗量8 小时前
Kubernetes (K8s) 基础知识、部署与运维指南
运维·容器·kubernetes
青衫客369 小时前
从 TLS 到 Kubernetes PKI:一条证书链如何支撑整个集群安全(问题合集)
容器·kubernetes·k8s·tls
塔克拉玛攻城狮1 天前
最新!银河麒麟v11 kubeadm部署k8s v1.35.0高可用集群
kubernetes·银河麒麟