问题描述:
如果一个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