Kubernetes 节点磁盘空间空了怎么办?解决 containerd overlay 100%问题
当 Kubernetes 集群中的节点出现如下错误:
bash
MountVolume.SetUp failed for volume xxx: no space left on device
或者执行 df -h
显示:
/dev/mapper/centos-root 50G 50G 0G 100% /
overlay 50G 50G 0G 100% /run/containerd/io.containerd.runtime...
这意味着 根分区 /
空间已满,containerd 依赖 overlayfs 已无法写入,导致 Pod 创建失败。
一、问题原因
- containerd 将所有容器 rootfs overlay 挂载到
/
分区 /var/lib/containerd
,/var/lib/kubelet
空间大量占用- /var/log 系统日志、Pod 输出日志积历
二、快速解决方案
清理 containerd 無用容器和镜像
bash
# 清理容器
ctr -n k8s.io containers ls
ctr -n k8s.io containers rm $(ctr -n k8s.io containers ls -q)
# 清理镜像
ctr -n k8s.io images ls
ctr -n k8s.io images rm $(ctr -n k8s.io images ls -q)
清除 kubelet 临时 pod 目录
bash
systemctl stop kubelet
rm -rf /var/lib/kubelet/pods/*
systemctl start kubelet
清除系统日志
bash
journalctl --vacuum-time=1d
find /var/log -type f -exec truncate -s 0 {} \;
三、持久解决方案:将 containerd & kubelet 数据目录移动到大盘 /home
步骤 1: 停止服务
bash
systemctl stop kubelet
systemctl stop containerd
步骤 2: 移动数据 + 设置软连接
bash
mv /var/lib/containerd /home/containerd_data
mv /var/lib/kubelet /home/kubelet_data
# 建立软连接
ln -s /home/containerd_data /var/lib/containerd
ln -s /home/kubelet_data /var/lib/kubelet
步骤 3: 重启服务
bash
systemctl start containerd
systemctl start kubelet
步骤 4: 确认解决
bash
df -h /
kubectl get nodes
四、建议配套
建议配合 cron 时间件定期清理
bash
cat > /usr/local/bin/clean-logs.sh <<EOF
#!/bin/bash
journalctl --rotate
journalctl --vacuum-time=1d
find /var/log -type f -exec truncate -s 0 {} \;
EOF
chmod +x /usr/local/bin/clean-logs.sh
echo "0 3 * * * root /usr/local/bin/clean-logs.sh" >> /etc/crontab
如果需要 containerd root
目录指定
toml
# /etc/containerd/config.toml
root = "/home/containerd_data"
state = "/home/containerd_state"
bash
systemctl daemon-reexec
systemctl restart containerd
如果需要修改 kubelet 启动参数(如使用 systemd):
编辑/etc/systemd/system/kubelet.service.d/10-kubeadm.conf
中加入:
bash
--root-dir=/home/kubelet_data
结论
问题 | 原因 | 解决方案 |
---|---|---|
节点 / 分区 100% |
containerd + kubelet + logs 占满 | 移动到 /home |
Pod 无法创建 | overlay rootfs 写入失败 | 重启服务释放空间 |
kubelet 出现 FailedMount | pod 目录无法 mkdir | 移目录 + 空间利用 |