rke2 /run 目录报 no space left on device
本文永久链接: https://www.xtplayer.cn/rke2/rke2-run-dir-no-space-left-on-device/
当 containerd 作为 runtime 时,容器运行的相关文件( merger 层等)都保存在 /run/k3s/containerd/ 目录。rke2-containerd 默认配置下 containerd state 目录为/run/k3s/containerd,可以通过在主机上执行 cat /var/lib/rancher/rke2/agent/etc/containerd/config.toml 查看 rke2-containerd 配置。当容器镜像越大、容器产生临时文件越多,就会导致 /run/k3s/containerd/io.containerd.runtime.v2.task/k8s.io 下的子目录使用越来越大,最终导致 /run 目录被耗尽。具体请参考 issue https://github.com/k3s-io/k3s/issues/4327 的说明。
处理方法:
可以尝试将 /run/k3s/containerd 目录挂载到一个独立分区上,或者根据以下方法去自定义 containerd state 目录。
根据文档 https://docs.rke2.io/advanced#configuring-containerd 的说明,可通过自定义 containerd 配置文件模版去自定义 containerd state 目录。
1,在主机上执行 cat /var/lib/rancher/rke2/agent/etc/containerd/config.toml | grep version,可以确认当前运行的 containerd 是 v2 还是 v3 版本。
2,对于 v3,创建模版文件 touch /var/lib/rancher/rke2/agent/etc/containerd/config-v3.toml.tmpl 。对于 v2,创建模版文件 touch /var/lib/rancher/rke2/agent/etc/containerd/config.toml.tmpl 。
3,拷贝 https://github.com/k3s-io/k3s/blob/b8f6f958c892cf6fa57a1c09882b1148c6a5e68d/pkg/agent/templates/templates.go#L49 v2 版本对应的模版内容到对应的模版文件。拷贝 https://github.com/k3s-io/k3s/blob/main/pkg/agent/templates/templates.go#L158 v3 版本模板内容到对应的模版文件。
4,修改模板文件中的 state = {{ printf "%q" .NodeConfig.Containerd.State }}
为 state = "/var/lib/rancher/containerd" ,或者其他路径。
5,重启 rke2-server 或者 rke2-agent
如果要按以上方法调整,请先做好集群数据备份。

