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

本文涉及的产品
容器镜像服务 ACR,镜像仓库100个 不限时长
简介: 当节点出现pod挂载不上,且查看节点日志(/var/log/message)发现不断有“Orphaned pod”字段的日志打印出来,如下: Jan 21 03:07:08 abc_k8s_worker01 kubelet: E0121 03:07:08.

问题描述:

如果一个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
相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
相关文章
|
18天前
|
运维 Kubernetes 监控
CKA备考攻略:掌握Pod日志收集,事半功倍的秘诀!
CKA备考攻略:掌握Pod日志收集,事半功倍的秘诀!
23 0
CKA备考攻略:掌握Pod日志收集,事半功倍的秘诀!
|
4月前
|
Kubernetes 监控 容器
k8s学习-CKA真题-监控Pod日志
k8s学习-CKA真题-监控Pod日志
78 0
|
6月前
|
Java 测试技术 Docker
Spring Boot 学习研究笔记(十九)-docker部署SpringBoot 日志目录挂载
Spring Boot 学习研究笔记(十九)-docker部署SpringBoot 日志目录挂载
260 0
|
11月前
|
Prometheus Kubernetes 监控
当 Pod 崩溃后如何在报警信息中获取对应的日志信息?
当 Pod 崩溃后如何在报警信息中获取对应的日志信息?
|
存储 弹性计算 Cloud Native
云原生-云应用挂载持久化存储卷NAS及通过NAS实现批量机器并发查找日志
云原生-云应用挂载持久化存储卷NAS及通过NAS实现批量机器并发查找日志
336 0
云原生-云应用挂载持久化存储卷NAS及通过NAS实现批量机器并发查找日志
|
消息中间件 编解码 JSON
|
存储 Kubernetes 监控
【最佳实践】K8s挂载PVC日志采集“轻量级”玩法
本文提供一种相对Sidecar部署更轻量级的采集方式,只需要部署少量的Logtail容器,即可采集不同业务容器的日志。
1638 0
【最佳实践】K8s挂载PVC日志采集“轻量级”玩法
|
监控 应用服务中间件 文件存储
使用Logtail采集Kubernetes上挂载的NAS日志
采集k8s挂载Nas后的日志 该文档主要介绍使用logtail以两种不同的方式进行k8s挂载Nas后的日志采集。两种采集方式的实现原理是一样的,都是通过将Logtail和业务容器挂载到相同的NAS上,使Logtail和业务容器的日志数据共享,以此实现日志采集。
4281 0
使用Logtail采集Kubernetes上挂载的NAS日志
|
监控 应用服务中间件 容器
如何通过Log-Pilot来采集Kubernetes Pod日志
本文主要跟大家分享下如何通过Log-Pilot来配置采集Kubernetes集群中Pod的日志。
7650 0
|
应用服务中间件 存储