挂载失败-日志中显示僵尸pod的问题

问题描述:

如果一个pod一直无法删除、创建不成功,且在pod所在节点查看日志文件: /var/log/messages 发现有下面的日志:

如何查看Pod所在节点?
# podname="nas-static-56b6c699d6-xq4xx"
# namespace="default"
# nodeIp=`kubectl describe pod $podname -n $namespace | grep Node: | awk -F'/' '{print $2}'`

登录节点并查看日志:
# ssh $nodeIp 
# tailf /var/log/messages
Dec 25 16:44:48 iZ2ze65lci9pegg2wr99g9Z kubelet: E1225 16:44:48.581657   21207 kubelet_volumes.go:140] Orphaned pod "06fa705f-0821-11e9-8cd4-00163e1071ed" found, but volume paths are still present on disk : There were a total of 2 errors similar to this. Turn up verbosity to see them.

问题解读:

Dec 25 16:44:48 iZ2ze65lci9pegg2wr99g9Z kubelet: E1225 16:44:48.581657   21207 kubelet_volumes.go:140] 
Orphaned pod "06fa705f-0821-11e9-8cd4-00163e1071ed" found, but volume paths are still present on disk : 
There were a total of 2 errors similar to this. Turn up verbosity to see them.

上面的错误日志表示:有2个Pod目前处于僵尸Pod状态,且最新一个podId为:06fa705f-0821-11e9-8cd4-00163e1071ed。只有处理完显示的podid后,才能显示下一个podid,所以我们需要先处理第一个pod,然后再查看/var/log/messages日志,拿到下一个有问题的podid。

问题原因:Pod 异常退出,导致数据卷挂载点在卸载过程中没有清理干净,最终导致Pod沦为僵尸Pod。Kubelet的GC流程对数据卷垃圾回收实现并不完善,目前需要手动或脚本自动化实现垃圾挂载点的清理工作。

解决此问题的核心为:删除报错pod的垃圾挂载点目录,但删除时确保不能误删数据。

解决办法1:

在问题节点上运行下面脚本:

# wget https://raw.githubusercontent.com/AliyunContainerService/kubernetes-issues-solution/master/kubelet/kubelet.sh
# sh kubelet.sh

解决办法2:

需要对每个Pod进行如下处理:

1.查看pod挂载点:

mount | grep 06fa705f-0821-11e9-8cd4-00163e1071ed

如果有挂载点存在,需要执行umount *(挂载点),卸载;

2.查看Pod数据卷目录的残余信息:

1) ls /var/lib/kubelet/pods/06fa705f-0821-11e9-8cd4-00163e1071ed/volumes/ 看数据卷目录下面还有什么挂载目录;
   例如:alicloud~disk  kubernetes.io~secret

2) 查看上面发现的目录下面子目录,删除子目录。例如:
   ls /var/lib/kubelet/pods/d9aec562-13fa-11ea-a9b7-00163e084110/volumes/alicloud~disk 
   下面包含:d-wz906mxhbe3qk051vmwv  d-wz9d6z27o4s3d4736opw;
   需要删除这两个文件夹,千万注意下面情况:
 
3)只能删除目录为空的文件夹。
   如果目录不为空,说明这个文件夹还在挂载某个存储设备,或者使用了本地存储并保存了数据;
   如果是挂载了外置设备,需要先umount挂载设备,然后删除目录;
   如果是使用了本地存储,需要先将保持的数据备份、转存后删除目录;

4)为了避免误删,请使用rmdir命令,而避免使用rm -rf;
   例如:rmdir /var/lib/kubelet/pods/06fa705f-0821-11e9-8cd4-00163e1071ed/volumes/alicloud~disk/d-wz906mxhbe3qk051vmwv
   rmdir命令,可以在当目录不为空时,删除失败,更大限度的保护数据;

该问题为kubelet处理数据卷时候导致的问题,目前社区正在讨论解决方案:

https://github.com/kubernetes/kubernetes/issues/60987
上一篇:SAP Sybase IQ按列存储介绍 - 1 按列存储


下一篇:云服务器ECS选型配置参考指南