本文永久链接: https://www.xtplayer.cn/kubernetes/kubernetes-secret-device-or-resource-busy/

如上图,有时候升级业务 Pod 时,旧业务 Pod 一直处于 removing 状态。在主机上执行 docker ps -a | grep <pod 名称> 也未能查询到残留容器。登录 Pod 所在的主机,执行 docker logs kubelet --tail 100 查看 kubelet 的运行日志,可以看到以下错误日志:

Error: "UnmountVolume.TearDown failed for volume \"default-token-r9sxw\"
(UniqueName: \"kubernetes.io/secret/bc895c3f-2fbf-11eb-a93a-4cd98f444b4d-default-token-r9sxw\") pod \"bc895c3f-2fbf-11eb-a93a-4cd98f444b4d\" (UID: \"bc895c3f-2fbf-11eb-a93a-4cd98f444b4d\") :
remove /var/lib/kubelet/pods/bc895c3f-2fbf-11eb-a93a-4cd98f444b4d/volumes/kubernetes.io~secret/default-token-r9sxw: device or resource busy"

处理方法

  1. 指定占用的路径

    path=/var/lib/kubelet/pods/bc895c3f-2fbf-11eb-a93a-4cd98f444b4d/volumes/kubernetes.io~secret/default-token-r9sxw
  2. 查找占用路径的进程 pid 号。

    通过以下命令可以查询到占用上面路径的 pid 号。

    find /proc/*/mounts -exec grep ${path} {} +

    应该会得到类似以下的结果,/proc/ 与 /mounts 中间则为进程 pid 号。

    /proc/9706/mounts /var/lib/kubelet/pods/bc895c3f-2fbf-11eb-a93a-4cd98f444b4d/volumes/kubernetes.io~secret/default-token-r9sxw
  3. 根据上一步中查询到的 pid 号,接着执行以下命令查看具体是什么进程占用

    ps -ef | grep <pid 号>