K3s无法加载容器 overlayfs挂载失败所有系统Pod持续处于Pending状态
问题现象
- 执行
journalctl -u k3s查看K3s运行日志时,日志无限循环输出报错,核心报错内容如下:
"overlayfs" snapshotter cannot be enabled for "/var/lib/rancher/k3s/agent/containerd", try using "fuse-overlayfs" or "native": failed to mount overlay: no such device
- 日志同步循环输出关联异常提示:等待获取agent配置、服务未就绪、等待控制平面节点启动、对应节点不存在、
v1beta1.metrics.k8s.ioOpenAPI规范加载失败返回503服务不可用。 - 异常状态持续12天期间,无论等待多长时间,执行
kubectl get all -A查询集群资源均返回固定结果:kube-system命名空间下的helm-install-traefik-crd、helm-install-traefik、metrics-server、local-path-provisioner、coredns相关Pod全部处于Pending状态,对应Deployment、Job均无可用就绪副本。 - 已尝试的修复操作:在宿主机执行
pacman -S lxc containerd安装lxc与containerd组件,问题未解决。
问题根因
核心触发原因是当前K3s运行环境不支持内核级overlayfs挂载,K3s内置containerd默认配置的overlayfs快照器无法正常启动,直接导致容器运行时整体不可用。所有依赖容器运行时的集群控制逻辑、系统插件都无法完成调度启动,最终演变为日志循环报错、系统组件长期Pending的状态。
注意:宿主机独立安装lxc、containerd组件不会修复该问题,K3s默认使用自带的内置containerd运行时,不会复用宿主机独立部署的containerd服务配置。
修复步骤
按优先级依次尝试以下方案:
- 检查并加载内核overlay模块
先执行lsmod | grep overlay检查模块是否加载,如果命令无任何输出,说明内核未加载overlay模块:- 执行
modprobe overlay临时加载模块 - 编辑
/etc/modules-load.d/overlay.conf文件,写入overlay内容保存,配置模块开机自动加载 - 执行
systemctl restart k3s重启服务,验证问题是否修复
- 执行
- 切换快照器为fuse-overlayfs(适用于嵌套虚拟化、LXC容器、WSL2等不支持原生内核overlay的场景)
- 执行
pacman -S fuse-overlayfs安装用户态overlay依赖 - 编辑/创建K3s配置文件
/etc/rancher/k3s/config.yaml,写入以下配置:snapshotter: fuse-overlayfs - 执行
systemctl daemon-reload && systemctl restart k3s重载配置并重启服务
- 执行
- 临时降级使用native快照器(仅用于排查问题,不推荐生产环境长期使用,性能损耗较大)
如果fuse-overlayfs方案仍无法生效,可将上述配置文件中的snapshotter值改为native,保存后重启K3s服务即可。
修复验证
服务重启后等待1-2分钟,依次做以下检查:
- 执行
journalctl -u k3s -f查看实时日志,确认无overlay挂载相关报错 - 执行
kubectl get pods -A,确认kube-system命名空间下此前处于Pending状态的系统组件Pod逐步进入Running状态 - 所有Pod启动完成后,执行
kubectl get nodes确认集群节点状态为Ready
内容的提问来源于stack exchange,提问作者wviana
相关产品推荐
相关产品推荐

