k8s集群中有几个pod的状态不正常,查看对应node机器上系统启动日志有reboot记录,kubelet启动失败,原因是docker没有正常启动,查看docker启动日志,看到如下报错:
failed to mount overlay: no such device storage-driver=overlay2
storage driver overlay2 failed: driver not supported
看着像是存储这块有问题,查看docker配置文件,磁盘都正常,查看overlay驱动加载发现这台机器上overlay驱动不存在了,和正常node对比下,最后定位到ecs机器底层有操作,重启后内核版本发生变化,导致overlay驱动丢失。
排查步骤参考:
检查内核模块: 确保 overlay2 存储驱动程序所需的内核模块已加载。
使用
lsmod | grep overlay
命令查看已加载的模块。使用
modinfo overlay
命令查看 overlay 模块的信息,确认模块文件是否存在。如果没有加载,则需要手动加载模块:
modprobe overlay
。检查设备: 确保 Docker 能够访问 overlay2 存储驱动程序所需的设备。
使用
dmesg
命令查看系统日志,以查找有关设备错误的信息。检查设备是否已正确挂载,并确保 Docker 进程具有访问权限。
检查磁盘空间: 确保 Docker 有足够的磁盘空间来创建 overlay2 存储驱动程序。
使用
df -h
命令查看磁盘空间使用情况。确保
/var/lib/docker
目录有足够的可用空间。检查权限: 确保 Docker 进程具有足够的权限访问 overlay2 存储驱动程序所需的设备。
确保当前用户具有加载内核模块的权限。
使用
sudo modprobe overlay
命令以管理员权限加载模块。检查
/lib/modules/<内核版本>/modules.builtin.bin
文件的权限,确保 Docker 进程具有读取权限。使用
id -u
和id -g
命令查看 Docker 进程的 UID 和 GID。确保 Docker 进程具有访问
/var/lib/docker
目录的权限。检查内核版本: 确保 Docker 进程具有足够的权限访问 overlay2 存储驱动程序所需的设备。
确保 overlay 模块与当前内核版本兼容。
使用
uname -r
命令查看当前内核版本。如果内核版本过旧,则需要更新内核。
检查配置文件: 确保 Docker 配置文件
/etc/docker/daemon.json
中的storage-driver
设置为overlay2
。如果配置文件不存在,则创建一个新的配置文件,并添加以下内容:
{
"storage-driver": "overlay2"
}重启 Docker 服务: 重新启动 Docker 服务,以使更改生效。
使用
systemctl restart docker
命令重启 Docker 服务。尝试其他存储驱动程序: 如果以上方法都无法解决问题,可以尝试使用其他存储驱动程序,例如
devicemapper
或aufs
。在 Docker 配置文件中将
storage-driver
设置为其他驱动程序,并重新启动 Docker 服务。更新 Docker 版本: 尝试更新 Docker 版本,以修复潜在的 bug。
使用
docker version
命令查看当前 Docker 版本。访问 Docker 官方网站下载并安装最新版本的 Docker。
检查系统日志: 检查系统日志,以查找有关 Docker 启动失败的更多信息。
使用
uptime,last -x
查看系统是否重启日志。使用
journalctl -b --list-boots
命令查看系统启动日志。使用
journalctl -u docker
命令查看 Docker 日志。去 /var/log/ 目录上查找相关系统报错日志信息。
参考:
谢谢分享