RKE 创建 Pod 报错 no space left on device

RKE 创建 Pod 的时候,事件显示磁盘空间不足:

1
2025-10-23T14:33:28.367344576Z E1023 14:33:28.367304    3018 pod_workers.go:191] Error syncing pod 39982f3f-4435-47f0-bd9a-401eac35d8e5 ("logistics-api-678f476dc5-rw89k_prod-feiyuntms(39982f3f-4435-47f0-bd9a-401eac35d8e5)"), skipping: failed to "CreatePodSandbox" for "logistics-api-678f476dc5-rw89k_prod-feiyuntms(39982f3f-4435-47f0-bd9a-401eac35d8e5)" with CreatePodSandboxError: "CreatePodSandbox for pod \"logistics-api-678f476dc5-rw89k_prod-feiyuntms(39982f3f-4435-47f0-bd9a-401eac35d8e5)\" failed: rpc error: code = Unknown desc = failed to create a sandbox for pod \"logistics-api-678f476dc5-rw89k\": Error response from daemon: error creating overlay mount to /u/var/lib/docker/overlay2/62fae66c0cd56dd2fdd458c0d454ee14f1622da5231fcf361f21fa76b167e9bb-init/merged: no space left on device"

Docker 报错:

1
2
Oct 23 14:33:28 oser504254 dockerd[2462]: time="2025-10-23T14:33:28.363765012Z" level=error msg="error unmounting /u/var/lib/docker/overlay2/62fae66c0cd56dd2fdd458c0d454ee14f1622da5231fcf361f21fa76b167e9bb-init/merged: invalid argument" storage-driver=overlay2
Oct 23 14:33:28 oser504254 dockerd[2462]: time="2025-10-23T14:33:28.366808721Z" level=error msg="Handler for POST /v1.40/containers/create returned error: error creating overlay mount to /u/var/lib/docker/overlay2/62fae66c0cd56dd2fdd458c0d454ee14f1622da5231fcf361f21fa76b167e9bb-init/merged: no space left on device"

但在宿主机检查容器相关的数据目录,发现磁盘可用空间都是充足的。

问题根因

这是低版本 Docker 存在的已知问题,Docker 在处理挂载了宿主机根目录(或其它大范围目录)的容器时,会因为挂载传播(shared/rshared)导致挂载点在容器与宿主之间不断复制,形成挂载循环。这些重复的临时挂载没有被正确隔离或清理,最终让系统的挂载表被耗尽,引发 no space left on device 错误。

相关 Issue:

问题复现

  1. 节点安装 Docker,版本低于 24.0.0。

  2. 运行 Docker 容器,映射路径至容器中,需要确保 Docker 使用的 /var/lib/docker 目录被映射至容器中(如果 Docker 的 graph 路径不为 /var/lib/docker,需映射对应的 Docker graph 路径):

1
docker run --name busybox -d -v /var/lib:/var/lib harbor.warnerchen.com/library/busybox:latest sleep 3d
  1. 通过 docker cp 不断向容器拷贝文件:
1
2
3
4
5
mkdir -p /tmp/testfiles
for i in $(seq 1 100000); do
echo "This is file $i" > /tmp/testfiles/file_$i.txt
docker cp /tmp/testfiles/file_$i.txt busybox:/tmp/file_$i.txt
done
  1. 查看容器 /proc/self/mountinfo 挂载点数量,会持续增加:
1
docker exec busybox wc -l /proc/self/mountinfo
  1. 问题复现,具体报错为:
1
Error response from daemon: mount /var/lib:/var/lib/docker/overlay2/a0753cfeeb68f65c233b3329dda3be3bf96d74fa21070128a7cba104318c96e3/merged/var/lib, flags: 0x5000: no space left on device
  1. 删除临时目录:
1
rm -rf /tmp/testfiles
  1. 将 Docker 版本升级至 28.5.1。

  2. 再次进行测试,问题没有出现:

1
2
3
4
5
6
7
8
9
10
11
12
root@test-1:~# for i in $(seq 1 100000); do   echo "This is file $i" > /tmp/testfiles/file_$i.txt;   docker cp /tmp/testfiles/file_$i.txt busybox:/tmp/file_$i.txt; done
Successfully copied 2.05kB to busybox:/tmp/file_1.txt
Successfully copied 2.05kB to busybox:/tmp/file_2.txt
Successfully copied 2.05kB to busybox:/tmp/file_3.txt
Successfully copied 2.05kB to busybox:/tmp/file_4.txt
Successfully copied 2.05kB to busybox:/tmp/file_5.txt
Successfully copied 2.05kB to busybox:/tmp/file_6.txt
Successfully copied 2.05kB to busybox:/tmp/file_7.txt
Successfully copied 2.05kB to busybox:/tmp/file_8.txt
Successfully copied 2.05kB to busybox:/tmp/file_9.txt
Successfully copied 2.05kB to busybox:/tmp/file_10.txt
...

解决方案

  1. 重启 Docker。
  2. 找到 mountpoint 未释放的容器,将其重启。
  3. 升级 Docker 版本至 24 以上。
  4. 使用 Containerd Runtime。
Author

Warner Chen

Posted on

2025-10-30

Updated on

2025-10-30

Licensed under

You need to set install_url to use ShareThis. Please set it in _config.yml.
You forgot to set the business or currency_code for Paypal. Please set it in _config.yml.

Comments

You forgot to set the shortname for Disqus. Please set it in _config.yml.