挂载失败-日志中显示僵尸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日志并进行多维度分析。
相关文章
|
1月前
|
运维 Kubernetes 监控
CKA备考攻略:掌握Pod日志收集,事半功倍的秘诀!
CKA备考攻略:掌握Pod日志收集,事半功倍的秘诀!
67 0
CKA备考攻略:掌握Pod日志收集,事半功倍的秘诀!
|
1月前
|
Kubernetes Perl 容器
K8s查看集群 状态事件描述以及Pod日志信息
K8s查看集群 状态事件描述以及Pod日志信息
75 3
|
1月前
|
Kubernetes 监控 容器
k8s学习-CKA真题-监控Pod日志
k8s学习-CKA真题-监控Pod日志
82 0
|
8月前
|
Java 测试技术 Docker
Spring Boot 学习研究笔记(十九)-docker部署SpringBoot 日志目录挂载
Spring Boot 学习研究笔记(十九)-docker部署SpringBoot 日志目录挂载
318 0
|
1月前
|
Kubernetes Perl 容器
【CKA模拟题】过滤Pod错误日志
【CKA模拟题】过滤Pod错误日志
21 1
|
1月前
|
Kubernetes 监控 Shell
【CKA模拟题】如何优雅地融合Pod日志与ConfigMap
【CKA模拟题】如何优雅地融合Pod日志与ConfigMap
33 0
|
1月前
|
Kubernetes Perl 容器
【CKA模拟题】掌握Pod日志输出的秘密
【CKA模拟题】掌握Pod日志输出的秘密
21 0
|
11月前
|
Linux Shell Docker
chatgpt Linux 定时任务 清理rancher pod启动服务的日志文件 脚本
chatgpt Linux 定时任务 清理rancher pod启动服务的日志文件 脚本
|
Prometheus Kubernetes 监控
当 Pod 崩溃后如何在报警信息中获取对应的日志信息?
当 Pod 崩溃后如何在报警信息中获取对应的日志信息?
|
存储 弹性计算 Cloud Native
云原生-云应用挂载持久化存储卷NAS及通过NAS实现批量机器并发查找日志
云原生-云应用挂载持久化存储卷NAS及通过NAS实现批量机器并发查找日志
355 0
云原生-云应用挂载持久化存储卷NAS及通过NAS实现批量机器并发查找日志