一、问题背景
大家有时候会在环境中碰到一个问题,就是在某一个时间段,docker或者containerd目录挂载的磁盘使用率会飙升(例如挂载的目录是/home/deployer/containerd),触发告警,飙升完之后又自动落回,由于时间范围比较固定,疑似某服务或主机设置定时任务导致,但是排查完之后,并没有发现这个时间段内有定时任务,如此一来,就需要我们自己通过某些手段查找是该磁盘下的具体哪个目录导致的。
二、问题原因
通过脚本抓取到了/home/deployer/containerd/io.containerd.snapshotter.v1.overlayfs/snapshots/目录下的某个数字目录变化导致的磁盘使用率增长回落,这里存储的是OverlayFS,每个数字目录都对应该主机上的pod:
OverlayFS,也被称为 联合文件系统 或 联合挂载,它可让你使用2个目录挂载文件系统:“下层”目录(只读层)和“上层”目录(可写层)。
基本上:
文件系统的下层目录是只读的,
文件系统的上层目录可以读写
当进程“读取”文件时,OverlayFS 文件系统驱动将在上层目录中查找并从该目录中读取文件(如果存在)。否则,它将在下层目录中查找。
当进程“写入”文件时,OverlayFS 会将其写入上层目录,也就是可写层。
具体可参考链接:Docker原理之 - OverlayFS设计与实现-腾讯云开发者社区-腾讯云 <OverlayFS设计与实现>
三、解决方案
3.1 脚本抓取增涨目录
根据自身环境进行调试:
#!/bin/bash
directory="/home/deployer" # 替换为您要监视的目录路径
while true; do
current_time=$(date +"%Y-%m-%d %H:%M:%S")
echo "当前时间:$current_time"
echo "/home/deployer:"
du -sh "$directory" --max-depth=1 # 显示目录占用空间
echo "/home/deployer/containerd:"
du -sh "$directory"/containerd --max-depth=1 | sort -hr | head # 显示目录占用空间
sleep 5 # 等待5秒
done
nohup {脚本} & #后台运行,输出记录到当前目录下的文件nohup.out中
根据日志nohup.out发现此目录下的某个数字目录会在凌晨磁盘使用变化较大,可以确认是这个目录的变化导致的告警。
3.2 确认podID
根据脚本抓到是/home/deployer/containerd/io.containerd.snapshotter.v1.overlayfs/snapshots/目录下的某个数字目录名
mount|grep containerd.snapshotter.v1.overlayfs | grep {目录名}
下图高亮为container ID:
3.3 确认服务容器
ctr -n k8s.io c list | grep [podID] #会列出当前主机所有容器id和使用镜像
找到对应服务,我们就可以分析具体是什么原因导致的。看看是否是服务日志切割过大导致的,可以适当的优化切割参数。