Kubernetes 节点磁盘空间空了怎么办?解决 containerd overlay 100%问题

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 创建失败。


一、问题原因

  1. containerd 将所有容器 rootfs overlay 挂载到 / 分区
  2. /var/lib/containerd, /var/lib/kubelet 空间大量占用
  3. /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 移目录 + 空间利用

相关推荐
墨香幽梦客1 小时前
Kubernetes+Istio实现CRM系统弹性伸缩:服务网格下的流量治理与熔断策略
容器·kubernetes·istio
新时代牛马1 小时前
单机 docker run 管不住了?从编排需求、期望状态到调度/自愈闭环讲透
运维·docker·容器
binqian1 小时前
Docker Desktop(WSL2 后端)三层网络互通技术文档
网络·docker·容器
闲云野鹤在人间2 小时前
Docker入门|第1章 容器生态系统完整解析
运维·服务器·docker·容器·centos
2601_962218473 小时前
万象生鲜系统协议价底层架构实现生鲜企业报价业务数字化管理
大数据·运维·微服务·云原生·架构
KIDULT°4 小时前
Docker 从 0 入门|吃透容器生态、架构与 Dockerfile 实战
docker·容器·架构
putItInYourHand5 小时前
Docker Compose 部署 Mosquitto MQTT Broker 完整实战指南
运维·docker·容器
生活爱好者!14 小时前
哇!影视新玩法!docker部署NEOWATCH NAS
运维·docker·容器
cpolar技术支持17 小时前
Docker 容器启动失败怎么查?端口、日志、权限与网络排障完整教程
linux·docker·容器·cpolar·网络排障
Lsetea19 小时前
Kubernetes 1.37 Pod证书怎么签发:Signer与mTLS信任链排查
云原生·kubernetes·ssl证书·tls·mtls