本文永久链接: https://www.xtplayer.cn/longhorn/failure-to-delete-orphaned-pod-volume-directory/

适用版本

所有 Longhorn 版本。

Kubernetes v1.28 版本,向后移植的 PRv1.27正在等待合并。

症状

如果工作节点发生故障,在托管活动 Pod 时,随着节点停机并等待恢复,这些 Pod 会被正常驱逐。在此期间,负责管理节点的 kubelet 会每隔两秒生成如下错误消息。

orphaned pod <pod-uid> found, but error not a directory occurred when trying to remove the volumes dir

E0810 18:19:37.442065 4092 kubelet_volumes.go:245] "There were many similar errors. Turn up verbosity to see them." err="orphaned pod \"0561a2cc-48a6-4354-991c-3d6280beece7\" found, but error occurred when trying to remove the volumes dir: not a directory" numErrs=112

原因

当节点经历停机状态,然后需要一段时间才能进入恢复阶段时,就会出现这种情况。在此过程中,受影响的 Pod 会被驱逐并重新定位到其他节点。但是,由于中断,kubelet 和 longhorn-csi-plugin 之间的连接被切断。因此,kubelet在删除vol_data.json文件时遇到了困难。此进程用于执行自我管理任务,以清理与被逐出的 Pod 关联的孤立卷挂载点。kubelet 虽然能够删除目录,但无法删除单个文件,从而导致在这种特定情况下清理不完整。(源代码)

解决方案

一旦节点和 kubelet 恢复,longhorn-csi-plugin 将自动重启,允许 Pod 重新挂载卷并恢复其运行状态。

但是,如果 Pod 及其关联卷被重新调度到不同的节点,从而在vol_data.json崩溃的节点上留下延迟文件,则需要手动干预。您需要手动删除vol_data.json该目录中的文件/var/lib/kubelet/pods/<pod-uid>/volumes/kubernetes.io~csi/pvc_<pod-uid>/

在当前的 Kubernetes master 分支中,该问题已在 version 中得到解决1.28.x,从而确保孤立的 Pod 卷挂载点在协调循环中得到正确清理。此外,解决该问题的 PR 已向后移植到版本1.27,目前正在等待合并过程。

相关信息